test: add -target flag. --- test/run.go +++ test/run.go @@ -37,9 +37,9 @@ var ( numParallel = flag.Int("n", runtime.NumCPU(), "number of parallel tests to run") summary = flag.Bool("summary", false, "show summary of results") showSkips = flag.Bool("show_skips", false, "show skipped tests") - linkshared = flag.Bool("linkshared", false, "") updateErrors = flag.Bool("update_errors", false, "update error messages in test file based on compiler output") runoutputLimit = flag.Int("l", defaultRunOutputLimit(), "number of parallel runoutput tests to run") + target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries") shard = flag.Int("shard", 0, "shard index to run. Only applicable if -shards is non-zero.") shards = flag.Int("shards", 0, "number of shards. If 0, all tests are run. This is used by the continuous build.") @@ -192,19 +192,11 @@ func goFiles(dir string) []string { type runCmd func(...string) ([]byte, error) func compileFile(runcmd runCmd, longname string) (out []byte, err error) { - cmd := []string{"go", "tool", "compile", "-e"} - if *linkshared { - cmd = append(cmd, "-dynlink", "-installsuffix=dynlink") - } - cmd = append(cmd, longname) - return runcmd(cmd...) + return runcmd(findGoCmd(), "tool", "compile", "-e", longname) } func compileInDir(runcmd runCmd, dir string, names ...string) (out []byte, err error) { - cmd := []string{"go", "tool", "compile", "-e", "-D", ".", "-I", "."} - if *linkshared { - cmd = append(cmd, "-dynlink", "-installsuffix=dynlink") - } + cmd := []string{findGoCmd(), "tool", "compile", "-e", "-D", ".", "-I", "."} for _, name := range names { cmd = append(cmd, filepath.Join(dir, name)) } @@ -213,15 +205,21 @@ func compileInDir(runcmd runCmd, dir string, names ...string) (out []byte, err e func linkFile(runcmd runCmd, goname string) (err error) { pfile := strings.Replace(goname, ".go", ".o", -1) - cmd := []string{"go", "tool", "link", "-w", "-o", "a.exe", "-L", "."} - if *linkshared { - cmd = append(cmd, "-linkshared", "-installsuffix=dynlink") - } - cmd = append(cmd, pfile) - _, err = runcmd(cmd...) + _, err = runcmd(findGoCmd(), "tool", "link", "-w", "-o", "a.exe", "-L", ".", pfile) return } +func goRun(runcmd runCmd, goname string, args ...string) (out []byte, err error) { + cmd := []string{findGoCmd(), "run"} + if len(findExecCmd()) > 0 { + cmd = append(cmd, "-exec") + cmd = append(cmd, findExecCmd()...) + } + cmd = append(cmd, goname) + cmd = append(cmd, args...) + return runcmd(cmd...) +} + // skipError describes why a test was skipped. type skipError string @@ -530,8 +528,7 @@ func (t *test) run() { t.err = fmt.Errorf("unimplemented action %q", action) case "errorcheck": - cmdline := []string{"go", "tool", "compile", "-e", "-o", "a.o"} - // No need to add -dynlink even if linkshared if we're just checking for errors... + cmdline := []string{findGoCmd(), "tool", "compile", "-e", "-o", "a.o"} cmdline = append(cmdline, flags...) cmdline = append(cmdline, long) out, err := runcmd(cmdline...) @@ -640,19 +637,14 @@ func (t *test) run() { } case "build": - _, err := runcmd("go", "build", "-o", "a.exe", long) + _, err := runcmd(findGoCmd(), "build", "-o", "a.exe", long) if err != nil { t.err = err } case "run": useTmp = false - cmd := []string{"go", "run"} - if *linkshared { - cmd = append(cmd, "-linkshared") - } - cmd = append(cmd, t.goFileName()) - out, err := runcmd(append(cmd, args...)...) + out, err := goRun(runcmd, t.goFileName(), args...) if err != nil { t.err = err return @@ -667,12 +659,7 @@ func (t *test) run() { <-rungatec }() useTmp = false - cmd := []string{"go", "run"} - if *linkshared { - cmd = append(cmd, "-linkshared") - } - cmd = append(cmd, t.goFileName()) - out, err := runcmd(append(cmd, args...)...) + out, err := goRun(runcmd, t.goFileName(), args...) if err != nil { t.err = err return @@ -682,12 +669,7 @@ func (t *test) run() { t.err = fmt.Errorf("write tempfile:%s", err) return } - cmd = []string{"go", "run"} - if *linkshared { - cmd = append(cmd, "-linkshared") - } - cmd = append(cmd, tfile) - out, err = runcmd(cmd...) + out, err = goRun(runcmd, tfile) if err != nil { t.err = err return @@ -698,12 +680,7 @@ func (t *test) run() { case "errorcheckoutput": useTmp = false - cmd := []string{"go", "run"} - if *linkshared { - cmd = append(cmd, "-linkshared") - } - cmd = append(cmd, t.goFileName()) - out, err := runcmd(append(cmd, args...)...) + out, err := goRun(runcmd, t.goFileName(), args...) if err != nil { t.err = err return @@ -714,7 +691,7 @@ func (t *test) run() { t.err = fmt.Errorf("write tempfile:%s", err) return } - cmdline := []string{"go", "tool", "compile", "-e", "-o", "a.o"} + cmdline := []string{findGoCmd(), "tool", "compile", "-e", "-o", "a.o"} cmdline = append(cmdline, flags...) cmdline = append(cmdline, tfile) out, err = runcmd(cmdline...) @@ -741,6 +718,10 @@ func findExecCmd() []string { return execCmd } execCmd = []string{} // avoid work the second time + if *target != "" { + execCmd = []string{"go_" + *target + "_exec"} + return execCmd + } if goos == runtime.GOOS && goarch == runtime.GOARCH { return execCmd } @@ -751,6 +732,13 @@ func findExecCmd() []string { return execCmd } +func findGoCmd() string { + if *target != "" { + return "go_" + *target + } + return "go" +} + func (t *test) String() string { return filepath.Join(t.dir, t.gofile) }