@@ -5,12 +5,14 @@ import (
5
5
"flag"
6
6
"fmt"
7
7
"io"
8
+ "log/slog"
8
9
"os"
9
10
"os/exec"
10
11
"path/filepath"
11
12
"regexp"
12
13
"slices"
13
14
"sort"
15
+ "strconv"
14
16
"strings"
15
17
16
18
"github.com/cilium/ebpf"
@@ -55,7 +57,9 @@ func run(stdout io.Writer, args []string) (err error) {
55
57
}
56
58
57
59
type bpf2go struct {
58
- stdout io.Writer
60
+ stdout io.Writer
61
+ log * slog.Logger
62
+ verbose bool
59
63
// Absolute path to a .c file.
60
64
sourceFile string
61
65
// Absolute path to a directory where .go are written
@@ -85,12 +89,20 @@ type bpf2go struct {
85
89
makeBase string
86
90
}
87
91
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
+
88
99
func newB2G (stdout io.Writer , args []string ) (* bpf2go , error ) {
89
100
b2g := & bpf2go {
90
101
stdout : stdout ,
91
102
}
92
103
93
104
fs := flag .NewFlagSet ("bpf2go" , flag .ContinueOnError )
105
+ fs .BoolVar (& b2g .verbose , "verbose" , getBool ("V" , false ), "Enable verbose logging" )
94
106
fs .StringVar (& b2g .cc , "cc" , getEnv ("BPF2GO_CC" , "clang" ),
95
107
"`binary` used to compile C to BPF ($BPF2GO_CC)" )
96
108
fs .StringVar (& b2g .strip , "strip" , getEnv ("BPF2GO_STRIP" , "" ),
@@ -107,6 +119,7 @@ func newB2G(stdout io.Writer, args []string) (*bpf2go, error) {
107
119
fs .StringVar (& b2g .outputStem , "output-stem" , "" , "alternative stem for names of generated files (defaults to ident)" )
108
120
outDir := fs .String ("output-dir" , "" , "target directory of generated files (defaults to current directory)" )
109
121
outPkg := fs .String ("go-package" , "" , "package for output go file (default as ENV GOPACKAGE)" )
122
+
110
123
fs .SetOutput (b2g .stdout )
111
124
fs .Usage = func () {
112
125
fmt .Fprintf (fs .Output (), helpText , fs .Name ())
@@ -118,6 +131,12 @@ func newB2G(stdout io.Writer, args []string) (*bpf2go, error) {
118
131
return nil , err
119
132
}
120
133
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
+
121
140
if * outDir == "" {
122
141
var err error
123
142
if * outDir , err = os .Getwd (); err != nil {
@@ -259,6 +278,20 @@ func getEnv(key, defaultVal string) string {
259
278
return defaultVal
260
279
}
261
280
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
+
262
295
func (b2g * bpf2go ) convertAll () (err error ) {
263
296
if _ , err := os .Stat (b2g .sourceFile ); os .IsNotExist (err ) {
264
297
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) {
351
384
return fmt .Errorf ("compile: %w" , err )
352
385
}
353
386
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 )
358
391
}
359
392
360
393
spec , err := ebpf .LoadCollectionSpec (objFileName )
@@ -412,7 +445,7 @@ func (b2g *bpf2go) convert(tgt gen.Target, goarches gen.GoArches) (err error) {
412
445
return fmt .Errorf ("can't write %s: %s" , goFileName , err )
413
446
}
414
447
415
- fmt . Fprintln ( b2g .stdout , "Wrote " , goFileName )
448
+ b2g .Debug ( "Generated bpf2go binding" , "file " , goFileName )
416
449
417
450
if b2g .makeBase == "" {
418
451
return
@@ -436,7 +469,8 @@ func (b2g *bpf2go) convert(tgt gen.Target, goarches gen.GoArches) (err error) {
436
469
return fmt .Errorf ("can't adjust dependency information: %s" , err )
437
470
}
438
471
439
- fmt .Fprintln (b2g .stdout , "Wrote" , depFileName )
472
+ b2g .Debug ("Wrote dependency" , "file" , depFileName )
473
+
440
474
return nil
441
475
}
442
476
@@ -460,7 +494,7 @@ func (b2g *bpf2go) removeOldOutputFiles(outputStem string, tgt gen.Target) error
460
494
return err
461
495
}
462
496
463
- fmt . Fprintln ( b2g .stdout , "Removed obsolete" , filename )
497
+ b2g .Debug ( "Removed obsolete output file" , "file " , filename )
464
498
}
465
499
466
500
return nil
0 commit comments