安峰
(蘇州工業(yè)園區(qū)服務(wù)外包職業(yè)學(xué)院 信息技術(shù)系,蘇州 215123)
安峰(工程師),主要研究領(lǐng)域?yàn)榍度胧綀D像處理。
在嵌入式Linux軟件的開發(fā)當(dāng)中,交叉編譯基本是不可或缺的一步。如果整個(gè)系統(tǒng)規(guī)模較小的話,例如一些不需要其他庫或者很少依賴包的系統(tǒng),我們可以采取人工的辦法:下載源代碼、解壓縮、設(shè)置參數(shù)、交叉編譯然后下載運(yùn)行。但是隨著系統(tǒng)規(guī)模的不斷擴(kuò)大,依賴包的不斷增長(zhǎng),人工交叉編譯所需的工作量隨之增長(zhǎng),同時(shí)需要富有經(jīng)驗(yàn)的工程師進(jìn)行操作,難以實(shí)現(xiàn)目前市場(chǎng)所要求的快速開發(fā)。
例如筆者對(duì)一款Linux下的媒體管理軟件mythtv進(jìn)行交叉編譯的時(shí)候就遇到了這個(gè)問題,整個(gè)應(yīng)用軟件的壓縮包達(dá)到幾十兆,同時(shí)還依賴于其他幾十個(gè)庫,而每個(gè)庫又有各自的依賴,如果按照傳統(tǒng)的交叉編譯方式進(jìn)行的話無疑是個(gè)災(zāi)難。幸運(yùn)的是,mythtv被集成在開源框架系統(tǒng)Openbricks當(dāng)中,這使得整個(gè)系統(tǒng)的交叉編譯、定制、開發(fā)和發(fā)布變得簡(jiǎn)單起來。
Openbricks是一個(gè)企業(yè)級(jí)的框架系統(tǒng),內(nèi)部集成了Bootloader,kernel,Systemd,X11和大量的工業(yè)標(biāo)準(zhǔn)(OpenGL ES,OpenVG,OpenMAX……),應(yīng)用框架(Qt,GTK,EFL,SDL),多款大型的應(yīng)用軟件(均是開源媒體管理、播放軟件)以及一系列的shell腳本。這些腳本智能化地管理著整個(gè)框架系統(tǒng),可以根據(jù)用戶的配置,自動(dòng)化生成目標(biāo)系統(tǒng),智能地實(shí)現(xiàn)所有的庫依賴、源代碼下載、配置、編譯以及目標(biāo)系統(tǒng)生成的功能。
Openbricks是一個(gè)開源項(xiàng)目,其源代碼目前由版本控制工具M(jìn)ercurial來管理。在ubuntu環(huán)境下,我們可以通過命令行的方式(或者通過git的方式)來獲取到源代碼:hg clone http://hg.Openbricks.org/Openbricks
如圖1所示,源代碼目錄下主要有sources、packages、scripts和build等目錄。其中,scripts目錄下存放控制腳本,以控制整個(gè)系統(tǒng)的運(yùn)作;sources目錄下存放有每個(gè)包的源代碼(壓縮包);packages目錄下存放每個(gè)軟件包的配置腳本、編譯腳本和安裝腳本;build目錄下存放解壓縮后的軟件包源代碼。
圖1 源代碼獲取及目錄層次
如上文所述,Openbricks內(nèi)部集成有大量的開發(fā)庫,因此在使用這些庫之前需要進(jìn)行適當(dāng)?shù)呐渲?。在Openbricks源代碼的根目錄下輸入make menuconfig,即可啟動(dòng)Openbricks配置界面。值得一提的是,Openbricks的智能管理功能會(huì)根據(jù)用戶環(huán)境的不同,來提示用戶是否需要自動(dòng)下載安裝所需的配置工具,如圖2所示。
圖2 自動(dòng)下載配置工具
在安裝完所需的工具之后,即可出現(xiàn)用戶配置主界面,如圖3所示。我們選擇了框架中眾多軟件中的mythtv,以及目標(biāo)平臺(tái)的cpu、architecture和平臺(tái)等,如果需要進(jìn)一步定制軟件,可以在packets、libs等目錄下進(jìn)行進(jìn)一步的修改。在保存配置文件之后輸入make命令即可進(jìn)行整個(gè)系統(tǒng)的編譯與生成,如果一切順利的話,將會(huì)在binary目錄下生成目標(biāo)系統(tǒng),而mythtv所依賴的Qt、X11、python和perl等眾多庫則被自動(dòng)下載并且編譯、安裝。默認(rèn)情況下,目標(biāo)系統(tǒng)是以文件系統(tǒng)的形式存在,同時(shí),目標(biāo)系統(tǒng)的Bootloader和kernel也相應(yīng)包含在內(nèi)。由于目前硬件平臺(tái)的多樣性,因此在多數(shù)情況下,kernel還需要進(jìn)一步的移植才能更好地適應(yīng)用戶的目標(biāo)系統(tǒng)。
圖3 用戶配置主界面
Openbricks之所以能實(shí)現(xiàn)自動(dòng)化的編譯,在于一系列的shell腳本。在開始編譯之后,腳本開始檢查目錄下的所有包,并按照makefile對(duì)時(shí)間規(guī)則的定義以及用戶在配置界面中所作的選擇對(duì)相關(guān)包進(jìn)行編譯。對(duì)于每個(gè)軟件包,在Openbricks框架當(dāng)中均有一系列的目錄與之對(duì)應(yīng)。以zlib包為例,在packet目錄下有一個(gè)zlib文件夾,其中包含有meta、build和install三個(gè)文件,這三個(gè)文件分別記錄了zlib包的版本、依賴、配置和編譯參數(shù)。在script目錄當(dāng)中的編譯安裝腳本會(huì)判斷相關(guān)的軟件包是否已經(jīng)被順利編譯安裝,如果沒有,則會(huì)檢查包的依賴鏈,并進(jìn)行代碼下載、編譯等操作。Openbricks腳本流程圖如圖4所示。
圖4 Openbricks腳本流程圖
其中,檢測(cè)包之間的依賴關(guān)系是通過Linux平臺(tái)下的pkg工具,源代碼下載通過wget工具,其他一些需要用到的工具會(huì)在編譯過程中自動(dòng)下載,系統(tǒng)主機(jī)通常選擇在ubuntu環(huán)境下。
基于Openbricks,可以快速地進(jìn)行軟件的開發(fā)工作。以開發(fā)一個(gè)基于Qt和OpenGL的3D嵌入式圖形程序?yàn)槔?,在開發(fā)程序時(shí),我們只希望關(guān)注于應(yīng)用程序本身,而不是受困于Qt、OpenGL的配置、安裝問題?;贠penbricks,我們將應(yīng)用程序以packet的形式添加進(jìn)Openbricks,假設(shè)應(yīng)用程序名叫mythremote,則添加方法如下:
① 運(yùn)行./scripts/newpacket mythremote命 令,將在packet目錄下生成mythremote目錄;
② 在mythremote目錄下編輯meta文件,修改PKG_VERSION、PKG_URL和依賴包等宏變量;
③ 運(yùn)行./scripts/unpacked mythremote命令,測(cè)試是否會(huì)根據(jù)PKG_URL來自動(dòng)下載相應(yīng)源代碼,并解壓縮到build目錄下的mythremote目錄下;
④ 編輯build文件,增加配置命令;
⑤ 運(yùn)行./scripts/build mythremote命令,即可進(jìn)行源代碼編譯,如果在meta文件下有包依賴的話,則會(huì)先進(jìn)行依賴包的下載、編譯與安裝。
基于Openbricks,我們也可以快速地進(jìn)行軟件的發(fā)布工作,因?yàn)樵创a是集成在Openbricks之中,因此用戶在以源代碼編譯、安裝我們的程序時(shí)不必再去關(guān)心Qt或者OpenGL的問題,只需簡(jiǎn)單地配置,然后一個(gè)指令,即可生成相應(yīng)的目標(biāo)系統(tǒng),實(shí)現(xiàn)了嵌入式Linux軟件的快速、簡(jiǎn)單的發(fā)布。
本文討論的基于Openbricks的實(shí)現(xiàn)方法及應(yīng)用的主要技術(shù),使得開發(fā)者可以專注于應(yīng)用相關(guān)的細(xì)節(jié)開發(fā),不用再去關(guān)注硬件、Bootloader、kernel和應(yīng)用框架等。工程實(shí)踐證明這些方法都是可行的,可以較大地提高開發(fā)效率。由于主系統(tǒng)環(huán)境參數(shù)和用戶經(jīng)驗(yàn)的不同等,在首次編譯該系統(tǒng)時(shí)會(huì)遇到一些問題,而且首次編譯系統(tǒng)的時(shí)間也較長(zhǎng)(10個(gè)小時(shí)左右),這也是該產(chǎn)品有待提高之處。
[1]http://www.Openbricks.org/.
[2]http://www.mythtv.org/.
[3]張?jiān)~,向勇,鄭志國(guó).Peta Linux操作系統(tǒng)在 Micro Blaze系統(tǒng)中的移植[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2010,10(7).
[4]韋東山.嵌入式Linux應(yīng)用開發(fā)完全手冊(cè)[M].北京:人民郵電出版社,2008.
[5]文全剛.嵌入式Linux操作系統(tǒng)原理與應(yīng)用[M].北京:北京航空航天大學(xué)出版社,2002:155-169.
[6]亞荷毛爾.構(gòu)建嵌入式Linux系統(tǒng)[M].2版.O'keilly Taiwan公司,譯.北京:中國(guó)電力出版社,2011.