2017年11月10日 星期五

談談autotools的--build, --target, 和 --host

原文 http://wen00072.github.io/blog/2015/02/06/talk-about-the-autotools-build-target-and-host/

組裝的時候,常常缺東缺西的。這時候就需要cross-compile一些套件頂一下,所以如果有人組裝過的話,應該會對下面的命令倍感親切。
1
$ ./configure --host=mipsel
如果組裝夠次數夠多,也會看到--target--build的參數似乎和這個有關。找時間稍微了解一下
對於–target目前手上的資料無法讓我完全理解,請注意!
根據Autoconf手冊說明,這些參數的預設值如下:
  • --build
    • 從config.guess中猜的
  • --host
    • 設成和--build相同
  • --target
    • 設成和--host相同
因為這樣的連動性,如果你要cross-compile,那麼下了--host後麻煩不要省掉--build,不然autotool會把build設成和host一樣。
Automake手冊裏面的定義
  • --build
    • 你build code,下xxx-gcc那台機器平台
  • --host
    • 產生的binary可以執行的平台
  • --target
    • 告訴gcc要產生什麼平台的機械碼
      • 一般來說會和--host一樣同樣的平台,根據上面的連動,你設了--host就可以省略這個選項
      • 特例是compile cross-compiler或是binutils,toolchain。這時候是指定build在host上,但是處理的對象是cross platform的機械碼
Autotool選擇gcc的方式如下
  • --host--build相同
    • 用你電腦上的gcc,來編譯autotool的套件。
  • --host--build不同
    • 你要自備cross-compiler
    • 如果有指定--target的為gcc的prefix
    • --host=xxx, --target=zzz,會使用zzz-gcc產生xxx平台的機械碼
    • 用該cross-compiler來編譯autotool的套件
    • 這時候要保證cross compiler可以吃的library也存在,常常會為了編一個套件cross compile一堆套件
看的有點混亂嘛?沒關係,autoconf 2.69手冊有提到,要cross-compile的話,唯一(if and only if)的條件就是指令--host指定和你現在的平台不同就好。

參考資料

沒有留言: