来世から頑張る!!

技術ブログを目指して

WindowsでGoのクロスコンパイル環境構築(Go Ver 1.5専用)

さすがはWindows!ひと手間かけたおいしさだぜ!!

経過をメモっているので、最後だけ読めば事足りるよ!!

参考にしたのはこのあたり

Go のクロスコンパイル環境構築 - Qiita
Windows7 64bit版でGo言語のクロスコンパイルを試す - taknb2nchのメモ

どうして試行錯誤時にずっと見てたページって再度ググると全然出てこないんだろう?
なんか英語のall.bashを実行してとかそういうページをずっと見ながらやってたんだけど、 見つからないのでリンクを貼れない。公式っぽいページ。

前提

Windowsユーザーなのでgccは使いません。

なのでcgoと呼ばれるCで作られたと思わしきgoは使えません。

前作業

Go1.5をインストロールします。

golang downloadってbingに入力すれば、msiみたいなのを入手できます。

適当にC:\Goとかに入れます。たぶんデフォルトでそうなってたから。

環境変数としては、GOROOT=C:\Goがセットされている状態になっていることを確認してください。

Goのコンパイヨ

クロヌコンパイヨに使用するコマンド自体はGOOS=[OS名] GOARCH=[ARCH名] go ~と簡単なのですが、 この使用したいGOOSとGOARCHの組み合わせ毎にGOそのものをコンパイヨしておく必要があります。

以後の記述が面倒なので、GOOS=darwin, GOARCH=amd64に限定して進めます。

コンパイヨはGOROOT\srcフォルダーに移動して、以下のコマンドを実行!!

GOOS=darwin GOARCH=amd64 make.bash

すると、たとえbashがある環境でもWindowsではmake.bat使えよって怒られるので、 コマンドプヨンプヨを開いて実行します。

SET GOOS=darwin
SET GOARCH=amd64
make.bat

はい。3行です。1行では実行できません。

上記コマンドを実行すると、BootStrap用のGOがないよと怒られます。
なんか設定がないと、%UserProfile%\Go1.4をBootStrapのrootと認識するようです。

GOROOT_BOOTSTRAPの設定

これは今からコンパイヨしようとしているGoをコンパイヨするためのGoなので、 もう1個Goの塊が必要?なのです。
SET GOROOT_BOOTSTRAP=%GOROOT%としても動くのかは確認していません。

1.4を落としてくるのも面倒なので、C:\Goを丸々コピーしてC:\GoBootを作ります。

そして、GOOROOT_BOOTSTRAPを設定して実行!!

SET GOOS=darwin
SET GOARCH=amd64
XCOPY /S /E /F /G /H /R /K /Y C:\Go C:\GoBoot
SET GOROOT_BOOTSTRAP=C:\GoBoot
make.bat

GOOSとかは設定済みであれば再度設定する必要はありません。

これでできるかと思いきや、gccがないからcgoが作れないよ!!と怒られます。

CGOを作らない

作れないなら作らなきゃいいじゃない!!ということで、 CGO_ENABLEDを0に設定します。

SET GOOS=darwin
SET GOARCH=amd64
XCOPY /S /E /F /G /H /R /K /Y C:\Go C:\GoBoot
SET GOROOT_BOOTSTRAP=C:\GoBoot
SET CGO_ENABLED=0
make.bat

あ、同じく一度やったやつは再実行しなくて大丈夫です。

これでコンパイヨに成功するはず!!

少なくともうちではしました。

これで

SET GOOS=darwin
SET GOARCH=amd64
go build hello.go

とかが可能になります。

ちなみにマックは高いので持ってません。

おまけ

なぜか頑張ってコマンヨプヨンプヨで実行したけど、 よくよく考えればgoをやっているみんなはgit for Windowsとか入れているはずなので、 git bash使って以下の処理でいいような気がする。

cp -r C:\Go C:\GoBoot
GOOS=darwin GOARCH=amd64 GOROOT_BOOTSTRAP=C:\GoBoot CGO_ENABLED=0 make.bat

試してないのでうまく動かないかもしれないけど。

goコマンド実行時も、SET GOOS=???とか実行してしまうと元に戻さないといけないので、 bashで1行で書いたほうが良さげです。

あ、GoBootはいらなくなったら消す方がいいと思う。 お好みで。