"io"
"log"
"os"
+ "runtime"
"strings"
)
if *verbose {
log.Println("run", argv)
}
+ if runtime.GOOS == "windows" && isBash(argv[0]) {
+ // shell script cannot be executed directly on Windows.
+ argv = append([]string{"bash", "-c"}, argv...)
+ }
bin, err := lookPath(argv[0])
if err != nil {
return err
if *verbose {
log.Println("runLog", argv)
}
+ if runtime.GOOS == "windows" && isBash(argv[0]) {
+ // shell script cannot be executed directly on Windows.
+ argv = append([]string{"bash", "-c"}, argv...)
+ }
bin, err := lookPath(argv[0])
if err != nil {
return
}
return exec.LookPath(cmd)
}
+
+// isBash determines if name refers to a shell script.
+func isBash(name string) bool {
+ // TODO(brainman): perhaps it is too simple and needs better check.
+ return strings.HasSuffix(name, ".bash")
+}
"os"
"path"
"regexp"
+ "runtime"
"strconv"
"strings"
"time"
// envv returns an environment for build/bench execution
func (b *Builder) envv() []string {
+ if runtime.GOOS == "windows" {
+ return b.envvWindows()
+ }
e := []string{
"GOOS=" + b.goos,
"GOARCH=" + b.goarch,
return e
}
+// windows version of envv
+func (b *Builder) envvWindows() []string {
+ start := map[string]string{
+ "GOOS": b.goos,
+ "GOARCH": b.goarch,
+ "GOROOT_FINAL": "/c/go",
+ }
+ for _, name := range extraEnv {
+ start[name] = os.Getenv(name)
+ }
+ skip := map[string]bool{
+ "GOBIN": true,
+ "GOROOT": true,
+ "INCLUDE": true,
+ "LIB": true,
+ }
+ var e []string
+ for name, v := range start {
+ e = append(e, name+"="+v)
+ skip[name] = true
+ }
+ for _, kv := range os.Environ() {
+ s := strings.Split(kv, "=", 2)
+ name := strings.ToUpper(s[0])
+ switch {
+ case name == "":
+ // variables, like "=C:=C:\", just copy them
+ e = append(e, kv)
+ case !skip[name]:
+ e = append(e, kv)
+ skip[name] = true
+ }
+ }
+ return e
+}
+
func isDirectory(name string) bool {
s, err := os.Stat(name)
return err == nil && s.IsDirectory()