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  
      :  
      :  

上記の組み合わせを、環境変数GOOSGOARCHで指定することで、異なる環境のオブジェクトをコンパイルすることが可能です。
例えば、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に登録されています。