case "run":
useTmp = false
- cmd := []string{"go", "run", goGcflags()}
- if *linkshared {
- cmd = append(cmd, "-linkshared")
+ 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("go", "tool", "compile", "-o", pkg, t.goFileName()); err != nil {
+ t.err = err
+ return
+ }
+ exe := filepath.Join(t.tempDir, "test.exe")
+ cmd := []string{"go", "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{"go", "run", goGcflags()}
+ if *linkshared {
+ cmd = append(cmd, "-linkshared")
+ }
+ cmd = append(cmd, flags...)
+ cmd = append(cmd, t.goFileName())
+ out, err = runcmd(append(cmd, args...)...)
}
- cmd = append(cmd, flags...)
- cmd = append(cmd, t.goFileName())
- out, err := runcmd(append(cmd, args...)...)
if err != nil {
t.err = err
return