Go

Sierraでgo1.7.3のコンパイル

More than 1 year has passed since last update.

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

あとはソースをビルドするだけなのですが、ターゲットとなる環境のGOOSGOARCHを忘れないようにしましょう。macOSで使うコンパイラが必要なので、ここではdarwinamd64です。

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

参考