🔍
B站相應的視頻教程:
📌 Yocto項目實戰教程-第4章-4.2小節-菜譜
記得三連,標為原始粉絲。
在 Yocto 項目中,**菜譜(Recipe)**承載了包的配置信息、源碼獲取方式、編譯與安裝步驟,是將上游軟件集成進嵌入式鏡像的核心。本文從概念、結構、語法、示例到調試與最佳實踐,系統梳理菜譜的作用和使用方法,幫助讀者在 Yocto 構建系統中精準、高效地編寫與維護菜譜。
一、菜譜概念
- 定義:菜譜是一個后綴為
.bb
或.bbappend
的文本文件,以 BitBake 為引擎,描述如何獲取、編譯、打包、安裝某個軟件。 - 職責:
- 指定源碼位置(
SRC_URI
)及校驗(SRC_URI[sha256sum]
); - 定義依賴關系(
DEPENDS
、RDEPENDS_${PN}
); - 描述構建和安裝步驟(
do_compile
、do_install
等); - 配置包名、版本號、許可證等元數據。
- 指定源碼位置(
- 存放位置:通常放在各層(Layer)的
recipes-xxx/xxx/
目錄下,如meta-myapp/recipes-example/helloworld/helloworld_1.0.bb
。
二、菜譜文件結構
一個典型的 .bb
文件可分為以下幾個部分:
DESCRIPTION = "示例 HelloWorld 程序"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE;md5=abcdef123456..."SRC_URI = "git://example.com/helloworld.git;branch=main \file://extra-config.patch"SRCREV = "${AUTOREV}"
PV = "1.0+git${SRCPV}"DEPENDS = "glibc"
RDEPENDS_${PN} = "bash"inherit autotools pkgconfigdo_install_append() {install -d ${D}${bindir}install -m 0755 helloworld ${D}${bindir}
}
- 元數據段
DESCRIPTION
、LICENSE
、LIC_FILES_CHKSUM
:描述包內容、許可證及校驗;PV
(包版本)、PR
(發行號)等;
- 源碼定義段
SRC_URI
:源碼地址,可支持git://
、http://
、file://
等;SRCREV
/SRCPV
:用于確定 Git 提交版本;
- 依賴聲明段
DEPENDS
:構建時依賴的菜譜列表;RDEPENDS_${PN}
:運行時依賴的包;
- 繼承類聲明
inherit autotools
:自動調用configure
/make
/make install
;inherit pkgconfig
:生成 pkg-config 文件支持;
- 任務定義與擴展
do_compile
、do_install
:默認構建與安裝步驟;do_install_append()
:在do_install
后追加自定義命令;
三、常見菜譜類型
- 源代碼菜譜 (
.bb
)- 集成第三方開源軟件。如
curl_7.88.1.bb
;
- 集成第三方開源軟件。如
- 追加菜譜 (
.bbappend
)- 對已有菜譜做補丁或覆蓋。放入
meta-my-layer/recipes-xxx/foo/foo_%.bbappend
;
- 對已有菜譜做補丁或覆蓋。放入
- 包組菜譜 (
packagegroup-*.bb
)- 一次性安裝一組相關包,如
packagegroup-core-ssh-openssh.bb
;
- 一次性安裝一組相關包,如
- 鏡像菜譜 (
image.bb
)- 定義最終鏡像中要包含的包,如
core-image-minimal.bb
;
- 定義最終鏡像中要包含的包,如
四、核心語法要點
語法元素 | 作用 |
---|---|
${S} , ${B} | 源碼目錄、構建目錄變量 |
${D} , ${PKGDATA_DIR} | 安裝目標根目錄、數據目錄 |
S = "${WORKDIR}/git" | 指定源碼實際解壓位置 |
BB_NO_NETWORK = "0" | 允許在構建時聯網下載 |
PACKAGE_ARCH | 指定包目標架構 |
EXTRA_OEMAKE | 傳遞給 make 的額外參數 |
BBCLASSEXTEND = "native" | 生成兩個變體:native(宿主)與目標體系結構 |
五、實例演示:HelloWorld 菜譜
SUMMARY = "HelloWorld Demo"
DESCRIPTION = "一個簡單的 HelloWorld 應用示例"
SECTION = "examples"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE;md5=abcdef123456"SRC_URI = "git://github.com/example/helloworld.git;branch=main"
SRCREV = "abcdef1234567890abcdef1234567890abcdef12"inherit autotoolsdo_install() {install -d ${D}${bindir}install -m 0755 helloworld ${D}${bindir}
}
- 克隆源碼
- 自動執行
./configure
、make
- 在安裝階段,將編譯生成的可執行文件拷貝到鏡像
/usr/bin
目錄
Tips:在本地調試時,可通過
bitbake -c devshell helloworld
進入源代碼目錄,手動運行構建命令。
六、高級特性
- 繼承自定義類
- 自定義
myclass.bbclass
,將通用函數、變量抽象出來; - 在菜譜中
inherit myclass
,復用邏輯。
- 自定義
.bbappend
補丁機制- 對不上游菜譜進行行為定制或 BUG 修復;
- 文件命名需保持和原菜譜相同的版本表達式。
- 多架構支持
- 使用
COMPATIBLE_MACHINE
限定機器; - 使用條件語句
python __anonymous()
在特定機器上調整參數。
- 使用
- 動態依賴與變量
DEPENDS += "libfoo-native"
:在運行時再追加依賴;python __anonymous()
/BB_ENV_EXTRAWHITE
:動態生成變量。
七、BitBake 解析流程
- 元數據加載:掃描所有層中
.bb
、.bbappend
; - 任務依賴分析:根據
DEPENDS
、RDEPENDS
構建 DAG; - 任務執行:按順序執行
do_fetch
、do_unpack
、do_patch
、do_configure
、do_compile
、do_install
; - 包打包:生成
.ipk
/.deb
/.rpm
; - 鏡像組裝:將所選包放入根文件系統,生成最終鏡像。
八、菜譜編寫與調試工作流
- 創建菜譜
- 執行
bitbake-layers create-layer meta-myapp
; - 在
recipes-myapp/myapp/
新建myapp_1.0.bb
;
- 執行
- 本地測試
bitbake -c fetch myapp
→bitbake -c devshell myapp
→ 手動調試;bitbake myapp
完整構建并查看日志 (tmp/work/.../temp/log.*
);
- 增量修改
- 修改
.bb
后執行bitbake -c cleanall myapp && bitbake myapp
;
- 修改
- 日志分析
- 查看
temp/log.do_compile
、temp/log.do_install
,定位錯誤;
- 查看
- 優化與重用
- 抽象公共邏輯進
.bbclass
; - 將常用補丁與配置整理到
meta-myapp/recipes-support/
;
- 抽象公共邏輯進
九、最佳實踐
- 統一版本表達:
PV = "1.0+git${SRCPV}"
,確保每次橋接最新提交; - 最小依賴原則:僅在
DEPENDS
中聲明編譯時必需的庫; - 補丁管理:將補丁按功能命名,如
fix-crash.patch
,并維護series
文件記錄; - 變量注釋:對自定義變量要添加注釋,提升可讀性;
- 遵循 Yocto 社區規范:變量命名、層結構與官方保持一致,便于后期合并官方更新。
十、總結
菜譜是 Yocto 項目中最關鍵的元數據單元,通過對菜譜結構和語法的深入理解,結合實例調試與最佳實踐,能夠快速集成、定制上游軟件,實現高效、可維護的嵌入式 Linux 鏡像構建流程。希望本文所述內容,有助于你在實際項目中編寫更精準、清晰、健壯的菜譜。
🔍
B站相應的視頻教程:
📌 Yocto項目實戰教程-第4章-4.2小節-菜譜
記得三連,標為原始粉絲。