go2.patch revision 878f9d1108230185d5eb9962a11bfaccf534b1f9
1test: add -target flag.
2
3--- test/run.go
4+++ test/run.go
5@@ -37,9 +37,9 @@ var (
6 	numParallel    = flag.Int("n", runtime.NumCPU(), "number of parallel tests to run")
7 	summary        = flag.Bool("summary", false, "show summary of results")
8 	showSkips      = flag.Bool("show_skips", false, "show skipped tests")
9-	linkshared     = flag.Bool("linkshared", false, "")
10 	updateErrors   = flag.Bool("update_errors", false, "update error messages in test file based on compiler output")
11 	runoutputLimit = flag.Int("l", defaultRunOutputLimit(), "number of parallel runoutput tests to run")
12+	target         = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
13 
14 	shard  = flag.Int("shard", 0, "shard index to run. Only applicable if -shards is non-zero.")
15 	shards = flag.Int("shards", 0, "number of shards. If 0, all tests are run. This is used by the continuous build.")
16@@ -192,19 +192,11 @@ func goFiles(dir string) []string {
17 type runCmd func(...string) ([]byte, error)
18 
19 func compileFile(runcmd runCmd, longname string) (out []byte, err error) {
20-	cmd := []string{"go", "tool", "compile", "-e"}
21-	if *linkshared {
22-		cmd = append(cmd, "-dynlink", "-installsuffix=dynlink")
23-	}
24-	cmd = append(cmd, longname)
25-	return runcmd(cmd...)
26+	return runcmd(findGoCmd(), "tool", "compile", "-e", longname)
27 }
28 
29 func compileInDir(runcmd runCmd, dir string, names ...string) (out []byte, err error) {
30-	cmd := []string{"go", "tool", "compile", "-e", "-D", ".", "-I", "."}
31-	if *linkshared {
32-		cmd = append(cmd, "-dynlink", "-installsuffix=dynlink")
33-	}
34+	cmd := []string{findGoCmd(), "tool", "compile", "-e", "-D", ".", "-I", "."}
35 	for _, name := range names {
36 		cmd = append(cmd, filepath.Join(dir, name))
37 	}
38@@ -213,15 +205,21 @@ func compileInDir(runcmd runCmd, dir string, names ...string) (out []byte, err e
39 
40 func linkFile(runcmd runCmd, goname string) (err error) {
41 	pfile := strings.Replace(goname, ".go", ".o", -1)
42-	cmd := []string{"go", "tool", "link", "-w", "-o", "a.exe", "-L", "."}
43-	if *linkshared {
44-		cmd = append(cmd, "-linkshared", "-installsuffix=dynlink")
45-	}
46-	cmd = append(cmd, pfile)
47-	_, err = runcmd(cmd...)
48+	_, err = runcmd(findGoCmd(), "tool", "link", "-w", "-o", "a.exe", "-L", ".", pfile)
49 	return
50 }
51 
52+func goRun(runcmd runCmd, goname string, args ...string) (out []byte, err error) {
53+	cmd := []string{findGoCmd(), "run"}
54+	if len(findExecCmd()) > 0 {
55+		cmd = append(cmd, "-exec")
56+		cmd = append(cmd, findExecCmd()...)
57+	}
58+	cmd = append(cmd, goname)
59+	cmd = append(cmd, args...)
60+	return runcmd(cmd...)
61+}
62+
63 // skipError describes why a test was skipped.
64 type skipError string
65 
66@@ -530,8 +528,7 @@ func (t *test) run() {
67 		t.err = fmt.Errorf("unimplemented action %q", action)
68 
69 	case "errorcheck":
70-		cmdline := []string{"go", "tool", "compile", "-e", "-o", "a.o"}
71-		// No need to add -dynlink even if linkshared if we're just checking for errors...
72+		cmdline := []string{findGoCmd(), "tool", "compile", "-e", "-o", "a.o"}
73 		cmdline = append(cmdline, flags...)
74 		cmdline = append(cmdline, long)
75 		out, err := runcmd(cmdline...)
76@@ -640,19 +637,14 @@ func (t *test) run() {
77 		}
78 
79 	case "build":
80-		_, err := runcmd("go", "build", "-o", "a.exe", long)
81+		_, err := runcmd(findGoCmd(), "build", "-o", "a.exe", long)
82 		if err != nil {
83 			t.err = err
84 		}
85 
86 	case "run":
87 		useTmp = false
88-		cmd := []string{"go", "run"}
89-		if *linkshared {
90-			cmd = append(cmd, "-linkshared")
91-		}
92-		cmd = append(cmd, t.goFileName())
93-		out, err := runcmd(append(cmd, args...)...)
94+		out, err := goRun(runcmd, t.goFileName(), args...)
95 		if err != nil {
96 			t.err = err
97 			return
98@@ -667,12 +659,7 @@ func (t *test) run() {
99 			<-rungatec
100 		}()
101 		useTmp = false
102-		cmd := []string{"go", "run"}
103-		if *linkshared {
104-			cmd = append(cmd, "-linkshared")
105-		}
106-		cmd = append(cmd, t.goFileName())
107-		out, err := runcmd(append(cmd, args...)...)
108+		out, err := goRun(runcmd, t.goFileName(), args...)
109 		if err != nil {
110 			t.err = err
111 			return
112@@ -682,12 +669,7 @@ func (t *test) run() {
113 			t.err = fmt.Errorf("write tempfile:%s", err)
114 			return
115 		}
116-		cmd = []string{"go", "run"}
117-		if *linkshared {
118-			cmd = append(cmd, "-linkshared")
119-		}
120-		cmd = append(cmd, tfile)
121-		out, err = runcmd(cmd...)
122+		out, err = goRun(runcmd, tfile)
123 		if err != nil {
124 			t.err = err
125 			return
126@@ -698,12 +680,7 @@ func (t *test) run() {
127 
128 	case "errorcheckoutput":
129 		useTmp = false
130-		cmd := []string{"go", "run"}
131-		if *linkshared {
132-			cmd = append(cmd, "-linkshared")
133-		}
134-		cmd = append(cmd, t.goFileName())
135-		out, err := runcmd(append(cmd, args...)...)
136+		out, err := goRun(runcmd, t.goFileName(), args...)
137 		if err != nil {
138 			t.err = err
139 			return
140@@ -714,7 +691,7 @@ func (t *test) run() {
141 			t.err = fmt.Errorf("write tempfile:%s", err)
142 			return
143 		}
144-		cmdline := []string{"go", "tool", "compile", "-e", "-o", "a.o"}
145+		cmdline := []string{findGoCmd(), "tool", "compile", "-e", "-o", "a.o"}
146 		cmdline = append(cmdline, flags...)
147 		cmdline = append(cmdline, tfile)
148 		out, err = runcmd(cmdline...)
149@@ -741,6 +718,10 @@ func findExecCmd() []string {
150 		return execCmd
151 	}
152 	execCmd = []string{} // avoid work the second time
153+	if *target != "" {
154+		execCmd = []string{"go_" + *target + "_exec"}
155+		return execCmd
156+	}
157 	if goos == runtime.GOOS && goarch == runtime.GOARCH {
158 		return execCmd
159 	}
160@@ -751,6 +732,13 @@ func findExecCmd() []string {
161 	return execCmd
162 }
163 
164+func findGoCmd() string {
165+	if *target != "" {
166+		return "go_" + *target
167+	}
168+	return "go"
169+}
170+
171 func (t *test) String() string {
172 	return filepath.Join(t.dir, t.gofile)
173 }
174