Go言語(golang)でTUIアプリを作ろう 第二部入魂編 ( その6 クロスコンパイル環境の整備 )
コンパイル用のMakefileを作成する。
これまで、golangプログラムの実行は、
go run cmd/main.go
のように実行してきましたが、これはプログラムのコンパイルと実行を同時に行う便宜的なコマンドにすぎません。
golangのコンパイルコマンド
golangは、本来コンパイラ言語ですから、コンパイルと実行を下記のように別のプロセスで行う必要があります。
go build -o listdbg cmd/main.go
./listdbg
go buildコマンドが、golangのソースをオブジェクトにコンパイルするコマンドであり、ーoオプションで指定した名前で実行ファイルを生成します。
この例の実行ファイル、listdbgは独立オブジェクトですので、実行時に必要になるのはこのファイルだけで、開発に使用したgolang環境などは、すべて不要となります。このあたりが、Pythonのようなインタープリタとは大きく異なる特徴であり、コンパイラであるgolangの大きなメリットとなるわけです。
他環境のオブジェクトを生成
さらにgolangでは、他環境のオブジェクトを生成することができます。
例えば、Linux amd64環境で、ARM用のオブジェクトや、Windows環境(32ビット、64ビット)用の実行オブジェクトを生成することが可能なのです。
このように、1つのソースコードから様々なOS向けのバイナリを生成する機能をクロスコンパイルと呼びます。
golangコンパイラで実行オブジェクトを生成できるアーキテクチャーは、下記のコマンドで確認できます。
$ go tool dist list
aix/ppc64
android/386
android/amd64
android/arm
android/arm64
darwin/amd64
darwin/arm64
dragonfly/amd64
freebsd/386
freebsd/amd64
freebsd/arm
freebsd/arm64
illumos/amd64
ios/amd64
ios/arm64
js/wasm
linux/386
linux/amd64
:
:
上記の組み合わせを、環境変数GOOSとGOARCHで指定することで、異なる環境のオブジェクトをコンパイルすることが可能です。
例えば、Windows64ビット向けのオブジェクトを生成したい場合は、下記となります。
GOOS=windows GOARCH=amd64 go build -o listdbg cmd/main.go
クロスコンパイルの実行
各環境のクロスコンパイルを容易に実行するため、今回はMakefileを用意しました。下記のコマンで各環境のオブジェクト生成ができます。なお、開発環境はLinux amd64を前提にしています。
コマンド | 環境 | ファイルの配置 |
---|---|---|
make build | GOOS=linux GOARCH=amd64 | ディレクトリに実行ファイルとShellを生成。同時にtargetディレクトリに、listdbg.tgzを作成 |
make build-win64 | GOOS=Windows GOARCH=amd64 | targetディレクトリに、listdbg_win64.tgzを作成 |
make build-win32 | GOOS=Windows GOARCH=386 | targetディレクトリに、listdbg_win32.tgzを作成 |
make build-arm6 | GOOS=Linux GOARCH=arm GOARM=6 | targetディレクトリに、listdbg_arm6.tgzを作成 |
make build-arm7 | GOOS=Linux GOARCH=arm GOARM=7 | targetディレクトリに、listdbg_arm7.tgzを作成 |
make build-arm64 | GOOS=Linux GOARCH=arm64 | targetディレクトリに、listdbg_arm64.tgzを作成 |
他環境での実行に当たっては、上記で作成されたアーカイブファイル(tgz)を適当なディレクトリ内にコピーし、tarで解凍します。
次回は、様々な環境での実行例を紹介します。
ソースコードについて
Makefileは、前回のListDBGに登録されています。