[short] skip # Build our simple toolexec program. go build ./cmd/mytool # Build the main package with our toolexec program. For each action, it will # print the tool's name and the TOOLEXEC_IMPORTPATH value. We expect to compile # each package once, and link the main package once. # Don't check the entire output at once, because the order in which the tools # are run is irrelevant here. # Finally, note that asm and cgo are run twice. go build -toolexec=$PWD/mytool [amd64] stderr -count=2 '^asm'${GOEXE}' TOOLEXEC_IMPORTPATH=test/main/withasm$' stderr -count=1 '^compile'${GOEXE}' TOOLEXEC_IMPORTPATH=test/main/withasm$' [cgo] stderr -count=2 '^cgo'${GOEXE}' TOOLEXEC_IMPORTPATH=test/main/withcgo$' [cgo] stderr -count=1 '^compile'${GOEXE}' TOOLEXEC_IMPORTPATH=test/main/withcgo$' stderr -count=1 '^compile'${GOEXE}' TOOLEXEC_IMPORTPATH=test/main$' stderr -count=1 '^link'${GOEXE}' TOOLEXEC_IMPORTPATH=test/main$' -- go.mod -- module test/main -- foo.go -- // Simple package so we can test a program build with -toolexec. // With a dummy import, to test different TOOLEXEC_IMPORTPATH values. // Includes dummy uses of cgo and asm, to cover those tools as well. package main import ( _ "test/main/withasm" _ "test/main/withcgo" ) func main() {} -- withcgo/withcgo.go -- package withcgo // int fortytwo() // { // return 42; // } import "C" -- withcgo/stub.go -- package withcgo // Stub file to ensure we build without cgo too. -- withasm/withasm.go -- package withasm // Note that we don't need to declare the Add func at all. -- withasm/withasm_amd64.s -- TEXT ·Add(SB),$0-24 MOVQ a+0(FP), AX ADDQ b+8(FP), AX MOVQ AX, ret+16(FP) RET -- cmd/mytool/main.go -- package main import ( "fmt" "os" "os/exec" "path/filepath" ) func main() { tool, args := os.Args[1], os.Args[2:] toolName := filepath.Base(tool) if len(args) > 0 && args[0] == "-V=full" { // We can't alter the version output. } else { // Print which tool we're running, and on what package. fmt.Fprintf(os.Stdout, "%s TOOLEXEC_IMPORTPATH=%s\n", toolName, os.Getenv("TOOLEXEC_IMPORTPATH")) } // Simply run the tool. cmd := exec.Command(tool, args...) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr if err := cmd.Run(); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } }