Yocto項目實戰教程 · 第4章:4.2小節-菜譜

🔍

B站相應的視頻教程
📌 Yocto項目實戰教程-第4章-4.2小節-菜譜
記得三連,標為原始粉絲。




在 Yocto 項目中,**菜譜(Recipe)**承載了包的配置信息、源碼獲取方式、編譯與安裝步驟,是將上游軟件集成進嵌入式鏡像的核心。本文從概念、結構、語法、示例到調試與最佳實踐,系統梳理菜譜的作用和使用方法,幫助讀者在 Yocto 構建系統中精準、高效地編寫與維護菜譜。


在這里插入圖片描述

一、菜譜概念

  • 定義:菜譜是一個后綴為 .bb.bbappend 的文本文件,以 BitBake 為引擎,描述如何獲取、編譯、打包、安裝某個軟件。
  • 職責
    1. 指定源碼位置(SRC_URI)及校驗(SRC_URI[sha256sum]);
    2. 定義依賴關系(DEPENDSRDEPENDS_${PN});
    3. 描述構建和安裝步驟(do_compiledo_install 等);
    4. 配置包名、版本號、許可證等元數據。
  • 存放位置:通常放在各層(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}
}
  1. 元數據段
    • DESCRIPTIONLICENSELIC_FILES_CHKSUM:描述包內容、許可證及校驗;
    • PV(包版本)、PR(發行號)等;
  2. 源碼定義段
    • SRC_URI:源碼地址,可支持 git://http://file:// 等;
    • SRCREV / SRCPV:用于確定 Git 提交版本;
  3. 依賴聲明段
    • DEPENDS:構建時依賴的菜譜列表;
    • RDEPENDS_${PN}:運行時依賴的包;
  4. 繼承類聲明
    • inherit autotools:自動調用 configure/make/make install
    • inherit pkgconfig:生成 pkg-config 文件支持;
  5. 任務定義與擴展
    • do_compiledo_install:默認構建與安裝步驟;
    • do_install_append():在 do_install 后追加自定義命令;

三、常見菜譜類型

  1. 源代碼菜譜 (.bb)
    • 集成第三方開源軟件。如 curl_7.88.1.bb
  2. 追加菜譜 (.bbappend)
    • 對已有菜譜做補丁或覆蓋。放入 meta-my-layer/recipes-xxx/foo/foo_%.bbappend
  3. 包組菜譜 (packagegroup-*.bb)
    • 一次性安裝一組相關包,如 packagegroup-core-ssh-openssh.bb
  4. 鏡像菜譜 (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}
}
  1. 克隆源碼
  2. 自動執行 ./configuremake
  3. 在安裝階段,將編譯生成的可執行文件拷貝到鏡像 /usr/bin 目錄

Tips:在本地調試時,可通過 bitbake -c devshell helloworld 進入源代碼目錄,手動運行構建命令。


六、高級特性

  1. 繼承自定義類
    • 自定義 myclass.bbclass,將通用函數、變量抽象出來;
    • 在菜譜中 inherit myclass,復用邏輯。
  2. .bbappend 補丁機制
    • 對不上游菜譜進行行為定制或 BUG 修復;
    • 文件命名需保持和原菜譜相同的版本表達式。
  3. 多架構支持
    • 使用 COMPATIBLE_MACHINE 限定機器;
    • 使用條件語句 python __anonymous() 在特定機器上調整參數。
  4. 動態依賴與變量
    • DEPENDS += "libfoo-native":在運行時再追加依賴;
    • python __anonymous() / BB_ENV_EXTRAWHITE:動態生成變量。

七、BitBake 解析流程

  1. 元數據加載:掃描所有層中 .bb.bbappend
  2. 任務依賴分析:根據 DEPENDSRDEPENDS 構建 DAG;
  3. 任務執行:按順序執行 do_fetchdo_unpackdo_patchdo_configuredo_compiledo_install
  4. 包打包:生成 .ipk/.deb/.rpm
  5. 鏡像組裝:將所選包放入根文件系統,生成最終鏡像。

