Go のバージョンマネージャー gvm で gvm install したら「ERROR: Failed to compile」って言われた時

github.com

issue には上げたけど日本語でも書く。 結果から言うと自分が README.md よく読んでなかっただけ。 でも gvm ももうちょっと気を利かせてくれてもいいのになーと思ったので上の issue でお願いしたという経緯です。

解決法

Go 1.5 以上をコンパイルする場合は GOROOT_BOOTSTRAP って環境変数を定義する必要があります。 これは .bash_profile かなんかで

export GOROOT_BOOTSTRAP=$GOROOT

して gvm install すればいいのですが、「GOROOT?そんなん定義したことないんだけど…」って人もいるかと思います (現に今は GOROOT 環境変数定義する必要はないらしいです)。

GOROOTJava にとっての JAVA_HOME みたいなもので、go コマンド等のベースパスを指定するものです。

で、じゃあどうすればいいのかというと、go コマンド自体に聞いてしまえばいいとのこと。

export GOROOT_BOOTSTRAP=$(go env GOROOT)

これで GOROOT_BOOTSTRAP には go コマンド等のベースパスが入ります。 もちろん go コマンドに PATH が通ってないとダメなので後述するように先に PATH を設定してやります。

どう設定すればいいか

自分の Go 関連の .bash_profile を載せておきます(今回の話に関係ないのもありますが)。

# Go 1.5 以下で vendoring が有効になる
# http://yoru9zine.hatenablog.com/entry/2016/02/02/054922
export GO15VENDOREXPERIMENT=1

if true; then
  # gvm の go コマンドを使う
  [[ -s "/home/tyru/.gvm/scripts/gvm" ]] && source "/home/tyru/.gvm/scripts/gvm"
  export GOROOT_BOOTSTRAP=$(go env GOROOT)
else
  # system 標準の go コマンドを使う
  export GOPATH="$HOME/go"
  export PATH="$GOPATH/bin:$PATH"
fi

true, false で gvm の Go か system の Go かを切り替えられるようにしてあります。