@@ -7,12 +7,14 @@ import (
7
7
"flag"
8
8
"fmt"
9
9
"io"
10
+ "log/slog"
10
11
"os"
11
12
"os/exec"
12
13
"path/filepath"
13
14
"regexp"
14
15
"slices"
15
16
"sort"
17
+ "strconv"
16
18
"strings"
17
19
18
20
"github.com/cilium/ebpf"
@@ -57,7 +59,9 @@ func run(stdout io.Writer, args []string) (err error) {
57
59
}
58
60
59
61
type bpf2go struct {
60
- stdout io.Writer
62
+ stdout io.Writer
63
+ log * slog.Logger
64
+ verbose bool
61
65
// Absolute path to a .c file.
62
66
sourceFile string
63
67
// Absolute path to a directory where .go are written
@@ -89,12 +93,20 @@ type bpf2go struct {
89
93
makeBase string
90
94
}
91
95
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
+
92
103
func newB2G (stdout io.Writer , args []string ) (* bpf2go , error ) {
93
104
b2g := & bpf2go {
94
105
stdout : stdout ,
95
106
}
96
107
97
108
fs := flag .NewFlagSet ("bpf2go" , flag .ContinueOnError )
109
+ fs .BoolVar (& b2g .verbose , "verbose" , getBool ("V" , false ), "Enable verbose logging" )
98
110
fs .StringVar (& b2g .cc , "cc" , getEnv ("BPF2GO_CC" , "clang" ),
99
111
"`binary` used to compile C to BPF ($BPF2GO_CC)" )
100
112
fs .StringVar (& b2g .strip , "strip" , getEnv ("BPF2GO_STRIP" , "" ),
@@ -117,6 +129,7 @@ func newB2G(stdout io.Writer, args []string) (*bpf2go, error) {
117
129
"suffix in generated file names such as _test (default based on $GOFILE)" )
118
130
outDir := fs .String ("output-dir" , "" , "target directory of generated files (defaults to current directory)" )
119
131
outPkg := fs .String ("go-package" , "" , "package for output go file (default as ENV GOPACKAGE)" )
132
+
120
133
fs .SetOutput (b2g .stdout )
121
134
fs .Usage = func () {
122
135
fmt .Fprintf (fs .Output (), helpText , fs .Name ())
@@ -128,6 +141,12 @@ func newB2G(stdout io.Writer, args []string) (*bpf2go, error) {
128
141
return nil , err
129
142
}
130
143
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
+
131
150
if * outDir == "" {
132
151
var err error
133
152
if * outDir , err = os .Getwd (); err != nil {
@@ -273,6 +292,20 @@ func getEnv(key, defaultVal string) string {
273
292
return defaultVal
274
293
}
275
294
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
+
276
309
func (b2g * bpf2go ) convertAll () (err error ) {
277
310
if _ , err := os .Stat (b2g .sourceFile ); os .IsNotExist (err ) {
278
311
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) {
365
398
return fmt .Errorf ("compile: %w" , err )
366
399
}
367
400
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 )
372
405
}
373
406
374
407
spec , err := ebpf .LoadCollectionSpec (objFileName )
@@ -426,7 +459,7 @@ func (b2g *bpf2go) convert(tgt gen.Target, goarches gen.GoArches) (err error) {
426
459
return fmt .Errorf ("can't write %s: %s" , goFileName , err )
427
460
}
428
461
429
- fmt . Fprintln ( b2g .stdout , "Wrote " , goFileName )
462
+ b2g .Debug ( "Generated bpf2go binding" , "file " , goFileName )
430
463
431
464
if b2g .makeBase == "" {
432
465
return
@@ -450,7 +483,8 @@ func (b2g *bpf2go) convert(tgt gen.Target, goarches gen.GoArches) (err error) {
450
483
return fmt .Errorf ("can't adjust dependency information: %s" , err )
451
484
}
452
485
453
- fmt .Fprintln (b2g .stdout , "Wrote" , depFileName )
486
+ b2g .Debug ("Wrote dependency" , "file" , depFileName )
487
+
454
488
return nil
455
489
}
456
490
@@ -474,7 +508,7 @@ func (b2g *bpf2go) removeOldOutputFiles(outputStem string, tgt gen.Target) error
474
508
return err
475
509
}
476
510
477
- fmt . Fprintln ( b2g .stdout , "Removed obsolete" , filename )
511
+ b2g .Debug ( "Removed obsolete output file" , "file " , filename )
478
512
}
479
513
480
514
return nil
0 commit comments