HomebrewでGo 1.5にアップデート
Macのパッケージ管理には、Homebewを使っている。
普段開発で使っているGoのバージョンを1.5(正確には既に1.5.1だが)に上げる必要があり、いつもどおり$ brew upgrade go
したのだが、その直後から以下のエラーが発生するようになった。
$ go test -v
"package runtime: C source files not allowed when not using cgo or SWIG: atomic_amd64x.c defs.c float.c heapdump.c lfstack.c malloc.c mcache.c mcentral.c mem_darwin.c mfixalloc.c mgc0.c mheap.c msize.c os_darwin.c panic.c parfor.c proc.c runtime.c signal.c signal_amd64x.c signal_unix.c stack.c string.c sys_x86.c"
原因の調査
Go 1.5ではC言語で書かれたコードが削除されたにもかかわらず、Go 1.4系の環境を参照してしまっているということかな? と推測。
まずGoが参照しているGOROOT
が何かを調べてみた。
$ go env GOROOT
/usr/local/Cellar/go/1.4.2/libexec`
案の定1.4系を参照している。
あれ、でも環境変数でGOROOT
なんて設定してたっけ? と、.zshrcを見てみるも、そんな記述はない。
と、ここで気づく。
単にアップデート後、シェルを起動しなおしてなかっただけだと…
対策
単にシェルを再起動するだけ…
でもまた、同じ事を繰り返したくないので、
export GOROOT=$(brew --prefix go)/libexec
とでもしておこうか。
昔のGoは別として、今のGoはツールチェーン自体をビルドする際に標準インストールパス(Homebrewの場合は/usr/local/Cellar/go/1.5.1/libexec
)が埋め込まれているので、そこにインストールしている限りGOROOT
は設定しなくて良い。なので、GOROOT
を明示的には設定してなかった。
でも、パスにバージョン番号が含まれてしまっているので、アップデート後にシェルを起動し直さないと参照パスが切り替わらない。
そこで、brew --prefix go
で返ってくる /usr/local/opt/go
(これは/usr/local/Cellar/go/<バージョン>
へのシンボリックリンク)を使って明示的に指定することで、brewでアップデートすれば自動的に参照先も切り替わるようにしておく。
ついでに、$ brew cleanup go
して、古い環境も削除しておいた。