手動建立一個recipe

執行一個recipe。html

     調用#bitbake basename來執行一個recipe。其中包括:解壓縮源代碼包、log文件以及編譯過程當中的中間文件等。架構

     在每一個recipe中定義temporary工做目錄,具體定義以下:app

     BASE_WORKDIR ?= 「${TMPDIR}/work"ide

     WORKDIR = 「${BASE_WORKDIR}/${MULTIARCH_TARGET_SYS}/${PN}/${EXTENPE}${PV}-${PR}"函數

     TMPDIR:     top-level build output directorypost

     MULTIMACH_TARGET_SYS:     target system identifierfetch

     EXTENDPE:      the epochui

     PV:     recipe versiondebug

     PR:     recipe reversion3d

 

Fetching source code。

     使用變量值SRC_URI來肯定源代碼的具體路徑以及源代碼的下載方式。

     bitbake調用do_fetch()函數從recipe的SRC_URI處下載源代碼。

     建議在SRC_URI裏面用${PV}來指定源代碼的版本號。

     若SRC_URI中指定的是源代碼地址是SCM的,則須要指定SRCREV/PR/PV等值。

     若SRC_URI中指定的是源代碼包,則須要給出該源代碼包的md5和sha256sum值,即:

     SRC_URI = "${DEBIAN_MIRROR}/main/a/apmd/apmd_3.2.2.orig.tar.gz;name=tarball \

                          ${DEBIAN_MIRROR}/main/a/apmd/apmd_${PV}.diff.gz;name=patch


     SRC_URI[tarball.md5sum] = "b1e6309e8331e0f4e6efd311c2d97fa8"

     SRC_URI[tarball.sha256sum] = "7f7d9f60b7766b852881d40b8ff91d8e39fccb0d1d913102a5c75a2dbb52332d"

     SRC_URI[patch.md5sum] = "57e1b689264ea80f78353519eece0c92"

     SRC_URI[patch.sha256sum] = "7905ff96be93d725544d0040e425c42f9c05580db3c272f11cff75b9aa89d430"

 

     若SRC_URI中包含本地的文件,則使用file://指定。由file://指定的文件的查找路徑位於FILESPATH變量中。

 

 

 

Unpacking souce code。

 

     bitbake調用do_unpack()函數解壓縮源代碼到${S}目錄。若SRC_URI中指定的源代碼包是標準的${PN}-${PV}結構則不須要指定${S},不然須要在recipe中指定${S}值。

 

     patch文件位於SRC_URI中指定。

 

 

 

Licensing。

 

     recipe中須要有LICENSE變量和LIC_FILES_CHKSUM變量。

 

     LICENSE變量指定具體license的標準,如:GPLv2等。

 

     LIC_FILES_CHKSUM變量指定具體的license文件名以及該文件名對應的md5校驗和的值,如:

 

LIC_FILES_CHKSUM = "file://COPYING;md5=xxx"

 

Configuring the recipe。

     對於在編譯過程當中依賴的文件,在DEPENDS變量中指出。

     yocto中經常使用的configure以下:

     Autotools:在源代碼中包含configure.ac文件則說明該源代碼使用autotools進行配置。此時須要在recipe中只須要包含inherit autotools一行而不須要添加do_configure()任務。固然能夠在EXTRA_OECONF變量中添加額外的configure選項。

     CMake:在源代碼中包含CMakeLists.txt文件則說明該源代碼使用CMake進行配置。此時須要在recipe中只須要包含inherit cmake一行而不須要添加do_configure()任務。固然能夠在EXTRA_OECONF變量中添加額外的configure選項。

     Other:在源代碼中既沒有configure.ac也沒有CMakeLists.txt則須要在recipe中添加do_configure()任務。一般在do_configure()任務中須要執行./configure命令對源代碼進行配置。

     一般在configure完成後須要查看log.do_configure文件來確認配置過程的正確性。

 

