Building code
x86 :# ./configure
# make
# make install
arm :
# ./configure --prefix=/path/to/service/home/ --host=armeb-linux \
--target=armeb-linux
# make
# make install
Porting code
一般來說,porting code 要利用 cross-compiler 的技術,但並非所有的 source 都支援 cross-compiler ,這一點要注意。在 building/porting code 時,最重要的大概就是 configure file 及 Makefile file,現在大部份的程式都是利用軟體去產生的,詳情請看: Makefile介紹。
有了 configure and Makefile 就可以來 porting 了。
首先,可以用 ./configure --help 檢視有哪些選項可供使用。在 cross-compiler 時,--host、--target 是必須的,而 prefix 則是告訴 configure 要把 service 的 root 設定在哪裡。用 --help 檢視到的,是這個 service 本身所提供的 option,可能某些 option 會需要配合某些 library,那就要去 download 這些 library 來 build,或是看 tool-chain中有沒有提供這個 library 可以使用。
如果是比較小的程式,可能只要指定好 --host and --target 就可以了。但通常是不會那麼順利的 Orz。先試過用上面的方面 build 過,如果不行,就要看錯誤是出在哪裡。下面列出已經有遇過的問題,提供參考:
1. cross compiler 沒有指定好:
目前我使用的是 armeb-linux-gcc,所以必需要先把他加入環境中,否則找不到對的compiler 一定是 build 不起來的。
2. 沒指定正確的 build tool:
例如 ar, strip 都是常使用到的 tool,如果沒指定對的,就會有問題。指定的方法可以在 ./configure 前面先設定。如下:
CC=armeb-linux-gcc AR=armeb-linux-ar STRIP=armeb-linux-strip ./configure
當然,這些 tool 都要在環境中先設定完成才可以用。
3. cannot check SOMETHING when cross compiling:
這就比較麻煩,因為當 configure 發現是 cross compiler 時就不給做下去了。這時先看看 ./configure --help 中有沒有可以讓他跳過不要 check 的選項,如果發現這個選項是一定要的,那就只能去改 configure 了:
# vi ./configure
找到那一行,應該可以發現他如果無法檢查就會跑 { (exit 1); exit 1; }; }。把他全都拿掉,並把它檢查的值設定好:
// mark these to allow cross compiling
- line 31537:
{ { echo "$as_me:$LINENO: error: cannot check SOMETHING when cross compiling" >&5
- line 31538:
echo "$as_me: error: cannot check SOMETHING when cross compiling" >&2;}
- line 31539: { (exit 1); exit 1; }; }
+ line 31540: ac_cv_func_SOMETHING_void=no
關於最後一個 ac_cv_func_SOMETHING_void 要設成 yes 或 no 是不一定的,要看前後文來決定,不過如果真的不知道,就先設成 no 吧(看看會不會有問題再說)。其實也可以在configure之前先 export 就好了:
# export ac_cv_func_SOMETHING_void=no
# ./configure
4. 缺 library:
這是很常見卻又很麻煩的問題。首先當然是看看 tool clain 中有沒有提供缺少的 library,如果有就簡單了,只要把它選起來 re-build 就可以了。
# cd /path/to/tool-chain/build-root/
# make menuconfig
沒有留言:
張貼留言