Cross Compiling Golang

Mike Kusold / @mikekusold

Why?

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

Supported Platforms

$GOOS		$GOARCH
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 https://go.googlesource.com/go
cd go/
git checkout go1.4.2
cd src/

Build for your $GOHOSTOS

./all.bash

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

Verification

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

Sample Go App

package main

import (
    "fmt"
    "os/user"
)

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

Demo

The Easy Way

gox

github.com/mitchellh/gox

Using gox

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

Thank you

@mikekusold