Compile。

     在編譯的時候bitbake調用do_compile()任務進行編譯。

     常見的編譯錯誤以下:

     parallel build failures:並行編譯錯誤。

     improper host path usage:錯誤的主機路徑。一般在交叉編譯上出現。

     failure to find required libraries/headers:未能找到須要的庫/頭文件。有多是DEPENDS變量中沒有添加依賴的軟件包。

 

Installing。

     在安裝的時候bitbake調用do_install()任務進行安裝。

     安裝的過程實質上就是將待安裝的文件從${S}或${B}或${WORKDIR}處複製到${D}處。

     yocto中經常使用的install類型以下:

     Autotools或CMake:這兩種類型的install來講,yocto知道如何安裝,因此不須要在recipe中編寫do_install()任務。固然可使用do_install_append()函數來安裝yocto未安裝的內容。

     Other(make install):這種類型的install來講須要在recipe中編寫do_install()任務。在該任務中應該調用oe_runmake install命令而且須要傳遞目標目錄等變量,如:DESTDIR=${D} PREFIX=${D}等。

     Manual:這種類型的install來講須要在recipe中編寫do_install()任務。以後在do_install()任務中首先調用install -d命令在${D}目錄下建立指定目錄,以後使用install命令手動的複製文件到${D}目錄中。

 

Enabling System Service。

     一般在安裝完畢後,若須要在系統啓動時在後臺啓動一個進程,則須要在do_install_append()函數中指定。

     yocto支持兩種系統啓動方式,具體內容以下:

     SysVinit:須要在recipe中使用inherit update-rc.d。該類幫助完成sysvinit的設置。在recipe中須要設置 INITSCRIPT_PACKAGESINITSCRIPT_NAME, and INITSCRIPT_PARAMS這三個變量值。

     systemd:須要在recipe中使用inherit systemd。

 

Packaging。

     在這個階段bitbake調用do_package()函數進行處理。do_package()任務執行以下幾個階段:

     Splitting Files:將編譯且安裝好的文件分類放置,如:帶debug符號的版本、文檔以及其餘邏輯組成部分等。

     Running QA Checks:添加了insane類來執行必要的QA檢查。此處作的QA檢查可以過濾掉在運行過程當中一般的問題。

     Hand-Checking:手動檢查${WORKDIR}/packages-split目錄中的內容是否正確。

     Splitting an Application into Multiple Packages:將split的程序添加到不一樣的packages中。

     Installing a Post-Installation Script:執行post-installation腳本。

     Marking Package Architecture:若設置MACHINE變量,則說明yocto針對指定架構進行的,所以須要設置PACKAGE_ARCH = 「${MACHINE_ARCH}」。若沒有設置MACHINE變量,則說明yocto針對全部架構進行的,以暱稱須要設置inherit allarch在recipe中。

 

Properly Versioning Pre-Release Recipes。

     一般在recipe中進行以下設置:

     REALPV = 「0.8.16-rc1"

     PV = 「0.8.15+${REALPV}"

 

 

Post-Installation Scripts。

     Post-Installation腳本一般在package安裝到target後或者package添加到image後當即被執行。須要在recipe中添加以下內容:

     pkg_postinst_PACKAGENAME() {

     …...

     }

     若該函數成功執行則package被標識爲installed,不然該package被標識爲unpacked而且在image引導後執行。下面的函數給出delay執行的實例,即:

     pkg_postinst_PACKAGENAME() {

          if [ x"$D" = "x" ]; then

               # Actions to carry out on the device go here

          else

               exit 1

          fi

     }

 

Splitting an Application into Multiple Packages。

      在recipe中使用PACKAGES和FILES變量將文件分別放置到不一樣的package中。其中packages名稱由PACKAGE變量指定,每一個package中的文件內容由FILES變量指定,例如:

     PACKAGES =+ 「package1 package2"

     FILES_package1 = 「${bindir}/xxx"

     FILES_package2 = 「${bindir}/yyy"

 

Packaging externally produced binaries。

     使用bin_package類完成二進制文件的yocto操做。

     對於沒法使用bin_package類來講,須要在recipe中設置do_configure[noexec]=「1"以及do_compile[noexec]=「1」同時須要設置fetch和install的內容。

相關文章
相關標籤/搜索