github.com/justinjmoses/evergreen@v0.0.0-20170530173719-1d50e381ff0d/scripts/build-cross-compile.go (about) 1 package main 2 3 import ( 4 "flag" 5 "fmt" 6 "os" 7 "os/exec" 8 "runtime" 9 "strings" 10 ) 11 12 func main() { 13 var ( 14 arch string 15 system string 16 directory string 17 source string 18 ldFlags string 19 buildName string 20 output string 21 goBin string 22 race bool 23 24 defaultArch string 25 defaultSystem string 26 ) 27 28 defaultArch = os.Getenv("GOARCH") 29 if defaultArch == "" { 30 defaultArch = runtime.GOARCH 31 } 32 defaultSystem = os.Getenv("GOOS") 33 if defaultSystem == "" { 34 defaultSystem = runtime.GOOS 35 } 36 37 flag.StringVar(&arch, "goarch", defaultArch, "target architecture (GOARCH)") 38 flag.StringVar(&system, "goos", defaultSystem, "target system (GOOS)") 39 flag.StringVar(&directory, "directory", "", "output directory") 40 flag.StringVar(&source, "source", "", "path to source file") 41 flag.StringVar(&ldFlags, "ldflags", "", "specify any ldflags to pass to go build") 42 flag.StringVar(&buildName, "buildName", "", "use GOOS_ARCH to specify target platform") 43 flag.StringVar(&goBin, "goBinary", "go", "specify path to go binary") 44 flag.StringVar(&output, "output", "", "specify the name of executable") 45 flag.BoolVar(&race, "race", false, "specify to enable the race detector") 46 flag.Parse() 47 48 if buildName != "" { 49 parts := strings.Split(buildName, "_") 50 51 system = parts[0] 52 arch = parts[1] 53 } else { 54 buildName = fmt.Sprintf("%s_%s", system, arch) 55 } 56 if runtime.GOOS == "windows" && goBin == "/cygdrive/c/go/bin/go" { 57 goBin = `c:\\go\\bin\\go` 58 } 59 60 cmd := exec.Command(goBin, "build") 61 62 cmd.Args = append(cmd.Args, "-o", output) 63 64 if race { 65 cmd.Args = append(cmd.Args, "-race") 66 } 67 68 if ldFlags != "" { 69 cmd.Args = append(cmd.Args, "-ldflags=\""+ldFlags+"\"") 70 } 71 cmd.Args = append(cmd.Args, source) 72 cmd.Stdout = os.Stdout 73 cmd.Stderr = os.Stderr 74 cmd.Env = []string{ 75 "PATH=" + strings.Replace(os.Getenv("PATH"), `\`, `\\`, -1), 76 "GOPATH=" + strings.Replace(os.Getenv("GOPATH"), `\`, `\\`, -1), 77 "GOROOT=" + runtime.GOROOT(), 78 } 79 80 if runtime.Compiler != "gccgo" { 81 cmd.Env = append(cmd.Env, 82 "GOOS="+system, 83 "GOARCH="+arch) 84 } 85 86 fmt.Println(strings.Join(cmd.Env[1:], " "), strings.Join(cmd.Args, " ")) 87 if err := cmd.Run(); err != nil { 88 fmt.Printf("problem building %s: %v\n", output, err) 89 os.Exit(1) 90 } 91 }