...
1[short] skip
2
3# Build our simple toolexec program.
4go 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.
10env 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
19go build -toolexec=$PWD/mytool
20[GOARCH:amd64] stderr -count=2 '^asm'${GOEXE}' TOOLEXEC_IMPORTPATH="test/main/withasm"$'
21stderr -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"$'
24stderr -count=1 '^compile'${GOEXE}' TOOLEXEC_IMPORTPATH="test/main"$'
25stderr -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
40go test -toolexec=$PWD/mytool
41
42stderr -count=2 '^# test/main\.test$'
43stderr -count=1 '^compile'${GOEXE}' TOOLEXEC_IMPORTPATH="test/main\.test"$'
44stderr -count=1 '^link'${GOEXE}' TOOLEXEC_IMPORTPATH="test/main\.test"$'
45
46stderr -count=1 '^# test/main \[test/main\.test\]$'
47stderr -count=1 '^compile'${GOEXE}' TOOLEXEC_IMPORTPATH="test/main \[test/main\.test\]"$'
48
49stderr -count=1 '^# test/main_test \[test/main\.test\]$'
50stderr -count=1 '^compile'${GOEXE}' TOOLEXEC_IMPORTPATH="test/main_test \[test/main\.test\]"$'
51
52-- go.mod --
53module 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.
58package main
59
60import (
61 _ "test/main/withasm"
62 _ "test/main/withcgo"
63)
64
65func main() {}
66-- foo_test.go --
67package main
68
69import "testing"
70
71func TestFoo(t *testing.T) {}
72-- foo_separate_test.go --
73package main_test
74
75import "testing"
76
77func TestSeparateFoo(t *testing.T) {}
78-- withcgo/withcgo.go --
79package withcgo
80
81// int fortytwo()
82// {
83// return 42;
84// }
85import "C"
86-- withcgo/stub.go --
87package withcgo
88
89// Stub file to ensure we build without cgo too.
90-- withasm/withasm.go --
91package withasm
92
93// Note that we don't need to declare the Add func at all.
94-- withasm/withasm_amd64.s --
95TEXT ·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 --
101package main
102
103import (
104 "fmt"
105 "os"
106 "os/exec"
107 "path/filepath"
108)
109
110func 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}
View as plain text