configureのbuild、host、targetの違い

crosstoolのログなんかを見ていてようやく理解してきた気がするけど、Linuxとかのパッケージをクロスコンパイルするときにconfigureの引数に--build、--host、--targetをどう指定したら良いのか、自分の中で整理がついてきたんじゃないかと思う。


たぶんこうだと思う。

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


普通のコマンド類は「実行環境==ターゲット」だから

$> ./configure --prefix=/hoge/sysroot --build=i386-pc-linux-gnu --host=x86_64-unknown-linux-gnu --target=x86_64-unknown-linux-gnu

になると思う。*1


それで、クロスコンパイラみたいに「コンパイラPC上で実行するけど、最終的な成果物はターゲット」って特殊なやつは

$> ./configure --prefix=/hoge/compiler --build=i386-pc-linux-gnu --host=i386-pc-linux-gnu --target=x86_64-unknown-linux-gnu

って感じで「--build == --host」になるんじゃないかと思う。


んで、さらにややこしいのはglibcとかgdbserverみたいに「クロス開発関係の物体だけど実行環境がターゲット的」みたいなやつでこいつらは「--host == --target」じゃないかと思う。*2


そんなわけでこれは勘なんだけど、クロスコンパイラを使ってコンパイラをクロスコンパイルする*3ときは

$> ./configure --prefix=/hoge/sysroot --build=x86_64-unknown-linux-gnu --host=x86_64-unknown-linux-gnu --target==x86_64-unknown-linux-gnu

でいけないかな?無理かな?



てか、configure のヘルプ(--helpで表示される奴)が分かりにくいんだよね。この英語を見て--build、--host、--targetに何を指定すべきかわかる人は、相当英語に精通してると思う。

System types:
  --build=BUILD     configure for building on BUILD [guessed]
  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
  --target=TARGET   configure for building compilers for TARGET [HOST]


ちなみにこのあたりの事情が分かってからグーグル先生に「configure build コンパイル host 実行 target ターゲット」って聞いてみたら以下のナイスなサイトが引っ掛かりました。
http://www.jsk.t.u-tokyo.ac.jp/~k-okada/soft-ensyu/gcc.html
最後の方の「用語集」ってあたりに解説が…


散々ググっても見つからなかったのに知識がついてから、知識をもとに検索したら見つかるとか…orz

*1:x86の32ビット環境で64ビット環境のクロス開発をする場合

*2:glibcは実行環境というか実際にリンクされる際にはターゲットのアーキになってないとダメだからだと思う。crosstoolでは--host == --targetになってる

*3:何言ってるのか分からないと思うけど、つまりx86_64-unknown-linux-gnu-gccでターゲット上で動作するgccを作りたいってこと