...
1[short] skip
2
3# If GOROOT is set, 'go build -trimpath' bakes that into the resulting
4# binary. Explicitly unset it here.
5env GOROOT=
6
7# Set up two identical directories that can be used as GOPATH.
8env GO111MODULE=on
9mkdir $WORK/a/src/paths $WORK/b/src/paths
10cp paths.go $WORK/a/src/paths
11cp paths.go $WORK/b/src/paths
12cp overlay.json $WORK/a/src/paths
13cp overlay.json $WORK/b/src/paths
14cp go.mod $WORK/a/src/paths/
15cp go.mod $WORK/b/src/paths/
16
17
18# A binary built without -trimpath should contain the module root dir
19# and GOROOT for debugging and stack traces.
20cd $WORK/a/src/paths
21go build -o $WORK/paths-dbg.exe .
22exec $WORK/paths-dbg.exe $WORK/paths-dbg.exe
23stdout 'binary contains module root: true'
24stdout 'binary contains an empty GOROOT'
25
26# A binary built with -trimpath should not contain the current workspace.
27go build -trimpath -o $WORK/paths-a.exe .
28exec $WORK/paths-a.exe $WORK/paths-a.exe
29stdout 'binary contains module root: false'
30stdout 'binary contains an empty GOROOT'
31
32# A binary from an external module built with -trimpath should not contain
33# the current workspace or GOROOT.
34go get rsc.io/fortune
35go install -trimpath rsc.io/fortune
36exec $WORK/paths-a.exe $GOPATH/bin/fortune$GOEXE
37stdout 'binary contains module root: false'
38stdout 'binary contains an empty GOROOT'
39go mod edit -droprequire rsc.io/fortune
40
41# Two binaries built from identical packages in different directories
42# should be identical.
43cd $WORK/b/src/paths
44go build -trimpath -o $WORK/paths-b.exe
45cmp -q $WORK/paths-a.exe $WORK/paths-b.exe
46
47
48# Same sequence of tests but with overlays.
49# A binary built without -trimpath should contain the module root dir
50# and GOROOT for debugging and stack traces.
51cd $WORK/a/src/paths
52go build -overlay overlay.json -o $WORK/paths-dbg.exe ./overlaydir
53exec $WORK/paths-dbg.exe $WORK/paths-dbg.exe
54stdout 'binary contains module root: true'
55stdout 'binary contains an empty GOROOT'
56
57# A binary built with -trimpath should not contain the current workspace.
58go build -overlay overlay.json -trimpath -o $WORK/paths-a.exe ./overlaydir
59exec $WORK/paths-a.exe $WORK/paths-a.exe
60stdout 'binary contains module root: false'
61stdout 'binary contains an empty GOROOT'
62
63# Two binaries built from identical packages in different directories
64# should be identical.
65cd $WORK/b/src/paths
66go build -overlay overlay.json -trimpath -o $WORK/paths-b.exe ./overlaydir
67cmp -q $WORK/paths-a.exe $WORK/paths-b.exe
68
69
70# Same sequence of tests but in GOPATH mode.
71# A binary built without -trimpath should contain GOPATH and GOROOT.
72env GO111MODULE=off
73cd $WORK
74env GOPATH=$WORK/a
75go build -o paths-dbg.exe paths
76exec ./paths-dbg.exe paths-dbg.exe
77stdout 'binary contains GOPATH: true'
78stdout 'binary contains an empty GOROOT'
79
80# A binary built with -trimpath should not contain GOPATH.
81go build -trimpath -o paths-a.exe paths
82exec ./paths-a.exe paths-a.exe
83stdout 'binary contains GOPATH: false'
84stdout 'binary contains an empty GOROOT'
85
86# Two binaries built from identical packages in different GOPATH roots
87# should be identical.
88env GOPATH=$WORK/b
89go build -trimpath -o paths-b.exe paths
90cmp -q paths-a.exe paths-b.exe
91
92
93# Same sequence of tests but with gccgo.
94# gccgo does not support builds in module mode.
95[!exec:gccgo] stop
96[cross] stop # gccgo can't necessarily cross-compile
97env GOPATH=$WORK/a
98
99# A binary built with gccgo without -trimpath should contain the current
100# GOPATH and GOROOT.
101go build -compiler=gccgo -o paths-dbg.exe paths
102exec ./paths-dbg.exe paths-dbg.exe
103stdout 'binary contains GOPATH: true'
104stdout 'binary contains an empty GOROOT'
105
106# gccgo doesn't load std from GOROOT.
107# A binary built with gccgo with -trimpath should not contain GOPATH or GOROOT.
108go build -compiler=gccgo -trimpath -o paths-a.exe paths
109exec ./paths-a.exe paths-a.exe
110stdout 'binary contains GOPATH: false'
111stdout 'binary contains an empty GOROOT'
112
113# Two binaries built from identical packages in different directories
114# should be identical.
115env GOPATH=$WORK/b
116go build -compiler=gccgo -trimpath -o paths-b.exe paths
117cmp -q paths-a.exe paths-b.exe
118
119-- paths.go --
120package main
121
122import (
123 "bytes"
124 "fmt"
125 "io/ioutil"
126 "log"
127 "os"
128 "os/exec"
129 "path/filepath"
130 "strings"
131)
132
133func main() {
134 exe := os.Args[1]
135 data, err := ioutil.ReadFile(exe)
136 if err != nil {
137 log.Fatal(err)
138 }
139
140 if os.Getenv("GO111MODULE") == "on" {
141 out, err := exec.Command("go", "env", "GOMOD").Output()
142 if err != nil {
143 log.Fatal(err)
144 }
145 modRoot := filepath.Dir(strings.TrimSpace(string(out)))
146 check(data, "module root", modRoot)
147 } else {
148 check(data, "GOPATH", os.Getenv("GOPATH"))
149 }
150 check(data, "GOROOT", os.Getenv("GOROOT"))
151}
152
153func check(data []byte, desc, dir string) {
154 if dir == "" {
155 fmt.Printf("binary contains an empty %s\n", desc)
156 return
157 }
158 containsDir := bytes.Contains(data, []byte(dir))
159 containsSlashDir := bytes.Contains(data, []byte(filepath.ToSlash(dir)))
160 fmt.Printf("binary contains %s: %v\n", desc, containsDir || containsSlashDir)
161}
162-- overlay.json --
163{ "Replace": { "overlaydir/paths.go": "paths.go" } }
164-- go.mod --
165module paths
166
167go 1.14
View as plain text