moznion.hatenadiary.com


別にDocker使ったっていいんだけど、こっちでもできますよ、ってことで、Dockerもシェルスクリプトも使わない方法の説明。元記事を読んでわかるのは:

1. makeを使ってる
2. GOOS/GOARCHを設定してクロスコンパイルしている(gox等を使っていない)
3. Dockerであげた同一イメージ上で全てのクロスコンパイル結果を吐いている

ということなので、であれば別にローカルの環境でクロスコンパイルしても何の差もなさそう。別の環境をたててクロスコンパイルしたい場合もあるが、それは例えば cgoを使っている os.User 関連のコードをコンパイルするとか、そういう時だしその場合はそれぞれのプラットフォームごとに別のホスト上でコンパイルする必要がある。それをする必要がないなら go 1.5 以降であればもうGOOS/GOARCHを設定するだけで充分。

makeはプラットフォームごとの出力を作るなんてお手の物で、pecoではMakefile内でまず以下のように明示的に現環境でのGOOS/GOARCHを定義して、

peco-make-vars


必要な変数を与えてやれば適当なプラットフォーム用のバイナリを吐いてくれるルールを作ってる

peco-build-rule-main

このルールだけであとはこれを対象GOOS/GOARCHに対して実行するだけ。手動で実行したかったら "make build GOOS=darwin GOARCH=amd64"とかするだけ。でももちろんそんなことを手動で実行したくなりので、それを内包したルールを何個か作る。

以下ではループを使ってもいいんだけど、僕の「なんかまちがったのを設定した場合エラーになってほしい」というこだわりから全て別ルールにしてる

peco-build-rules


あとはこれを依存対象としたルールを作れば勝手に全部ビルドされる。以下の場合は"make all"とすれば全てのバイナリが作成される。もちろん一個だけ実行したい場合は"make build-darwin-amd64"とかを実行してもいい

peco-build-all

こちらからは以上です