Skip to content

Commit ca725b9

Browse files
committed
cmd/bpf2go: add -verbose flag, log output with slog
The verbose flag defaults to the 'V=' environment variable used by Make, so e.g. running `make V=1` will turn on verbosity for bpf2go builds. Signed-off-by: Timo Beckers <[email protected]>
1 parent 8e6aa3d commit ca725b9

File tree

1 file changed

+42
-8
lines changed

1 file changed

+42
-8
lines changed

cmd/bpf2go/main.go

+42-8
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@ import (
55
"flag"
66
"fmt"
77
"io"
8+
"log/slog"
89
"os"
910
"os/exec"
1011
"path/filepath"
1112
"regexp"
1213
"slices"
1314
"sort"
15+
"strconv"
1416
"strings"
1517

1618
"github.com/cilium/ebpf"
@@ -55,7 +57,9 @@ func run(stdout io.Writer, args []string) (err error) {
5557
}
5658

5759
type bpf2go struct {
58-
stdout io.Writer
60+
stdout io.Writer
61+
log *slog.Logger
62+
verbose bool
5963
// Absolute path to a .c file.
6064
sourceFile string
6165
// Absolute path to a directory where .go are written
@@ -85,12 +89,20 @@ type bpf2go struct {
8589
makeBase string
8690
}
8791

92+
func (b2g *bpf2go) Debug(msg string, args ...any) {
93+
if b2g.log == nil {
94+
return
95+
}
96+
b2g.log.Debug(msg, args...)
97+
}
98+
8899
func newB2G(stdout io.Writer, args []string) (*bpf2go, error) {
89100
b2g := &bpf2go{
90101
stdout: stdout,
91102
}
92103

93104
fs := flag.NewFlagSet("bpf2go", flag.ContinueOnError)
105+
fs.BoolVar(&b2g.verbose, "verbose", getBool("V", false), "Enable verbose logging")
94106
fs.StringVar(&b2g.cc, "cc", getEnv("BPF2GO_CC", "clang"),
95107
"`binary` used to compile C to BPF ($BPF2GO_CC)")
96108
fs.StringVar(&b2g.strip, "strip", getEnv("BPF2GO_STRIP", ""),
@@ -107,6 +119,7 @@ func newB2G(stdout io.Writer, args []string) (*bpf2go, error) {
107119
fs.StringVar(&b2g.outputStem, "output-stem", "", "alternative stem for names of generated files (defaults to ident)")
108120
outDir := fs.String("output-dir", "", "target directory of generated files (defaults to current directory)")
109121
outPkg := fs.String("go-package", "", "package for output go file (default as ENV GOPACKAGE)")
122+
110123
fs.SetOutput(b2g.stdout)
111124
fs.Usage = func() {
112125
fmt.Fprintf(fs.Output(), helpText, fs.Name())
@@ -118,6 +131,12 @@ func newB2G(stdout io.Writer, args []string) (*bpf2go, error) {
118131
return nil, err
119132
}
120133

134+
level := slog.LevelInfo
135+
if b2g.verbose {
136+
level = slog.LevelDebug
137+
}
138+
b2g.log = slog.New(slog.NewTextHandler(stdout, &slog.HandlerOptions{Level: level}))
139+
121140
if *outDir == "" {
122141
var err error
123142
if *outDir, err = os.Getwd(); err != nil {
@@ -259,6 +278,20 @@ func getEnv(key, defaultVal string) string {
259278
return defaultVal
260279
}
261280

281+
func getBool(key string, defaultVal bool) bool {
282+
val, ok := os.LookupEnv(key)
283+
if !ok {
284+
return defaultVal
285+
}
286+
287+
b, err := strconv.ParseBool(val)
288+
if err != nil {
289+
return defaultVal
290+
}
291+
292+
return b
293+
}
294+
262295
func (b2g *bpf2go) convertAll() (err error) {
263296
if _, err := os.Stat(b2g.sourceFile); os.IsNotExist(err) {
264297
return fmt.Errorf("file %s doesn't exist", b2g.sourceFile)
@@ -351,10 +384,10 @@ func (b2g *bpf2go) convert(tgt gen.Target, goarches gen.GoArches) (err error) {
351384
return fmt.Errorf("compile: %w", err)
352385
}
353386

354-
fmt.Fprintln(b2g.stdout, "Compiled", objFileName)
355-
356-
if !b2g.disableStripping {
357-
fmt.Fprintln(b2g.stdout, "Stripped", objFileName)
387+
if b2g.disableStripping {
388+
b2g.Debug("Compiled object", "file", objFileName)
389+
} else {
390+
b2g.Debug("Compiled and stripped object", "file", objFileName)
358391
}
359392

360393
spec, err := ebpf.LoadCollectionSpec(objFileName)
@@ -412,7 +445,7 @@ func (b2g *bpf2go) convert(tgt gen.Target, goarches gen.GoArches) (err error) {
412445
return fmt.Errorf("can't write %s: %s", goFileName, err)
413446
}
414447

415-
fmt.Fprintln(b2g.stdout, "Wrote", goFileName)
448+
b2g.Debug("Generated bpf2go binding", "file", goFileName)
416449

417450
if b2g.makeBase == "" {
418451
return
@@ -436,7 +469,8 @@ func (b2g *bpf2go) convert(tgt gen.Target, goarches gen.GoArches) (err error) {
436469
return fmt.Errorf("can't adjust dependency information: %s", err)
437470
}
438471

439-
fmt.Fprintln(b2g.stdout, "Wrote", depFileName)
472+
b2g.Debug("Wrote dependency", "file", depFileName)
473+
440474
return nil
441475
}
442476

@@ -460,7 +494,7 @@ func (b2g *bpf2go) removeOldOutputFiles(outputStem string, tgt gen.Target) error
460494
return err
461495
}
462496

463-
fmt.Fprintln(b2g.stdout, "Removed obsolete", filename)
497+
b2g.Debug("Removed obsolete output file", "file", filename)
464498
}
465499

466500
return nil

0 commit comments

Comments
 (0)