読者です 読者をやめる 読者になる 読者になる

Homebrewでgoogle-goをインストールしたときにハマった話

Homebrewでgoogle-goをインストールしたときにハマった話

むかーしむかし大学生時代に、発表されて間もないGo言語をインストールしたことがあったんだけど、 しばらく放置してて3,4年経ってまた触り始めました。

当時はソースビルドしてインストールしてたんですが、今回はHomebrewで楽ちんインストールできて快適かとおもいきや、 いくつかハマったので覚書程度にメモ

ハマった点&解決編

$ brew install go
$ go run hello.go

だけで動くとおもいきや、

go build runtime: darwin/386 must be bootstrapped using make.bashs

とエラーが出て怒られる始末。 大昔にgoが発表されてインストールして以来go触ってなかったので、どうなってるかよくわからなかった。

で、調べた結果、goの環境変数の値が悪くて実行方法が違ってたという原因だった。

$ go env GOARCH
386

brewでinstallしたgoは darwin/amd64 だったが、goは実行時に環境変数見るらしく、インストールされていない darwin/386コンパイラを使おうとしていたということだった。

なので

$ export GOARCH=amd64
$ go run hello.go

なり

$ GOARCH=amd64 go run hello.go

なりで解決。

調査編

よくわかってなかったので、色々調査してみた。

go env

そもそも、どういう環境変数が使われてるのかを調べるには、go envコマンドを使えばいいらしい。

$ go env
GOARCH="amd64"
GOBIN=""
GOCHAR="6"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH=""
GORACE=""
GOROOT="/usr/local/Cellar/go/1.3/libexec"
GOTOOLDIR="/usr/local/Cellar/go/1.3/libexec/pkg/tool/darwin_amd64"
CC="clang"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fno-common"
CXX="clang++"
CGO_ENABLED="1"

出力してくれる一覧はこれだけだが、他にもあるかも。

何故おれのGOARCHのデフォルトが386だったのか

先にオチを。秘伝のタレは見えないところに・・・。

# GOROOT=/opt/local/lib/go
# GOBIN=/opt/local/bin
GOOS=linux
GOARCH=386

oh...俺の数日間は何だったんだ・・・・。 大学時代の.zshrcに引きずられてただけだった。(´・ω・`)

ロスコンパイルの話

Goは、環境さえあれば他環境のバイナリも生成することができます。 ただ、デフォルトのインストールではできないので、いったんhomebrewでアンインストールしてから、 オプション付きで再インストールする必要がある。

brew uninstall 
brew install go --cross-compile-common
# or
brew install go --cross-compile-all

commonとallの違いは、common は darwin/windows/linux OS用コンパイラだけインストールされ、allはopenbsdplan9等のOS用コンパイラもインストールされる。

詳しくはこちら Go のクロスコンパイル環境構築 - Qiita

いま悩んでること

ライブラリ作るときのディレクトリってどうしてるんだろう・・・。 考えられるのが

  • $GOPATH/src 以下で直接編集
  • 別ディレクトリでゴニョゴニョして$GOPATH問題どうにかしてる

$GOPATH/src/github.com ってディレクトリ切らないといけないっぽくて、色々面倒そうなきもする。。。どうなんだろう