func init() { var err error sandboxDir, err = os.Getwd() if err != nil { panic(err) } sandboxGoRoot = filepath.Join(sandboxDir, "go") sandboxGoCc = filepath.Join(sandboxGoRoot, "bin/go") // check for sandbox compiler _, err = os.Stat(sandboxGoCc) haveSandboxCompiler := !os.IsNotExist(err) // TODO: check for compiled runtime in goRoot/pkg/*/runtime.a if !haveSandboxCompiler /* || !haveSandboxRuntime */ { log.Always("Sandboxed Go not found") // try local, then remote if err := copyLocal(); err != nil { if err := getRemote(); err != nil { panic(err) } } } }
func getRemote() error { log.Always("trying to get remote Go source") out, err := run("hg", "clone", "-r release", "-b default", "-u release", "https://code.google.com/p/go") if err != nil { log.Error(out) return err } log.Always("building") cmd, b := cmd("./all.bash") cmd.Dir = filepath.Join(sandboxGoRoot, "src") err = cmd.Run() if err != nil { log.Error(b.String()) return err } return nil }
func copyLocal() error { log.Always("trying to copy local") goRoot := os.Getenv("GOROOT") if goRoot == "" { log.Always("no installed go") return errors.New("no installed Go") } if _, err := os.Stat(sandboxGoRoot); os.IsNotExist(err) { if err = os.MkdirAll(sandboxGoRoot, 0644); err != nil { return err } } if s, err := run("cp", "-r", filepath.Join(goRoot, "bin"), sandboxGoRoot); err != nil { log.Always(s) return err } if s, err := run("cp", "-r", filepath.Join(goRoot, "pkg"), sandboxGoRoot); err != nil { log.Always(s) return err } if s, err := run("cp", "-r", filepath.Join(goRoot, "src"), sandboxGoRoot); err != nil { log.Always(s) return err } if s, err := run("cp", "-r", filepath.Join(goRoot, "VERSION"), sandboxGoRoot); err != nil { log.Always(s) return err } return nil }