不過, 內心還是想自己做做看
結果, 我發現要純手工地準備一套 toolchain 真的會哭臉....
我也沒那時間在那耗~~
所以, 只好藉助工具的幫忙啦~~ 以下做點重點紀錄
工具鏈 (Toolchain)
就是你要做一支程式所需要的工具集合,像編譯器、連結器、C 函式庫這一類的東西。交叉工具鏈 (Cross Toolchain)
如果你要在 x86 的 PC 上寫一支跑在 arm 架構上的程式,那你就需要在 x86 的 PC 上準備一套給該架構使用的工具鏈。就是說,你可以在 A 平台,透過交叉工具鏈的協助,開發給 B 平台用的程式。為了區別本地工具鏈,croos toolchin 工具的檔名大多會加前綴字(prefix),例如 arm-linux-gcc
獲得交叉工具鏈的 5 種方法
- 使用 vendor 提供的 toochain (常附在 SDK 或 BSP 中)
- 專案或社群所製作好的 toolchain (例如為 ARM特別校調的 Linaro)
- 使用 Linux 發行版提供的 cross toolchain
$ sudo apt-get install gcc-arm-linux-gnueabi - 使用工具鏈製作工具來做 (例如 crosstool-ng。有些根檔案建置系統也可順便做 crosstool chain 的建置, 像 Buildroot, PTXdist, OpenEmbedded 等, 以上我都沒用過)
- 純手動,自己準備 binutils, gcc, glibc/eglibc/uclibc, gcc, Linux kernel headers 等。有試著自己要做,但功力實在太弱,一堆錯誤不知道要搞到何年何月.... 最後直接投降!
如果真要自己弄,藉由 crosstool-ng 這種工具的協助來建置 toolchain 似乎是很常見的做法
安裝 crosstool-ng
- 我的host系統是 Ubuntu
- 下載最新版的 crosstool-ng
- 注意一開頭有個檔案的檔名會提示你最新版本號: 例如 00-LATEST-is-1.20.0
- 當然你可下載自己需要的版本
- 全域安裝
- $ ./configure --prefix=/opt/crosstool-ng
- $ make
- $ sudo make instal
- prefix 就是安裝的路徑
- 本地安裝
- $ ./configure --enable-local
- $ make
- $ make install
- 安裝時可能會出現缺這個套件、那個套件的錯誤,看缺什麼就 apt-get install 一下即可,下面列出名字比較不直覺的套件名稱
- 缺 makeinfo:裝 texinfo
- 缺 GNU awk:裝 gawk
- error: could not find curses header... kconfig frontends:裝 libncurses5-dev
- 裝完可修改 .bashrc 中的 PATH 環境變數,例如
- PATH=$PATH:/opt/crosstool-ng/bin
- ct-ng 就是 crosstool-ng 的指令,例如可用如下指令查看說明
- $ ct-ng help
使用 crosstool-ng 的基本流程
還沒用過之前,會覺得是不是會很難用。但用過之後,我是覺得還蠻容易的。反正就兩件事情,一件事情就是「crosstool-ng 自己本身的設定,例如工作目錄、編譯錯誤要不要直接退出之類的」,另一個就是「cross toolchain 要怎麼編出來的設定」。最重要的是,crosstool-ng 已經提供一堆不同架構的設定範例,你可以直接套用一個範例來建置,或是套用後再自己修改、然後建置,修改可以用 menuconfig 選單式的作法,很方便。基本流程如下:
- $ ct-ng list-samples
- 例如我選 arm-cortex_a8-linux-gnueabi
- $ ct-ng show-arm-cortex_a8-linux-gnueabi
- 可看一下這個設定範例的主要參數
- $ ct-ng arm-cortex_a8-linux-gnueabi
- 直接套用此範例檔
- $ ct-ng menuconfig
- 進入選單,勾勾選選的,cook 一下自己要的設定
- $ ct-ng build
- 然後就建置了,建置時間不等(數十分鐘,我用 i7 + VM 跑 50 分鐘,這個值僅供參考而已,反正你執行建置後,可以先去洗個澡、大便之類的都沒問題)
這個下次要說「組織工作目錄」的時候再補完~ 有點想睡啦!!