]> Cypherpunks repositories - gostls13.git/commitdiff
gobuilder: fixes for windows
authorAlex Brainman <alex.brainman@gmail.com>
Mon, 30 May 2011 01:20:46 +0000 (11:20 +1000)
committerAlex Brainman <alex.brainman@gmail.com>
Mon, 30 May 2011 01:20:46 +0000 (11:20 +1000)
R=r, devon.odell, iant, rsc, adg
CC=bradfitz, golang-dev, jdpoirier
https://golang.org/cl/4536053

misc/dashboard/builder/exec.go
misc/dashboard/builder/main.go

index 988d216cec44b8df6ff4916bda9741032df47071..0c16dff8a06a2d97aabe5ca41d4546fe1c60b2c1 100644 (file)
@@ -10,6 +10,7 @@ import (
        "io"
        "log"
        "os"
+       "runtime"
        "strings"
 )
 
@@ -18,6 +19,10 @@ func run(envv []string, dir string, argv ...string) os.Error {
        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
@@ -36,6 +41,10 @@ func runLog(envv []string, logfile, dir string, argv ...string) (output string,
        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
@@ -74,3 +83,9 @@ func lookPath(cmd string) (string, os.Error) {
        }
        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")
+}
index c1536abb2816b2302fb0a6b46b2f3365fbc81bcc..0eda8d204f763aadae07987eda29fa9252b4951a 100644 (file)
@@ -12,6 +12,7 @@ import (
        "os"
        "path"
        "regexp"
+       "runtime"
        "strconv"
        "strings"
        "time"
@@ -347,6 +348,9 @@ func (b *Builder) buildHash(hash string) (err os.Error) {
 
 // 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,
@@ -358,6 +362,42 @@ func (b *Builder) envv() []string {
        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()