2009年2月22日 星期日

Poky porting (2)

之前能夠以核心 2.6.29-rc4 成功編譯出的 task 為 poky-image-minimal,最近這兩天開始嘗試執行 poky-image-core,兩者的差別在於 minimal 只編譯了最少量的套件,只求可以開機就行;而 core image 則包括了完整的 GNOME Mobile 環境,也因此所需的編譯時間更久,也陸陸續續地遇到一些問題,其中比較大的問題主要是在核心模組的編譯之上。

怎麼說呢?目前所使用的版本為 Pinky-3.1.1 (08年六月釋出),如果沒記錯的話,那時的核心大約是在 2.6.25 rc 階段。不過自 2.6.28 版以後,核心引頭檔的目錄架構出現了大變動:原來在 include/asm-*/ 之下的引頭檔搬移至 arch/*/include、arch/*/mach-*/include 及 arch/*/plat-*/include 之下,並取消了 symbolic link 的使用,全由 makefile 來決定要引用的目錄。因此問題就來了,用來編譯舊版核心的 bb 檔只需要複製 include/asm-*/ 下的引頭檔至 staging 目錄下即可;但到 2.6.28 版以後,引頭檔的路徑已經改變,故需要做特別的處理。因此在 Pinky-3.1.1 下,編譯完核心後,還得再手動複製必要的引頭檔至正確的路徑之下,後續的核心模組編譯才能正確執行。

不過看了一下 Poky git 中,最新的核心版本是 moblin 的 2.6.29-rc2,不確定能不能正確處理,嗯嗯…

PS.
用 uclibc 要編譯 poky-image-core 的套件還是會遇到許多問題,且都是編譯過程的錯誤;想要順利完成的話,建議還是用 glibc 比較好。

2009年2月17日 星期二

Poky porting

最近這幾天,我一邊研究 OpenEmbedded building system 的目錄結構及設定檔撰寫,一邊嘗試利用 Poky 來編譯目前最新穩定版本 (2.6.28) 的核心。原因無他,主要是 2.6.27 以後的核心才有支援我現在使用的開發板。是故整個過程可分為兩階段,一是增加新版本核心用的 bb 檔案,另一項則為增加新硬體的設定檔。

要加入新版本核心其實可以將 meta/packages/linux/ 下的 bb 檔找一個你覺得適合的複製一份來改,內容大同小異,操作如下:

cd meta/packages/linux
vi linux-<MACHINE>_2.6.28.bb
# 填入自訂的內容,或複製現有的來修改
...

要注意的是,我們還需要再新建一個目錄,名稱如下所示,並複製核心使用的組態檔到該目錄下,檔名隨意,方便記憶即可:

mkdir linux-<MACHINE>
cp ~/defconfig ./defconfig-2.6.28

接著在修改 bb 檔時,幾個重要的變數需要設定:
  • PV: 套件版號,OpenEmbedded 會利用該變數來決定使用那個版本來編譯,預設是找最新的版本。
  • S: 套件原始碼目錄,也就是 tarball 解開後放置的路徑,在這個例子中是 ${WORKDIR}/linux-2.6.28
再來就是在 bb 檔中撰寫上 patch 以及複製核心組態檔用的 shell script,這部分可以參考其他 bb 檔的做法,在此就不贅述。

加入新硬體的設定檔可參考 meta/conf/machine/ 下的檔案來修改,由於我的開發板和 OpenMoko 所使用的硬體是同屬於 S3C2440 的晶片,是故就直接複製 fic-gta01.conf 來修改:

cd meta/conf/machine
cp fic-gta01.conf <MACHINE>.conf

修改的部分如下:
  • MACHINE_FEATURES = "kernel26 vfat ext2"
  • MACHINE_DISPLAY_WIDTH_PIXELS = "800"
  • MACHINE_DISPLAY_HEIGHT_PIXELS = "480"
  • PREFERRED_PROVIDER_virtual/kernel = "linux-<MACHINE>"
  • 移除 MACHINE_CLASS
  • 移除 MACHINE_EXTRA_RDEPENDS, MACHINE_EXTRA_RRECOMMENDS
  • 移除 EXTRA_IMAGECMD_JFFS2
  • 移除 SERIAL_CONSOLE
  • 移除 EXTRA_IMAGEDEPENDS
其餘照舊。

修改完成後,在 build 目錄下 (別忘了要 source poky-init-build-env),鍵入以下的指令:

bitbake linux-<MACHINE>

就會開始進行編譯程序。若發生錯誤,查看 build/tmp/work/<MACHINE>-poky-linux-gnueabi/linux-<MACHINE>.../temp/ 下的紀錄檔並修正。

目前已經加入了 2.6.28 及 2.6.29-rc4 的 recipe。其中 2.6.29-rc4 包含了開發板上 SD 控制器LCD 控制器的支援,相信不久應該就可以看到跑 GNOME Mobile 的樣子了。

2009年2月13日 星期五

Poky Linux 建構系統使用感想

最近為了要建立一個完整可供核心掛載的檔案系統,去玩一玩了 Poky 這個嵌入式套件。無可否認的,它所根基的 OpenEmbedded 是個很有彈性的套件建構系統,在已支援的開發板上,只要改一些設定,就可從無到有建構核心及所需的檔案系統映象 (file system image),並且會幫你處理套件間相依性的問題,也可以只建構特定套件,打包成 ipkg 或 deb 檔以供其他系統使用。有過土法煉鋼、自己抓原始碼回來編譯的痛苦經驗的人,就會了解這個功能是多麼地令人叫好。

雖然功能強大,但若要加入新的開發板的支援,或是要解決某個套件不能順利編譯的問題,你就會發現,它的設定檔也是異常的複雜難懂;每個設定檔會去引用其他共享的檔案,並且預先設定一大堆變數。有些變數是在目前檔案被設定,有些則是在被引用時才設定。而被引用的檔案又會去引用其他的檔案……沒完沒了。

就在不久前,uClibc 發生編譯錯誤 (poky 3.1.1),從錯誤訊息看來,發現是硬體架構設定錯誤所致。但找了老半天,就是不知道應該要改那個設定檔,令人懊惱。花了一個下午的時間,才找到問題的關鍵,修正後,這才能順利編譯。我另外把它做成了一個 patch,但我沒有網頁空間可以放,有相同問題的朋友可以來找我要,或有朋友願意提供他的空間也成。

延伸閱讀:
Embedded Linux 系統性的教學看法
Embedded Linux 應用的痛處: OpenEmbedded