blob: 362a53fed80fd5ef774764ded8fced7ae8be6268 [file] [log] [blame]
diff --git test/run.go test/run.go
index ad38d420c9..e2b93d35da 100644
--- test/run.go
+++ test/run.go
@@ -36,13 +36,13 @@ var (
summary = flag.Bool("summary", false, "show summary of results")
showSkips = flag.Bool("show_skips", false, "show skipped tests")
runSkips = flag.Bool("run_skips", false, "run skipped tests (ignore skip and build tags)")
- 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")
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.")
)
+ target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
var (
goos, goarch string
@@ -207,25 +207,19 @@ func goFiles(dir string) []string {
type runCmd func(...string) ([]byte, error)
func compileFile(runcmd runCmd, longname string, flags []string) (out []byte, err error) {
- cmd := []string{goTool(), "tool", "compile", "-e"}
+ cmd := []string{findGoCmd, "tool", "compile", "-e"}
cmd = append(cmd, flags...)
- if *linkshared {
- cmd = append(cmd, "-dynlink", "-installsuffix=dynlink")
- }
cmd = append(cmd, longname)
return runcmd(cmd...)
}
func compileInDir(runcmd runCmd, dir string, flags []string, localImports bool, names ...string) (out []byte, err error) {
- cmd := []string{goTool(), "tool", "compile", "-e"}
+ cmd := []string{findGoCmd(), "tool", "compile", "-e"}
if localImports {
// Set relative path for local imports and import search path to current dir.
cmd = append(cmd, "-D", ".", "-I", ".")
}
cmd = append(cmd, flags...)
- if *linkshared {
- cmd = append(cmd, "-dynlink", "-installsuffix=dynlink")
- }
for _, name := range names {
cmd = append(cmd, filepath.Join(dir, name))
}
@@ -234,15 +228,28 @@ func compileInDir(runcmd runCmd, dir string, flags []string, localImports bool,
func linkFile(runcmd runCmd, goname string) (err error) {
pfile := strings.Replace(goname, ".go", ".o", -1)
- cmd := []string{goTool(), "tool", "link", "-w", "-o", "a.exe", "-L", "."}
+ cmd := []string{findGoCmd(), "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, flags []string, goname string, args ...string) (out []byte, err error) {
+ cmd := []string{findGoCmd(), "run", goGcflags()}
+ if len(findExecCmd()) > 0 {
+ cmd = append(cmd, "-exec")
+ cmd = append(cmd, findExecCmd()...)
+ }
+ cmd = append(cmd, flags...)
+ cmd = append(cmd, goname)
+ cmd = append(cmd, args...)
+ return runcmd(cmd...)
+}
+
// skipError describes why a test was skipped.
type skipError string
@@ -646,7 +653,7 @@ func (t *test) run() {
// Fail if wantError is true and compilation was successful and vice versa.
// Match errors produced by gc against errors in comments.
// TODO(gri) remove need for -C (disable printing of columns in error messages)
- cmdline := []string{goTool(), "tool", "compile", "-C", "-e", "-o", "a.o"}
+ cmdline := []string{findGoCmd(), "tool", "compile", "-C", "-e", "-o", "a.o"}
// No need to add -dynlink even if linkshared if we're just checking for errors...
cmdline = append(cmdline, flags...)
cmdline = append(cmdline, long)
@@ -773,7 +780,7 @@ func (t *test) run() {
case "build":
// Build Go file.
- _, err := runcmd(goTool(), "build", goGcflags(), "-o", "a.exe", long)
+ _, err := runcmd(findGoCmd(), "build", goGcflags(), "-o", "a.exe", long)
if err != nil {
t.err = err
}
@@ -799,7 +806,7 @@ func (t *test) run() {
}
var objs []string
- cmd := []string{goTool(), "tool", "compile", "-e", "-D", ".", "-I", ".", "-o", "go.o"}
+ cmd := []string{findGoCmd(), "tool", "compile", "-e", "-D", ".", "-I", ".", "-o", "go.o"}
if len(asms) > 0 {
cmd = append(cmd, "-asmhdr", "go_asm.h")
}
@@ -813,7 +820,7 @@ func (t *test) run() {
}
objs = append(objs, "go.o")
if len(asms) > 0 {
- cmd = []string{goTool(), "tool", "asm", "-e", "-I", ".", "-o", "asm.o"}
+ cmd = []string{findGoCmd(), "tool", "asm", "-e", "-I", ".", "-o", "asm.o"}
for _, file := range asms {
cmd = append(cmd, filepath.Join(longdir, file.Name()))
}
@@ -857,14 +864,14 @@ func (t *test) run() {
}
objs = append(objs, "asm.o")
}
- cmd = []string{goTool(), "tool", "pack", "c", "all.a"}
+ cmd = []string{findGoCmd(), "tool", "pack", "c", "all.a"}
cmd = append(cmd, objs...)
_, err = runcmd(cmd...)
if err != nil {
t.err = err
break
}
- cmd = []string{goTool(), "tool", "link", "-o", "a.exe", "all.a"}
+ cmd = []string{findGoCmd(), "tool", "link", "-o", "a.exe", "all.a"}
_, err = runcmd(cmd...)
if err != nil {
t.err = err
@@ -886,10 +893,7 @@ func (t *test) run() {
// Build an executable from Go file, then run it, verify its output.
// Useful for timeout tests where failure mode is infinite loop.
// TODO: not supported on NaCl
- cmd := []string{goTool(), "build", goGcflags(), "-o", "a.exe"}
- if *linkshared {
- cmd = append(cmd, "-linkshared")
- }
+ cmd := []string{findGoCmd(), "build", goGcflags(), "-o", "a.exe"}
longdirgofile := filepath.Join(filepath.Join(cwd, t.dir), t.gofile)
cmd = append(cmd, flags...)
cmd = append(cmd, longdirgofile)
@@ -898,8 +902,13 @@ func (t *test) run() {
t.err = err
return
}
- cmd = []string{"./a.exe"}
- out, err = runcmd(append(cmd, args...)...)
+ cmd = []string{}
+ if len(findExecCmd()) > 0 {
+ cmd = append(cmd, findExecCmd()...)
+ }
+ cmd = append(cmd, "./a.exe")
+
+ out, err = runcmd(append(cmd, args...)...)
if err != nil {
t.err = err
return
@@ -914,38 +923,7 @@ func (t *test) run() {
// otherwise build an executable and run it.
// Verify the output.
useTmp = false
- var out []byte
- var err error
- if len(flags)+len(args) == 0 && goGcflags() == "" && !*linkshared {
- // If we're not using special go command flags,
- // skip all the go command machinery.
- // This avoids any time the go command would
- // spend checking whether, for example, the installed
- // package runtime is up to date.
- // Because we run lots of trivial test programs,
- // the time adds up.
- pkg := filepath.Join(t.tempDir, "pkg.a")
- if _, err := runcmd(goTool(), "tool", "compile", "-o", pkg, t.goFileName()); err != nil {
- t.err = err
- return
- }
- exe := filepath.Join(t.tempDir, "test.exe")
- cmd := []string{goTool(), "tool", "link", "-s", "-w"}
- cmd = append(cmd, "-o", exe, pkg)
- if _, err := runcmd(cmd...); err != nil {
- t.err = err
- return
- }
- out, err = runcmd(append([]string{exe}, args...)...)
- } else {
- cmd := []string{goTool(), "run", goGcflags()}
- if *linkshared {
- cmd = append(cmd, "-linkshared")
- }
- cmd = append(cmd, flags...)
- cmd = append(cmd, t.goFileName())
- out, err = runcmd(append(cmd, args...)...)
- }
+ out, err := goRun(runcmd, flags, t.goFileName(), args...)
if err != nil {
t.err = err
return
@@ -962,12 +940,7 @@ func (t *test) run() {
<-rungatec
}()
useTmp = false
- cmd := []string{goTool(), "run", goGcflags()}
- if *linkshared {
- cmd = append(cmd, "-linkshared")
- }
- cmd = append(cmd, t.goFileName())
- out, err := runcmd(append(cmd, args...)...)
+ out, err := goRun(runcmd, nil, t.goFileName(), args...)
if err != nil {
t.err = err
return
@@ -977,12 +950,7 @@ func (t *test) run() {
t.err = fmt.Errorf("write tempfile:%s", err)
return
}
- cmd = []string{goTool(), "run", goGcflags()}
- if *linkshared {
- cmd = append(cmd, "-linkshared")
- }
- cmd = append(cmd, tfile)
- out, err = runcmd(cmd...)
+ out, err = goRun(runcmd, nil, tfile)
if err != nil {
t.err = err
return
@@ -995,12 +963,7 @@ func (t *test) run() {
// Run Go file and write its output into temporary Go file.
// Compile and errorCheck generated Go file.
useTmp = false
- cmd := []string{goTool(), "run", goGcflags()}
- if *linkshared {
- cmd = append(cmd, "-linkshared")
- }
- cmd = append(cmd, t.goFileName())
- out, err := runcmd(append(cmd, args...)...)
+ out, err := goRun(runcmd, nil, t.goFileName(), args...)
if err != nil {
t.err = err
return
@@ -1011,7 +974,7 @@ func (t *test) run() {
t.err = fmt.Errorf("write tempfile:%s", err)
return
}
- cmdline := []string{goTool(), "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...)
@@ -1038,6 +1001,11 @@ 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
}
@@ -1048,6 +1016,14 @@ 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)
}