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  }