Cross Compiling Golang

Mike Kusold / @mikekusold


  • Code once, user everywhere
  • Development speed
  • Reduced infrastructure

Supported Platforms

darwin		386
darwin		amd64
dragonfly	386
dragonfly	amd64
freebsd		386
freebsd		amd64
freebsd		arm
linux		386
linux		amd64
linux		arm
netbsd		386
netbsd		amd64
netbsd		arm
openbsd		386
openbsd		amd64
plan9		386
plan9		amd64
solaris		amd64
windows		386
windows		amd64

Setting up the toolchain

The hard way

Get the source code

git clone
cd go/
git checkout go1.4.2
cd src/

Build for your $GOHOSTOS


Build for each of your targets

# 64 bit OSX
GOOS=darwin GOARCH=amd64 CGO_ENABLED=1 ./make.bash
# 32 Bit Windows
GOOS=windows GOARCH=386 CGO_ENABLED=1 ./make.bash
# Raspberry Pi
GOOS=linux GOARCH=arm GOARM=5 CGO_ENABLED=1 ./make.bash


$ ls ../bin/
darwin_amd64  linux_arm  windows_386  go  gofmt

Sample Go App

package main

import (

func main() {
	// Get Current User
	currentUser, err := user.Current()
	if err != nil {
		fmt.Println("Error: " + err.Error())

	fmt.Println("My home dir is: " + currentUser.HomeDir)

Building the app

go build sampleApp.go
GOOS="windows" GOARCH="386" ./go/bin/go build sampleApp.go


The Easy Way


Using gox

gox -build-toolchain
gox -osarch="darwin/amd64 linux/amd64 windows/amd64"

Thank you