次: , 前: New Macros, 上: Autoconf 2.13


15.6.3 ホストとクロスコンパイル

コンパイラ作者の経験とそれ以降の長期にわたる公開討論を基にして,一連のク ロスコンパイルの多くの面が変更されました.


ビルド,ホスト,そしてターゲットアーキテクチャタイプの違いに関連すること は解決しています.一連のデフォルトは,現在は単純です.ターゲットのデフォ ルトはホスト,ホストはビルド,そしてビルドはconfig.guess の結 果となっています.それにもかかわらず,2.13から2.50へ容易に変換するために, 以下の変換手法が実装されています.それは,リリースの組を完全に利用不可能 にすることはできないので,それに依存しないでください (直すより問 題が生じることが多いので,我々はそれを維持することは不可能です).

--buildまたは--hostで指定しない限り,すべてのデフォル トはconfig.guessの実行結果になります.指定する場合は,デフォル トは指定したシステムタイプになります.両方を指定していて異なっている場合, テストと要求された実行物をの実行しないように,configureはクロ スコンパイルモードになります.

ヒント:config.guessの結果に優先させたい場合は, --hostではなく--buildの方が好ましくなっています.将来 は,--hostでビルドシステムタイプを優先しなくなるでしょう. --hostを指定する場合も,確実に--buildも指定してください.


下位互換性のため,configureはシステムタイプ自身をオプションと して受け入れます.そのようなオプションは,ビルド,ホスト,そしてターゲッ トのシステムタイプのデフォルトに優先されます.以下のコンフィグレーション 命令では,NetBSD/alphaで実行するのですが,ビルドプラットフォー ムにもなるGNU Hurd/sparcのコードを生成する一連のクロスツールが コンフィグレーションされます.
     ./configure --host=alpha-netbsd sparc-gnu

Autoconf 2.13とそれ以前では,変数buildhost,そして targetは,AC_CANONICAL_BUILDの呼び出しの前後で異なる意味を 持っていました.現在は,--buildの引数を指定することで,それは厳 密な意味でbuild_aliasにコピーされ,それ以外では空のままになります. AC_CANONICAL_BUILDの後で,buildは標準的なビルドタイプに設 定されます.変換を容易にするため,以前の内容は,build_aliasと同じ です.この壊れた機能に依存しないように してください.

下位互換性を考慮した手法は上のようになり,--hostが指定されてい て,--build指定されていないときは,ビルドシステムは --hostと同じだと仮定され,`build_alias'がその値として設定 されます.最終的には,この歴史的に間違っている動作はなくなるでしょう.


クロスコンパイルを利用可能にするための前者の方法はあまり良くなく,特に, それが安易に使用されると,通常のエンドユーザが不可解なエラーメッセージを 前にして困ってしまいます.コンパイラが汎用的でないときだけのために, configureはクロスコンパイルモードに入ることが可能です.これは 主に,ユーザからの明示的なフラグを待つ代わりに,configure をク ロスコンパイルの検出を試みるために使用されるためです.

現在は,--hostが渡されている場合,そしてその状況でだけ, configureはクロスコンパイルモードに入ります.

以下は,短いドキュメントです.2.13とその後のものの間で簡単に変換するため, より複雑な手法が実行されています.以下は将来削除されるので,以下の 内容に依存しないでください

--hostを指定していて--buildを指定していない場合, configureが最初のコンパイルテストを実行するときに,コンパイラ で実行形式が生成されることを実行することで調査してみます.実行が失敗する 場合,クロスコンパイルモードに入ります.これは壊れやすいものです.さらに, コンパイラテストを実行する頃には,ビルドシステムのタイプを修正するには遅 過ぎるかもしれません.そのため,--hostを指定するときには,確実に --buildも指定してください.

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

これでクロスコンパイルモードに入ります.コンパイラにconfigure の情報を渡すことなくクロスコンパイルする設定から成り立っている前者のイン ターフェースは時代遅れです.例えば,以下のようなコンフィグレーションを行 なっていて,指定されたコンパイラで生成されたコードが実行できない場合, configureは失敗します.

     ./configure CC=m68k-coff-gcc