この記事はQiitaで公開されていました
macOS SierraでソースからGoをコンパイルできなくて調べた内容です。macOSなら公式からバイナリパッケージが提供されているので、自分でコンパイルしなくてもそれを使えばいいだけなのですが、他の環境でも使える内容だったので書いてます。
めんどくさい人用のまとめ
- バイナリパッケージを使いましょう
前提
Go 1.5から、Go自身でコンパイラを記述するようになっているので、ソースからビルドするときに前バージョンのGoコンパイラが必要です。(デフォルトでは~/go1.4
)
macOS Sierraでは、Go 1.6.3または1.7以上でなければうまく動作しません。
なので~/go1.4
を使ってソースからGoをビルドすると、~/go1.4
のコンパイラ自体がクラッシュします。
具体的には、go_bootstrapのコンパイル時に、
failed MSpanList_Insert 0xXXXX 0xXXXX 0x0 fatal error: MSpanList_Insert
のようなエラーで停止します。なので最新のソースからGoコンパイラをビルドするために、~/go1.4
を1.6.3以上のバージョンで置き換える必要があります。
Go 1.7の準備
手元の環境(macOS Sierra)では動かないことがわかったので、まずはLinux環境を用意します。ここではDockerを使っていますが、他のOSで作業をする場合も違いはありません。
$ docker run -ti --rm -v $(pwd):/mnt/term golang:1.7.1
コンテナが起動したら、手順で必要になるツール類をインストールします。(以下、bash$
プロンプトはコンテナ内で実行するコマンドを表します)
bash$ apt-get update bash$ apt-get install bzip2
あとはソースをビルドするだけなのですが、ターゲットとなる環境のGOOS
とGOARCH
を忘れないようにしましょう。macOSで使うコンパイラが必要なので、ここではdarwinとamd64です。
bash$ git clone https://github.com/golang/go.git bash$ cd go/src bash$ GOOS=darwin GOARCH=amd64 GOROOT_BOOTSTRAP=/usr/local/go ./bootstrap.bash
ビルドが終わったら、2つ上のディレクトリにアーカイブが作られているのでそれをmacOSで~/go1.7
に展開します。
bash$ mv ../../go-darwin-amd64-bootstrap.tbz /mnt/term/ $ bunzip2 go-darwin-amd64-bootstrap.tbz $ tar xf go-darwin-amd64-bootstrap.tar $ mv go-darwin-amd64-bootstrap ~/go1.7
ここまで終わったらコンテナは不要です。macOSに戻って、以前の~/go1.4
の代わりに~/go1.7
を使ってコンパイラをビルドしましょう。
$ GOROOT_BOOTSTRAP=~/go1.7 ./all.bash