八、菜譜編寫與調試工作流

  1. 創建菜譜
    • 執行 bitbake-layers create-layer meta-myapp
    • recipes-myapp/myapp/ 新建 myapp_1.0.bb
  2. 本地測試
    • bitbake -c fetch myappbitbake -c devshell myapp → 手動調試;
    • bitbake myapp 完整構建并查看日志 (tmp/work/.../temp/log.*);
  3. 增量修改
    • 修改 .bb 后執行 bitbake -c cleanall myapp && bitbake myapp
  4. 日志分析
    • 查看 temp/log.do_compiletemp/log.do_install,定位錯誤;
  5. 優化與重用
    • 抽象公共邏輯進 .bbclass
    • 將常用補丁與配置整理到 meta-myapp/recipes-support/

九、最佳實踐

  • 統一版本表達PV = "1.0+git${SRCPV}",確保每次橋接最新提交;
  • 最小依賴原則:僅在 DEPENDS 中聲明編譯時必需的庫;
  • 補丁管理:將補丁按功能命名,如 fix-crash.patch,并維護 series 文件記錄;
  • 變量注釋:對自定義變量要添加注釋,提升可讀性;
  • 遵循 Yocto 社區規范:變量命名、層結構與官方保持一致,便于后期合并官方更新。

十、總結

菜譜是 Yocto 項目中最關鍵的元數據單元,通過對菜譜結構和語法的深入理解,結合實例調試與最佳實踐,能夠快速集成、定制上游軟件,實現高效、可維護的嵌入式 Linux 鏡像構建流程。希望本文所述內容,有助于你在實際項目中編寫更精準、清晰、健壯的菜譜。


🔍

B站相應的視頻教程
📌 Yocto項目實戰教程-第4章-4.2小節-菜譜
記得三連,標為原始粉絲。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/79947.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/79947.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/79947.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【pytorch】torch.nn.Unfold操作

說明 一個代碼里涉及到了unfold的操作,看了半天官網都沒整明白維度怎么變化的,參考這個鏈接搞明白了: https://blog.csdn.net/ViatorSun/article/details/119940759 https://zhuanlan.zhihu.com/p/361140988 維度計算 輸入( N,…

Linux 固定IP地址

一.查看網口狀態: $ ip a 二.配置靜態IP文件: $ sudo vi /etc/network/interface auto eth0 iface eth0 inet static address 192.168.0.252 gateway 192.168.0.1 netmask 255.255.255.0 #network 192.168.0.0 #broadcast 192.168.0.255 三.重啟網卡讓新…

android的 framework 有哪些知識點和應用場景

Android Framework 知識點 1. 四大組件 Activity(活動) 是 Android 應用中最基本的組件,用于實現用戶界面。一個 Activity 通常對應一個屏幕的內容。有自己的生命周期,包括 onCreate、onStart、onResume、onPause、onStop、onDe…

如何在PDF.js中改造viewer.html以實現PDF的動態加載

在PDF.js中改造viewer.html實現PDF動態加載,需結合參數傳遞、文件流處理及跨域配置等技術。以下是綜合多個技術方案的核心實現步驟: ?一、基礎參數傳遞法? 1. ?URL參數動態加載? 通過修改viewer.html的URL參數傳遞PDF路徑,適用于靜態文…

組件之間的數據通信方式

Vue 的傳值方式(即組件之間的數據通信方式)根據組件關系不同(父子、兄弟、跨層級)有所區別。下面是常見的傳值方式,按使用場景來分類: 一、父子組件傳值 1. props(父 -> 子) 父…

組件是怎樣寫的(1):虛擬列表-VirtualList

本篇文章是《組件是怎樣寫的》系列文章的第一篇,該系列文章主要說一下各組件實現的具體邏輯,組件種類取自 element-plus 和 antd 組件庫。 每個組件都會有 vue 和 react 兩種實現方式,可以點擊 https://hhk-png.github.io/components-show/ …

個性化的配置AndroidStudio

Android Studio 提供諸多向導和模板,可用于驗證 Java 開發套件 (JDK) 和可用 RAM 等系統要求,以及配置默認設置,例如經過優化的默認 Android 虛擬設備 (AVD) 模擬和更新的系統映像。本文檔介紹了可用于自定義 Android Studio 使用方式的其他配…

人類行為的原動力是自我保存-來自ChatGPT

自我保存(Self-Preservation)確實可以說是人類行為最原始、最底層的驅動力。 簡單來說: 無論我們做什么,表面看動機五花八門,實際上歸根到底都繞不開活下去、保護自己。 💡 從不同層面理解這個觀點&#…

