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

tmp/autoconf/クロスコンパイルの補足。

気の迷いで(?)2.71の該当部分ドキュメントも野良翻訳してしまったので投棄してみたり…(完全手動翻訳ですが正確性についてはぶっちゃけ保証できたものではありません…)

※文中に出てくるスクリプトの例は、x86_64のLinux上で実行することが想定されていると思われます…


14.1 Specifying target triplets

Autoconfが生成するconfigureスクリプトは、正規化されたシステムタイプ、もしくはターゲット3連句(triplet)を元にして動作の決定を行うことがあります。 3連句の形式は'cpu-vecdor-os'の形をとり、osの部分は'system'あるいは'kernel-system'となることがあります。

configureは通常の場合、自分が現在動作しているシステムタイプの正規名を予想することができます。 予測を行うためにconfigureはconfig.guessというスクリプトを呼び出します。 これはunameコマンドやCプリプロセッサが定義しているシンボルを使って名前の推測を行うものです。

そのほかに、ユーザーがconfigureに対してコマンドライン引数でシステムタイプを指定することもできます(Specifying the System Typeを参照)。 クロスコンパイルを行う際にはこの操作が必須となります。 クロスコンパイルのもっとも複雑なケースでは3つのシステムタイプが必要になります。 指定するオプションは

--build=build-type
当該パッケージの設定(configure)とコンパイルを行うシステムの種別。指定しないとconfig.guessの実行結果が使われる。host-typeと異なるbuild-typeを指定することでクロスコンパイルモードが有効になる。
--host=host-type
当該パッケージが動作するシステムの種別。 デフォルトではビルドを行うマシンと同じ。バイナリのビルドと加工に利用されるツールは、デフォルトではすべて先頭に host-type- がつき、host-type-gccやhost-type-g++、host-type-ar、host-type-nmなどのようになる。これらのツールによって作られたバイナリがビルドを行うシステムで実行可能なものであるならば、configureスクリプトはAC_RUN_IFELSE内でそれを利用する。そうでない場合はクロスコンパイルモードが有効となる。指定したhost-typeがbuild-typeと異なり、なおかつbuild-typeを明示的に指定すると、やはりクロスコンパイルモードが有効になる。
--target=target-type
当該パッケージ内にあるコンパイラのツールがコード生成の対象とするシステムの種別(めったに必要とされない)。デフォルトではhostと同じ。

config.guessの結果は替えたいけれど、ビルドマシン用のバイナリをそのまま作りたいということであれば、--hostではなく--buildを使用します。

ということで、たとえば64-bit MinGW用のバイナリを作るには、このようなコマンドを使います。

./configure --host=x86_64-w64-mingw64

システムがMinGWのバイナリを実行できるようになっているけれどもその機能は使わず、そのかわりクロスコンパイルということにしたい場合は、このようなコマンドを使います。

./configure --build=x86_64-pc-linux-gnu --host=x86_64-w64-mingw64

--hostを指定していない場合、コンパイラの生成したコードが(ビルドするシステム上で)動作しないとconfigureが失敗する点に注意してください。 たとえば以下のようにconfigureを行うと失敗します。

./configure CC=x86_64-w64-mingw64-gcc

クロスコンパイル時、名前の先頭にhost-typeがついていないツール(コンパイラ、リンカ、アセンブラ)に対してconfigureは警告を出します。 これはユーザーがクロスコンパイルを行うための補助です。 上記の例を続けると、CCに指定されたクロスコンパイラがネイティブ(そのビルドシステム用)のpkg-configと一緒に使われている場合、pkg-configの見つけたライブラリが微妙なビルドエラーを引き起こしたりするのです。 しかしx86_64-w64-mingw64-gccとx86_64-w64-mingw64-pkg-configという名前を使えば混乱を避けられます。 クロスツールの名前がつけられた正しいsymlinkを作ることで簡単に警告を回避することができます。

configureは多数のシステムタイプの短縮形エイリアスを認識します。 たとえば'decstation'は'mips-dec-ultrix4.2'の代わりに使うことができます。 configureはconfig.subというスクリプトを実行してシステムタイプのエイリアスを正規化します。