OpenEmbedded是一些腳本(shell和python腳本)和數據構成的自動構建系統。 腳本實現構建過程,包括下載(fetch)、解包(unpack)、打補丁(patch)、configure、編譯(compile)、安裝(install)、打包(package)、staging、作安裝包(package_write_ipk)、構建文件系統等。 一、OE編譯順序:python
do_setscene do_fetch do_unpack do_patch do_configure do_qa_configure do_compile do_stage do_install do_package do_populate_staging do_package_write_deb do_package_write do_distribute_sources do_qa_staging do_build do_rebuild
二、每一個do均可以添加_append,_prepare操做:shell
do_configure_prepend () do_compile_prepend () python do_compile_prepend () do_stage_prepend() do_install_prepend() do_package_prepend() python populate_packages_prepend ()
帶有python的函數,其函數內容是使用python定義的,不然使用shell 語法定義。 do_compile這些函數都是在openembedded的classes中定義的,在bitbake中沒有對這些進行定義。這說明,bitbake只是oe更底層的一個工具,oe是基於bitbake架構來完成的。緩存
文件系統裏的OpenEmbedded OE環境中最重要的目錄有3個:放工具的bitbake目錄、放元數據的目錄、和執行構建的build目錄。 bitbake目錄 這個目錄裏是咱們的烹飪工具:bitbake。咱們使用它,但一般不須要訪問它 元數據目錄 在poky中元數據目錄是meta。Openmoko中元數據目錄是openembedded。在元數據目錄中,有3個目錄裏是真正的元數據。它們是:classes、conf和packages。 packages目錄 全部的配方(recipes)文件(以.bb爲後綴名)都放在package目錄。每一個相對獨立的軟件包或構建任務在package目錄下都有本身的子目錄。在一個子目錄中能夠有多個配方(recipes)文件。它們多是同一個軟件包的不一樣版本。也可能描述了基於同一個軟件包的不一樣構建目標。 有的配方(recipes)簡單,有的配方(recipes)複雜。簡單的配方(recipes)僅描述一個軟件包的構建。最複雜的配方(recipes)就是要求構建文件系統的配方(recipes),這個配方(recipes)文件自己並不長,甚至還很短,但它經過依賴關係將幾百個甚至幾千個其它配方(recipes)件捲入了構建過程。 packages目錄的images子目錄下就是這些要求構建文件系統的配方(recipes)。 classes目錄 這個目錄放的是配方(recipes)的類文件(以.bbclass爲後綴名)。類文件包含了一些bitbake任務的定義,例如怎麼配置、怎麼安裝。配方(recipes)文件繼承類文件,就繼承了這些任務的定義。例如:咱們若是增長一個使用autotool的軟件包,只要在配方(recipes)文件中繼承autotools.bbclass: inherit autotools bitbake就知道怎樣使用autotool工具配置、編譯、安裝了。全部的配方(recipes)文件都自動繼承了base.bbclass。 base.bbclass提供了大部分bitbake任務的默認實現。 一個配方(recipes)文件能夠繼承多個類文件。之後的文章會介紹bitbake的任務,屆時會更詳細地討論bitbake的繼承。目前,咱們只要知道繼承類文件是一種構建過程的複用方式就能夠了。 conf目錄 conf目錄包含編譯系統的配置文件(以.conf爲後綴名)。bitbake在啓動時會執行bitbake.conf。 bitbake.conf會裝載用戶提供的local.conf。而後根據用戶在local.conf中定義的硬件平臺(MACHINE)和發佈目標(DISTRO)裝載machine子目錄和distro子目錄的配置文件。machine子目錄裏是硬件平臺相關的配置文件。distro子目錄裏是與發佈目標相關的配置文件。配置文件負責設置bitbake內部使用的環境變量。這些變量會影響整個構建過程 build目錄 build是咱們烹飪嵌入式系統的大廚房。整個構建過程就是在build目錄的tmp子目錄完成的。 build目錄的conf子目錄裏是用戶的配置文件local.conf。 tmp目錄有7個子目錄:cache、cross、rootfs、staging、work、deploy和stamps目錄。其中cache是bitbake內部使用的緩存目錄。cross是構建過程當中產生的交互編譯器。所謂交互編譯器就是在主機平臺運行,用於編譯目標平臺代碼的編譯器。 rootfs是製做文件系統映像前臨時創建的根文件系統。咱們在工做中一般不須要訪問這3個目錄。咱們訪問比較多的是其它4個目錄:staging、work、deploy和stamps目錄。 1. staging目錄 軟件包B在構建時可能依賴軟件包A提供的頭文件、庫文件,也可能要使用軟件包C生成的工具。 staging目錄就是放這些輸出文件的地方。 咱們必須在配方(recipes)文件中用「DEPENDS」變量聲明構建時的依賴關係。bitbake就會在構建軟件包B前先構建軟件包A和軟件包C,並將軟件包B須要的頭文件、庫文件、和工具放在staging目錄。這樣,在構建軟件包, 時就能夠從staging目錄獲得須要的頭文件、庫文件、和工具。 2. work目錄 全部軟件包的解包、打補丁、配置、編譯、安裝等工做都是在work目錄進行的。因此work目錄包含了整個嵌入式系統的完整源代碼。 work目錄下按照硬件平臺、發行人、目標平臺的不一樣又分了幾個子目錄。全部軟件包都被放在對應子目錄中。每一個軟件包都有一個獨立的目錄。由於軟件包老是 根據一個配方(recipes)文件構建的,因此軟件包所在的目錄就是對應配方(recipes)文件的工做目錄。在討論bitbake和配方(recipes)文件時咱們還會回來,更仔細地觀察配方(recipes)文件的工做 3 deploy目錄 這是保存輸出成果的目錄。其中images目錄保存構建成功後產生的文件系統映像、內核映像。 ipk目錄保存每一個軟件包的安裝包。咱們在修改、構建軟件包後,能夠在目標平臺手工安裝ipk目錄下的對應安裝包。確認沒有問題後,再製做文件系統映像。 4 stamps目錄 和work目錄相似,stamps目錄也按照硬件平臺、發行人、目標平臺的不一樣又分了幾個子目錄。軟件包在完成每一個bitbake任務後都會在對應子目錄裏touch一個對應任務的時間戳。有時咱們會手工刪除某個軟件包的時間戳,強制bitbake從新構建這個軟件包。 5 sources目錄 OE環境的sources目錄是一個儲藏間,用來放從網上下載的源代碼包。 fetch任務負責下載代碼,放到sources目錄。bash
OE的主要功能是爲各類工程項目的須要編譯源碼。不論是什麼工程,如下任務都是要做的: 1. 下載源碼包,還有其餘的系統支持文件(好比初始化腳本); 2. 解壓源碼包,而後打上須要的補丁; 3. 若是須要的話就進行軟件包配置(好比運行configure腳本); 4. 編譯全部的東西; 5. 把全部編譯好的文件打成各類格式的包,而後準備安裝。架構
其實這些並無什麼很是不尋常的。困難的是: 1. 交叉編譯:交叉編譯是困難的,大部分軟件包根本不支持交叉編譯,OE裏包含的都是支持交叉 編譯的。 2. 目標系統和主機是不一樣的: 這意味着你不能編譯一個程序就直接運行它—那是給在目標板上 運行的。有不少的軟件包在編譯的時候會編譯而且運行一些幫助或者測試程序,這在交叉編譯的時 候會致使失敗。 3.工具鏈老是很難編譯的。交叉工具鏈更是如此。一般狀況下你可能會選擇去下載一個別人作好的, 可是使用OE你就不須要如此。在OE裏整個工具鏈在編譯系統的時候都會被建立。OE的這種方式或許 在開始的時候會帶來一些困難和不便。可是若是你須要打上補丁或者對工具鏈作些調整就會很容易。app
固然,除了這些以外,oe還有不少的功能,其中包括: * 同時支持glibc和uclibc; * 只使用oe一個工具你就能夠爲多種目標機器構建系統; * 自動編譯一切構建時和編譯時依賴的包; * 直接建立各類能夠在目標機器上直接運行的鏡像(包括jffs2,ext2.gz,squashfs等等); * 支持各類打包格式; * 自動構建交叉工具鏈; * 支持構建「本地包」。本地包指爲了完成編譯給主機編譯的包,最終不會用到目標板上。 本章如下內容假設你已經掌握了OE的Getting Start guides(新手指南),而且已經可以正確安裝和 配置oe,並且你也成功的構建了交叉工具鏈。ide
bitbake的經常使用命令: bitbake -e 顯示當前的執行環境,經常使用於查找當前bitbake的包的源路徑和目標路徑。 查找包的原路徑 bitbake -e hello | grep ^SRC_URI 查找包的安裝路徑 bitbake -e hello | grep ^S= bitbake -s 用於顯示全部能夠bitbake的包 例如若是本身在一個Layer下面安裝了一個hello.bb,在build目錄下面用 bitbake -s | grep hello 查看hello這個package可否被bitbake. bitbake -c 用於執行一個特定的命令 bitbake -g 用於顯示一個包在bitbake的時候於其餘包的依賴關係 bitbake -v 顯示執行過程。 bitbake -b 後面加上.bb文件的路徑,能夠用bitbake直接執行這個.bb文件。函數