Go edit forum

Cross compilation

Introduction

Go compiler can create native executable binaries for many operating system: Windows, Mac OS X, Linux, Android, iOS and a few lesser known like plan9, solaris, freebsd, openbsd, netbsd, dragonfly.

It also supports multiple architectures (CPUs) for the same operating system e.g. it can generate both 32-bit and 64-bit Windows binaries or intel, arm, ppc, mips Linux binaries.

Better yet, the toolchain supports cross-compilation i.e. you can create a Linux or Mac binary on Windows etc.

Cross-compilation is very easy but only for pure Go code. It doesn't work when program links a C library via CGO,

Basics of cross-compilation

By default go build generates binary that matches the system on which the compiler is running. I.e. if you run it on Linux OS with intel 64-bit CPU, it'll generate an executable for Linux OS and 64-bit Intel CPU.

To make it compile for a different OS, set GOOS environment variable.

To make it compile for a different architecture (CPU), set GOARCH environment variable.

To see what is their current value, run go env.

Valid values for GOOS: android, darwin, dragonfly, freebasd, js, linux, netbsd, openbsd, plan9, solaris, windows.

Value darwin represents Mac OS and iOS. Value js represents compiling for Web Assembly.

Valid values for GOARCH: arm, arm64, 386, amd64, ppc64, ppc64le, mpis, mpisle, mps64, mips64le, s390x ,wasm.

Value 386 represents 32-bit Intel-compatible CPU and amd64 is 64-bit Intel-compatible CPU. Value wasm is for Web Assembly.

Not all combinations of GOOS and GOARCH are valid. To see all possible combinations run go tool dist list.

Example cross-compilation from Linux or Mac

Here's how to compile e.g. for 32-bit Windows on Linux or Mac: GOOS=windows GOARCH=386 go build

This temporarily sets GOOS and GOOARCH to desired values and runs go build.

We can also set them for the lifetime of shell session with export GOOS=windows.

Example cross-compilation from Windows

On Windows, when using PowerShell and cross-compiling to Linux and 64-bit arm processor:

$Env:GOOS = "linux"
$Env:GOARCH = "arm64"
go build

Beware than $Env:GOOS = "linux" sets GOOS variable for the duration of PowerShell session i.e. it'll affect all future go build invocations.

Cross-compiling with gox

If you need to cross-compile to all possible architectures, you can use https://github.com/mitchellh/gox.

  ↑ ↓ to navigate     ↵ to select     Esc to close