2010年5月29日 星期六

GNU automake manual 筆記

在正常遵循 GNU 標準的 packages(套件) 內容中
標準的安裝程序就是
  1. $ ./configure
  2. $ make
  3. $ make install (或許需要sudo)
第一步的 configure 檔案
會去偵測該 package 所在主機上的一些設定
以及檢測一些相依性 package 是否存在
最後產生一個符合該主機的 Makefile 供下一步的 make 使用

以上所述為 native compilation 的情況
也就是 package 是在要使用該 package 的主機上編譯

在 cross compilation 的情況下事情就變得有些棘手

首先 configure 原先是要偵測主機上的設定
但現在 package 是要在 HOST machine 上編譯 (ex. X86)
最後是安裝在 TARGET machine 上執行 (ex. arm)

所以要是直接執行 configure 的話
偵測到的是 HOST 上的設定,而非 TARGET 的

舉個顯例,configure 假設去抓 HOST 上 CC 變數的設定 (C Compiler)
會得到 CC=gcc,可是這個 gcc 是編出 x86 binary 使用的
並非我們要的 arm binary compiler
所以 configure 要抓的 CC 變數應該是 CC=linux-arm-gcc

那要怎麼做才能讓 configure script 在 cross compilation 的情形下
得到 TARGET machine 上的偵測設定值呢?

這個學問真是太高了 XDDD 撒謀啊


以下的參考是慢慢演進的,會說是參考表示他可能不是正確解答
google 過這個議題,但找不到顯而易見的解答,只好自己 try and error
--------------------------------------------------------------------------------------------------------

首先提及幾個 configure script 可使用的參數 (可用./configure -h 查看)

[GNU automake manual text]
--build=BUILD
The system on which the package is built.

--host=HOST
The system where built programs and libraries will run.

當使用--host參數的時候,configure script 會搜尋這個HOST的 cross-compiling suite
例如說,當設定--host=arm-linux-gnu,則以下的編譯工具會被使用
編譯器 arm-linux-gnu-gcc
連結器 arm-linux-gnu-ld
組譯器 arm-linux-gnu-as

上述的 HOST 的名詞跟先前提到的 HOST machine 中的 HOST 定義剛好相反
這邊要特別注意,一開始沒看 manual 之前,我的 HOST 都給它設成 HOST machine...

為了怕混淆,這裡再特別解釋一次好了
在 cross compilation 的語境中
HOST 指的是進行cross compilation的機器
此處借重HOST的高運算能力來負責編譯的工作
所以一般HOST都是以高效能的 desktop 居多
TARGET 指的是執行程式的目標機器,也就是執行HOST幫忙編譯的程式的目標機器

而在 configure script 的語境中
HOST 指的是執行程式或函式庫的目標機器,BUILD 才是進行 cross compilation 的機器
在 configure 的參數中也剛好有個 --target=TARGET 可以設定
這裡的 TARGET 是設定 Canadian cross 用的,對於一般人用不太到,可以忽略

*Canadian cross (3-way cross-compilation)
簡言之是在A機器 cross-compile 出一個在B機器使用的 cross-compiler
而這個在B機器的 cross-compiler 會產出在C機器使用的 binary


所以在 cross compilation 的環境下
安裝套件的第一步 ./configure 似乎是得到解決的方案

[example]
$ ./configure --build=i686-pc-linux-gnu --host=i586-mingw32msvc

沒有留言:

張貼留言