Goはクロスコンパイルが簡単

homebrewGo用のレシピ を見た人は、その中にこんなオプションが定義されているのに気がついたかもしれない:

option 'cross-compile-all', "Build the cross-compilers and runtime support for all supported platforms"
option 'cross-compile-common', "Build the cross-compilers and runtime support for darwin, linux and windows"

Goはクロスコンパイルが可能なようにビルドしておけば、簡単に他の環境で動くバイナリを作ることができるようになっているらしい。 Goがダイナミックライブラリに依存しない実行バイナリを作るという特徴と併せて考えると非常におもしろい(そして、使える)機能だと思う。

たとえば Rasberry Pi 用のバイナリをMacから簡単に生成することができる。 こういう貧弱なデバイス自体に開発環境を入れることなく、動くバイナリを(しかも簡単に)生成できるのは大きなメリットとなりそうだ。

クロスコンパイルできるようにする

homebrewでGoを入れている人は

brew install go --cross-compile-common

もしくは

brew install go --cross-compile-all

とするだけ。

レシピを見る限り、commonはLinuxとWindowsへのクロスコンパイルをサポート、allはそれに加えてFreeBSDとOpenBSDもサポートしている模様。

他の環境の人は An introduction to cross compilation with Go という記事があったのでここを参照すると良さそうだ。

クロスコンパイルする

これがまた簡単で、 GOOSGOARCH 環境変数を指定するだけというお手軽さ。

Linux - amd64 用のバイナリを作るには、

GOOS=linux GOARCH=amd64 go build hello.go

とかすれば良い。

linux-armの場合は、追加で GOARM 環境変数を指定することでARMのバージョンなどを指定できるようだ。[1]

あとは、できたバイナリを、対象の環境にもっていくだけで実行することができる。素晴しい!