1. 程式人生 > >手動建立一個recipe

手動建立一個recipe

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的內容。