SystemVerilog語法之內建數據類型

簡介:SystemVerilog引進了一些新的數據類型,具有以下的優點:(1)雙狀態數據類型,更好的性能,更低的內存消耗;(2)隊列、動態和關聯數組,減少內存消耗…

藍光三維掃描技術:高效精密測量相機鏡頭底座注塑件

如今越來越多的攝影愛好者、vlog拍攝者使用數碼相機以及無人機,隨時隨地記錄生活中的每一刻美好瞬間,對相機設備的要求也不斷提高。 — 案例背景 — 相機鏡頭底座涉及鏡頭裝置可靠、螺絲位置度連接以及殼體組裝,鏡頭底座注塑件生產廠商&…

【前端】【面試】【業務場景】前端如何獲取并生成設備唯一標識

? 總結 問題:前端如何獲取并生成設備唯一標識? 核心要點:瀏覽器原生信息有限,但通過組合多個維度可生成設備指紋(Device Fingerprint),用于唯一標識設備。 常見方式: 瀏覽器信息&…

極刻AI搜v1.0 問一次問題 AI工具一起答

軟件名:極刻AI搜 版本:v1.0 功能:囊括了互聯網上比較好用的一些支持”搜索“的網站或者工具 開發平臺:nodepythonweb 分類有: AI搜索(支持智能問答的AI搜索引擎) 常規搜索:&#xff…

《2025最新Java面試題全解析:從基礎到高并發架構設計》

25年Java開發者面試中最常考察的100道面試題,涵蓋Java基礎、JVM、多線程、Spring框架、分布式系統等核心知識點,并結合大廠真實面試案例進行深度解析,助你順利通過技術面試。 一、Java基礎篇(高頻15問) 1. HashMap底層…

[c語言日寄]免費文檔生成器——Doxygen在c語言程序中的使用

【作者主頁】siy2333 【專欄介紹】?c語言日寄?:這是一個專注于C語言刷題的專欄,精選題目,搭配詳細題解、拓展算法。從基礎語法到復雜算法,題目涉及的知識點全面覆蓋,助力你系統提升。無論你是初學者,還是…

51c嵌入式~單片機~合集5~DMA

我自己的原文哦~ https://blog.51cto.com/whaosoft/12940885 一、DMA DMA,全稱Direct Memory Access,即直接存儲器訪問。 DMA傳輸將數據從一個地址空間復制到另一個地址空間,提供在外設和存儲器之間或者存儲器和存儲器之間的高速數據傳輸…

Linux隨記(十七)

一、綜合報錯:fork: Cannot allocatte memory 和 modues is unknwon 和 pam_limits(crond:session) : unknwon limit item ‘noproc’ 1.1 fork: Cannot allocatte memory 處理 - 隨記 排查時間2025年4月。 環境描述: 2014年左右的服務器,…

支持mingw g++14.2 的c++23 功能print的vscode tasks.json生成調試

在mingw14.2版本中, print庫的功能默認沒有開啟, 生成可執行文件的tasks.json里要顯式加-lstdcexp, 注意放置順序. tasks.json (支持mingw g14.2 c23的print ) {"version": "2.0.0","tasks": [{"type": "cppbuild","…

賦能能源 | 智慧數據,構建更高效智能的儲能管理系統

行業背景 隨著新能源產業的快速發展,大規模儲能系統在電力調峰、調頻及可再生能源消納等領域的重要性日益凸顯。 儲能電站作為核心基礎設施,其能量管理系統(EMS)需要處理海量實時數據,包括電池狀態、功率變化、環境監…

使用 Flutter 遇坑小計

前言 首先, 谷哥很貼心地為國內用戶準備了一份使用手冊 不過很遺憾 就算你照著它的手冊來了, 還是會在后續使用中遇到其它的坑 今天我踩了, 保不齊明天就是其他人(lol) running gradle task ‘assembledebug’ stuck 首先去確定下當下Android Studio(或者說你目前的Flutter項…

鏈表與文件

鏈表 單鏈表 1.鏈表的初始化 typedef struct node {char name[100];int number;struct node *next; }Node,*LinkList;}Node;2.鏈表的初始化函數(Initlist) LinkList InitList() {LinkList head;head(Node*)malloc(sizeof(Node));head->nextNULL;return head; }3.建立鏈…