手動建立一個recipe
阿新 • • 發佈:2018-12-12
https://my.oschina.net/linuxhunter/blog/736207
執行一個recipe。
呼叫#bitbake basename來執行一個recipe。其中包括:解壓縮原始碼包、log檔案以及編譯過程中的中間檔案等。 在每個recipe中定義temporary工作目錄,具體定義如下: BASE_WORKDIR ?= “${TMPDIR}/work" WORKDIR = “${BASE_WORKDIR}/${MULTIARCH_TARGET_SYS}/${PN}/${EXTENPE}${PV}-${PR}" TMPDIR: top-level build output directory MULTIMACH_TARGET_SYS: target system identifier EXTENDPE: the epoch PV: recipe version PR: recipe reversion
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的內容。