Skip to content

Commit 66da596

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 5f49cd4 commit 66da596

File tree

1 file changed

+42
-8
lines changed

1 file changed

+42
-8
lines changed

cmd/bpf2go/main.go

Lines changed: 42 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@ import (
77
"flag"
88
"fmt"
99
"io"
10+
"log/slog"
1011
"os"
1112
"os/exec"
1213
"path/filepath"
1314
"regexp"
1415
"slices"
1516
"sort"
17+
"strconv"
1618
"strings"
1719

1820
"github.com/cilium/ebpf"
@@ -57,7 +59,9 @@ func run(stdout io.Writer, args []string) (err error) {
5759
}
5860

5961
type bpf2go struct {
60-
stdout io.Writer
62+
stdout io.Writer
63+
log *slog.Logger
64+
verbose bool
6165
// Absolute path to a .c file.
6266
sourceFile string
6367
// Absolute path to a directory where .go are written
@@ -89,12 +93,20 @@ type bpf2go struct {
8993
makeBase string
9094
}
9195

96+
func (b2g *bpf2go) Debug(msg string, args ...any) {
97+
if b2g.log == nil {
98+
return
99+
}
100+
b2g.log.Debug(msg, args...)
101+
}
102+
92103
func newB2G(stdout io.Writer, args []string) (*bpf2go, error) {
93104
b2g := &bpf2go{
94105
stdout: stdout,
95106
}
96107

97108
fs := flag.NewFlagSet("bpf2go", flag.ContinueOnError)
109+
fs.BoolVar(&b2g.verbose, "verbose", getBool("V", false), "Enable verbose logging")
98110
fs.StringVar(&b2g.cc, "cc", getEnv("BPF2GO_CC", "clang"),
99111
"`binary` used to compile C to BPF ($BPF2GO_CC)")
100112
fs.StringVar(&b2g.strip, "strip", getEnv("BPF2GO_STRIP", ""),
@@ -117,6 +129,7 @@ func newB2G(stdout io.Writer, args []string) (*bpf2go, error) {
117129
"suffix in generated file names such as _test (default based on $GOFILE)")
118130
outDir := fs.String("output-dir", "", "target directory of generated files (defaults to current directory)")
119131
outPkg := fs.String("go-package", "", "package for output go file (default as ENV GOPACKAGE)")
132+
120133
fs.SetOutput(b2g.stdout)
121134
fs.Usage = func() {
122135
fmt.Fprintf(fs.Output(), helpText, fs.Name())
@@ -128,6 +141,12 @@ func newB2G(stdout io.Writer, args []string) (*bpf2go, error) {
128141
return nil, err
129142
}
130143

144+
level := slog.LevelInfo
145+
if b2g.verbose {
146+
level = slog.LevelDebug
147+
}
148+
b2g.log = slog.New(slog.NewTextHandler(stdout, &slog.HandlerOptions{Level: level}))
149+
131150
if *outDir == "" {
132151
var err error
133152
if *outDir, err = os.Getwd(); err != nil {
@@ -273,6 +292,20 @@ func getEnv(key, defaultVal string) string {
273292
return defaultVal
274293
}
275294

295+
func getBool(key string, defaultVal bool) bool {
296+
val, ok := os.LookupEnv(key)
297+
if !ok {
298+
return defaultVal
299+
}
300+
301+
b, err := strconv.ParseBool(val)
302+
if err != nil {
303+
return defaultVal
304+
}
305+
306+
return b
307+
}
308+
276309
func (b2g *bpf2go) convertAll() (err error) {
277310
if _, err := os.Stat(b2g.sourceFile); os.IsNotExist(err) {
278311
return fmt.Errorf("file %s doesn't exist", b2g.sourceFile)
@@ -365,10 +398,10 @@ func (b2g *bpf2go) convert(tgt gen.Target, goarches gen.GoArches) (err error) {
365398
return fmt.Errorf("compile: %w", err)
366399
}
367400

368-
fmt.Fprintln(b2g.stdout, "Compiled", objFileName)
369-
370-
if !b2g.disableStripping {
371-
fmt.Fprintln(b2g.stdout, "Stripped", objFileName)
401+
if b2g.disableStripping {
402+
b2g.Debug("Compiled object", "file", objFileName)
403+
} else {
404+
b2g.Debug("Compiled and stripped object", "file", objFileName)
372405
}
373406

374407
spec, err := ebpf.LoadCollectionSpec(objFileName)
@@ -426,7 +459,7 @@ func (b2g *bpf2go) convert(tgt gen.Target, goarches gen.GoArches) (err error) {
426459
return fmt.Errorf("can't write %s: %s", goFileName, err)
427460
}
428461

429-
fmt.Fprintln(b2g.stdout, "Wrote", goFileName)
462+
b2g.Debug("Generated bpf2go binding", "file", goFileName)
430463

431464
if b2g.makeBase == "" {
432465
return
@@ -450,7 +483,8 @@ func (b2g *bpf2go) convert(tgt gen.Target, goarches gen.GoArches) (err error) {
450483
return fmt.Errorf("can't adjust dependency information: %s", err)
451484
}
452485

453-
fmt.Fprintln(b2g.stdout, "Wrote", depFileName)
486+
b2g.Debug("Wrote dependency", "file", depFileName)
487+
454488
return nil
455489
}
456490

@@ -474,7 +508,7 @@ func (b2g *bpf2go) removeOldOutputFiles(outputStem string, tgt gen.Target) error
474508
return err
475509
}
476510

477-
fmt.Fprintln(b2g.stdout, "Removed obsolete", filename)
511+
b2g.Debug("Removed obsolete output file", "file", filename)
478512
}
479513

480514
return nil

0 commit comments

Comments
 (0)