@@ -20,23 +20,70 @@ func usage() {
20
20
fmt .Fprintf (os .Stderr , "--help Print this help.\n " )
21
21
}
22
22
23
- func parseFlags (args []string ) ([]string , []string ) {
23
+ func parseFlags (args []string , mimic bool ) ([]string , []string ) {
24
24
i := 0
25
25
buildFlags := []string {}
26
- for i < len (args ) && strings .HasPrefix (args [i ], "-" ) {
26
+ for ; i < len (args ) && strings .HasPrefix (args [i ], "-" ); i ++ {
27
27
if args [i ] == "--" {
28
28
i ++
29
29
break
30
30
}
31
31
32
- if args [i ] == "--help" {
33
- usage ()
34
- os .Exit (0 )
35
- } else {
36
- buildFlags = append (buildFlags , args [i ])
32
+ if ! mimic {
33
+ // we're not in mimic mode, try to parse our arguments
34
+ switch args [i ] {
35
+ case "--help" :
36
+ usage ()
37
+ os .Exit (0 )
38
+ case "--mimic" :
39
+ if i + 1 < len (args ) {
40
+ i ++
41
+ compiler := args [i ]
42
+ log .Printf ("Compiler: %s" , compiler )
43
+ if i + 1 < len (args ) {
44
+ i ++
45
+ command := args [i ]
46
+ if command == "build" || command == "install" || command == "run" {
47
+ log .Printf ("Intercepting build" )
48
+ return parseFlags (args [i + 1 :], true )
49
+ } else {
50
+ log .Printf ("Non-build command '%s'; skipping" , strings .Join (args [1 :], " " ))
51
+ os .Exit (0 )
52
+ }
53
+ } else {
54
+ log .Printf ("Non-build command '%s'; skipping" , strings .Join (args [1 :], " " ))
55
+ os .Exit (0 )
56
+ }
57
+ } else {
58
+ log .Fatalf ("Invalid --mimic: no compiler specified" )
59
+ }
60
+ }
37
61
}
38
62
39
- i ++
63
+ // parse go build flags
64
+ switch args [i ] {
65
+ // skip `-o output` and `-i`, if applicable
66
+ case "-o" :
67
+ if i + 1 < len (args ) {
68
+ i ++
69
+ }
70
+ case "-i" :
71
+ case "-p" , "-asmflags" , "-buildmode" , "-compiler" , "-gccgoflags" , "-gcflags" , "-installsuffix" ,
72
+ "-ldflags" , "-mod" , "-modfile" , "-pkgdir" , "-tags" , "-toolexec" :
73
+ if i + 1 < len (args ) {
74
+ buildFlags = append (buildFlags , args [i ], args [i + 1 ])
75
+ i ++
76
+ } else {
77
+ buildFlags = append (buildFlags , args [i ])
78
+ }
79
+ default :
80
+ if strings .HasPrefix (args [i ], "-" ) {
81
+ buildFlags = append (buildFlags , args [i ])
82
+ } else {
83
+ // stop parsing if the argument is not a flag (and so is positional)
84
+ break
85
+ }
86
+ }
40
87
}
41
88
42
89
cpuprofile = os .Getenv ("CODEQL_EXTRACTOR_GO_CPU_PROFILE" )
@@ -46,7 +93,7 @@ func parseFlags(args []string) ([]string, []string) {
46
93
}
47
94
48
95
func main () {
49
- buildFlags , patterns := parseFlags (os .Args [1 :])
96
+ buildFlags , patterns := parseFlags (os .Args [1 :], false )
50
97
51
98
if cpuprofile != "" {
52
99
f , err := os .Create (cpuprofile )
@@ -63,9 +110,10 @@ func main() {
63
110
if len (patterns ) == 0 {
64
111
log .Println ("Nothing to extract." )
65
112
} else {
113
+ log .Printf ("Build flags: '%s'; patterns: '%s'\n " , strings .Join (buildFlags , " " ), strings .Join (patterns , " " ))
66
114
err := extractor .ExtractWithFlags (buildFlags , patterns )
67
115
if err != nil {
68
- log .Fatal ( err )
116
+ log .Fatalf ( "Error running go tooling: %s \n " , err . Error () )
69
117
}
70
118
}
71
119
0 commit comments