Add support for GOARM parameter when cross compiling

Go can cross compile to older ARM architectures (e.g. v5). In order to
do so one needs to use the GOARM parameter as documented in
https://github.com/golang/go/wiki/GoArm
This commit is contained in:
Jean-François Paris 2018-02-04 14:06:13 +00:00
parent aa333f4d49
commit e86fb5eedd
2 changed files with 12 additions and 2 deletions

View File

@ -193,6 +193,7 @@ func showUsage(output io.Writer) {
fmt.Fprintf(output, " --enable-cgo use CGO to link against libc\n") fmt.Fprintf(output, " --enable-cgo use CGO to link against libc\n")
fmt.Fprintf(output, " --goos value set GOOS for cross-compilation\n") fmt.Fprintf(output, " --goos value set GOOS for cross-compilation\n")
fmt.Fprintf(output, " --goarch value set GOARCH for cross-compilation\n") fmt.Fprintf(output, " --goarch value set GOARCH for cross-compilation\n")
fmt.Fprintf(output, " --goarm value set GOARM for cross-compilation\n")
} }
func verbosePrintf(message string, args ...interface{}) { func verbosePrintf(message string, args ...interface{}) {
@ -218,13 +219,16 @@ func cleanEnv() (env []string) {
} }
// build runs "go build args..." with GOPATH set to gopath. // build runs "go build args..." with GOPATH set to gopath.
func build(cwd, goos, goarch, gopath string, args ...string) error { func build(cwd, goos, goarch, goarm, gopath string, args ...string) error {
a := []string{"build"} a := []string{"build"}
a = append(a, "-asmflags", fmt.Sprintf("-trimpath=%s", gopath)) a = append(a, "-asmflags", fmt.Sprintf("-trimpath=%s", gopath))
a = append(a, "-gcflags", fmt.Sprintf("-trimpath=%s", gopath)) a = append(a, "-gcflags", fmt.Sprintf("-trimpath=%s", gopath))
a = append(a, args...) a = append(a, args...)
cmd := exec.Command("go", a...) cmd := exec.Command("go", a...)
cmd.Env = append(cleanEnv(), "GOPATH="+gopath, "GOARCH="+goarch, "GOOS="+goos) cmd.Env = append(cleanEnv(), "GOPATH="+gopath, "GOARCH="+goarch, "GOOS="+goos)
if goarm != "" {
cmd.Env = append(cmd.Env, "GOARM="+goarm)
}
if !enableCGO { if !enableCGO {
cmd.Env = append(cmd.Env, "CGO_ENABLED=0") cmd.Env = append(cmd.Env, "CGO_ENABLED=0")
} }
@ -397,6 +401,7 @@ func main() {
targetGOOS := runtime.GOOS targetGOOS := runtime.GOOS
targetGOARCH := runtime.GOARCH targetGOARCH := runtime.GOARCH
targetGOARM := ""
var outputFilename string var outputFilename string
@ -430,6 +435,9 @@ func main() {
case "--goarch": case "--goarch":
skipNext = true skipNext = true
targetGOARCH = params[i+1] targetGOARCH = params[i+1]
case "--goarm":
skipNext = true
targetGOARM = params[i+1]
case "-h": case "-h":
showUsage(os.Stdout) showUsage(os.Stdout)
return return
@ -514,7 +522,7 @@ func main() {
"-o", output, config.Main, "-o", output, config.Main,
} }
err = build(filepath.Join(gopath, "src"), targetGOOS, targetGOARCH, gopath, args...) err = build(filepath.Join(gopath, "src"), targetGOOS, targetGOARCH, targetGOARM, gopath, args...)
if err != nil { if err != nil {
die("build failed: %v\n", err) die("build failed: %v\n", err)
} }

View File

@ -113,6 +113,8 @@ supply the target OS and platform via the command-line options like this
$ go run build.go --goos freebsd --goarch 386 $ go run build.go --goos freebsd --goarch 386
$ go run build.go --goos linux --goarch arm --goarm 6
The resulting binary is statically linked and does not require any The resulting binary is statically linked and does not require any
libraries. libraries.