2008-06-06

Building and Porting Code

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

 

沒有留言:

★★★★★★ 傑森系列 ★★★★★★