1 [short] skip
2
3 # Build our simple toolexec program.
4 go build ./cmd/mytool
5
6 # Use an ephemeral build cache so that our toolexec output is not cached
7 # for any stale standard-library dependencies.
8 #
9 # TODO(#27628): This should not be necessary.
10 env GOCACHE=$WORK/gocache
11
12 # Build the main package with our toolexec program. For each action, it will
13 # print the tool's name and the TOOLEXEC_IMPORTPATH value. We expect to compile
14 # each package once, and link the main package once.
15 # Don't check the entire output at once, because the order in which the tools
16 # are run is irrelevant here.
17 # Finally, note that asm and cgo are run twice.
18
19 go build -toolexec=$PWD/mytool
20 [GOARCH:amd64] stderr -count=2 '^asm'${GOEXE}' TOOLEXEC_IMPORTPATH="test/main/withasm"$'
21 stderr -count=1 '^compile'${GOEXE}' TOOLEXEC_IMPORTPATH="test/main/withasm"$'
22 [cgo] stderr -count=2 '^cgo'${GOEXE}' TOOLEXEC_IMPORTPATH="test/main/withcgo"$'
23 [cgo] stderr -count=1 '^compile'${GOEXE}' TOOLEXEC_IMPORTPATH="test/main/withcgo"$'
24 stderr -count=1 '^compile'${GOEXE}' TOOLEXEC_IMPORTPATH="test/main"$'
25 stderr -count=1 '^link'${GOEXE}' TOOLEXEC_IMPORTPATH="test/main"$'
26
27 # Test packages are a little bit trickier.
28 # We have four variants of test/main, as reported by 'go list -test':
29 #
30 # test/main - the regular non-test package
31 # test/main.test - the generated test program
32 # test/main [test/main.test] - the test package for foo_test.go
33 # test/main_test [test/main.test] - the test package for foo_separate_test.go
34 #
35 # As such, TOOLEXEC_IMPORTPATH must see the same strings, to be able to uniquely
36 # identify each package being built as reported by 'go list -f {{.ImportPath}}'.
37 # Note that these are not really "import paths" anymore, but that naming is
38 # consistent with 'go list -json' at least.
39
40 go test -toolexec=$PWD/mytool
41
42 stderr -count=2 '^# test/main\.test$'
43 stderr -count=1 '^compile'${GOEXE}' TOOLEXEC_IMPORTPATH="test/main\.test"$'
44 stderr -count=1 '^link'${GOEXE}' TOOLEXEC_IMPORTPATH="test/main\.test"$'
45
46 stderr -count=1 '^# test/main \[test/main\.test\]$'
47 stderr -count=1 '^compile'${GOEXE}' TOOLEXEC_IMPORTPATH="test/main \[test/main\.test\]"$'
48
49 stderr -count=1 '^# test/main_test \[test/main\.test\]$'
50 stderr -count=1 '^compile'${GOEXE}' TOOLEXEC_IMPORTPATH="test/main_test \[test/main\.test\]"$'
51
52 -- go.mod --
53 module test/main
54 -- foo.go --
55 // Simple package so we can test a program build with -toolexec.
56 // With a dummy import, to test different TOOLEXEC_IMPORTPATH values.
57 // Includes dummy uses of cgo and asm, to cover those tools as well.
58 package main
59
60 import (
61 _ "test/main/withasm"
62 _ "test/main/withcgo"
63 )
64
65 func main() {}
66 -- foo_test.go --
67 package main
68
69 import "testing"
70
71 func TestFoo(t *testing.T) {}
72 -- foo_separate_test.go --
73 package main_test
74
75 import "testing"
76
77 func TestSeparateFoo(t *testing.T) {}
78 -- withcgo/withcgo.go --
79 package withcgo
80
81 // int fortytwo()
82 // {
83 // return 42;
84 // }
85 import "C"
86 -- withcgo/stub.go --
87 package withcgo
88
89 // Stub file to ensure we build without cgo too.
90 -- withasm/withasm.go --
91 package withasm
92
93 // Note that we don't need to declare the Add func at all.
94 -- withasm/withasm_amd64.s --
95 TEXT ·Add(SB),$0-24
96 MOVQ a+0(FP), AX
97 ADDQ b+8(FP), AX
98 MOVQ AX, ret+16(FP)
99 RET
100 -- cmd/mytool/main.go --
101 package main
102
103 import (
104 "fmt"
105 "os"
106 "os/exec"
107 "path/filepath"
108 )
109
110 func main() {
111 tool, args := os.Args[1], os.Args[2:]
112 toolName := filepath.Base(tool)
113 if len(args) > 0 && args[0] == "-V=full" {
114 // We can't alter the version output.
115 } else {
116 // Print which tool we're running, and on what package.
117 fmt.Fprintf(os.Stdout, "%s TOOLEXEC_IMPORTPATH=%q\n", toolName, os.Getenv("TOOLEXEC_IMPORTPATH"))
118 }
119
120 // Simply run the tool.
121 cmd := exec.Command(tool, args...)
122 cmd.Stdout = os.Stdout
123 cmd.Stderr = os.Stderr
124 if err := cmd.Run(); err != nil {
125 fmt.Fprintln(os.Stderr, err)
126 os.Exit(1)
127 }
128 }
129
View as plain text