tmp/autoconf/クロスコンパイル

configure のオプション(--host, --build, --target) → http://d.hatena.ne.jp/maminus/20100129

わかりやすいってすばらしい。

--build コンパイルPC
--host makeして作ったプログラムの実行環境
--target クロス開発におけるターゲット環境

いっつも build と host が逆に思えてしまって間違えるのだよな、感覚的に…。
まあ「ビルドマシン」みたいな言い方があることを考えたら自ずと host がその逆だと気づけそう。気づいてゆきたい。target はいかにもな名前で思わせぶりだけど(それこそクロスコンパイラ的なやつでもない限り)滅多に使わないようです…。

本家 autoconf マニュアルの該当部分→ 14.1 Specifying target triplets

まあ、部分的におおまかにフィーリング無断翻訳すると…


ほかに、ユーザーはコマンドライン引数でシステム名(system type)を configure に指定することもできます。これが必要になるのはクロスコンパイル時です。クロスコンパイルの最も複雑なケースでは3つのシステム名が必要とされます。

--build=build-type
パッケージを設定(configure)し、コンパイルするシステム名です。デフォルトでは config.guess の実行結果となります。host-type と異なる build-type を指定するとクロスコンパイルモードが有効になります。
--host=host-type
パッケージが動作するシステム名です。デフォルトではビルドマシンと同じです。build-type と異なる host-type を指定し、さらに build-type を(--build オプションで)明示的に指定するとクロスコンパイルモードが有効になります。
--target=target-type
パッケージ内のコンパイラツールがどのシステム向けにコード生成をするのかを指定するシステム名です。デフォルトでは host と同じです。

config.guess の判定結果を上書きしたい場合は --host ではなく --build を使います。 --host ではクロスコンパイルが有効になってしまうからです。 歴史的理由により、--host を指定する際は、とにかく必ず --build も指定してください(将来は修正されるはずです)。
つまり、クロスコンパイルモードに入るには、以下のようなコマンドを使います。

./configure --build=i686-pc-linux-gnu --host=m68k-coff

ちなみに --host を指定していないとき、指定したコンパイラの生成したコードが(ビルドマシン上で)実行できない場合は configure が失敗します。たとえば以下のような configure は(x86 Linux 上では)失敗します。

./configure CC=m68k-coff-gcc