執行一個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_PACKAGES
, INITSCRIPT_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的內容。