【yocto】Yocto Project 配置層(.conf)文件語法詳解

? ? 【加關注,不迷路,持續輸出中...】

? ? Yocto Project 是一個開源的嵌入式 Linux 系統構建框架,其核心是通過元數據(Metadata)來定義如何構建系統。這些元數據主要包括配方(.bb / .bbappend)、配置(.conf)和類(.bbclass)文件。其中,.conf 文件扮演著全局定義、默認設置和用戶配置的角色,是定制化構建過程的基石。理解 .conf 文件的語法是掌握 Yocto 的關鍵。本文將深入解析其語法規則、核心變量和最佳實踐。


一、.conf 文件的基本語法結構

? ? .conf 文件的語法非常簡單,核心是?鍵值對(Key-Value Pairs)?的賦值,并輔以一些特殊的運算符和語法結構。

1. 變量賦值(最基本的操作)

這是 .conf 文件中最常見的操作。

VARIABLE = "value"
  • 變量名(VARIABLE):通常使用大寫字母和下劃線命名。Yocto 定義了大量核心變量(如?MACHINE,?DISTRO,?IMAGE_INSTALL),你也可以自定義變量。

  • 賦值運算符(=):這是最基本的賦值。

  • 值("value"):值通常用雙引號?"?或單引號?'?括起來。如果值中沒有空格或其他需要轉義的字符,引號有時可以省略,但強烈建議始終使用雙引號,以避免解析錯誤。

示例:

MACHINE = "raspberrypi4-64"
DISTRO = "poky"
IMAGE_INSTALL:append = " package1 package2"
2. 立即展開與延遲展開(= vs. :=)

? ? 這是 BitBake(Yocto 的構建引擎)變量的一個重要概念。

  • 延遲展開(=):默認的賦值方式。變量的值在實際被使用(引用)時才會被展開。這意味著,如果在賦值后有一個變量被重新定義,那么最終的值將是最后一次定義的結果。

A = "1"
B = "${A}"
A = "2"
# 此時 B 的值是 "2",因為 ${A} 在 B 被使用時才展開
  • 立即展開(:=):變量的值在賦值的那一刻就被立即展開。后續其他變量的改變不會影響它。

A = "1"
B := "${A}"
A = "2"
# 此時 B 的值是 "1",因為 ${A} 在賦值給 B 時就立即被展開了
3. 條件賦值(?=)

? ? “如果變量尚未被定義,則賦予其這個值。” 這是一種設置默認值的安全方式,不會覆蓋之前可能已經設置好的值。

# 如果 CUSTOM_Variable 之前沒有被設置,則將其值設為 "default_value"
CUSTOM_Variable ?= "default_value"
4. 弱默認賦值(??=)

? ? 與??=?類似,但優先級更低。它會在所有??=?賦值完成之后才生效。如果一個變量被??=?設置了,那么???=?將不會覆蓋它。這通常用于 .conf 文件層級中最低優先級的默認值設置。

5. 追加和前置(:append?/?:prepend)

? ? 這是向一個已存在的變量值添加內容而不覆蓋它的主要方法。這是推薦的做法,特別是在?bbappend?文件中修改配方行為時。

  • :append:在變量值的末尾添加內容。

IMAGE_INSTALL:append = " my-package"
# 注意:等號后的空格很重要,否則會連在一起變成 "package1package2"
  • :prepend:在變量值的開頭添加內容。

CFLAGS:prepend = "-I${S}/include "
# 同樣,注意空格

重要_append?和?_prepend(帶下劃線)是舊的語法,雖然仍被支持,但官方推薦使用帶冒號的新語法(:append?/?:prepend),因為它們的執行時機更符合直覺。

6. 覆蓋操作符(:override)

? ? 用于根據特定條件(如目標機器、發行版等)對變量進行賦值,語法是?VARIABLE:override = "value"

# 只有當 MACHINE 是 raspberrypi4-64 時,這個賦值才生效
EXTRA_IMAGE_FEATURES:raspberrypi4-64:append = " debug-tweaks"
# 或者更清晰的寫法
EXTRA_IMAGE_FEATURES:append:raspberrypi4-64 = " debug-tweaks"# 可以組合多個覆蓋條件
COMMON_FLAGS:mingw32:linux = "-some_special_flag"
7. 變量展開(${VARNAME})

? ? 引用其他變量的值。BitBake 會在處理時用該變量的實際字符串值進行替換。

MY_SRC_DIR = "${TOPDIR}/my-sources"
MY_FILE = "${MY_SRC_DIR}/file.txt"
8. 包含其他文件(include / require)

為了模塊化和復用配置,可以包含其他 .conf 文件。

  • include:嘗試包含指定的文件,如果文件不存在,不會報錯,會靜默繼續執行。

include conf/my-distro.conf
  • require:必須包含指定的文件,如果文件不存在,則會立即報錯并停止解析。用于強制依賴某個關鍵的配置文件。

require conf/machine/my-custom-machine.conf
9. 注釋(#)

? ? 使用?#?符號進行單行注釋。#?之后的所有內容都會被解析器忽略。

# 這是設置目標機器的變量
MACHINE = "qemux86-64" # 這是一個模擬器機器

二、重要的核心配置文件

? ? Yocto 構建系統會按順序加載多個層(Layer)中的 .conf 文件,后加載的會覆蓋先加載的相同變量。理解這些文件的作用域和加載順序至關重要。

1、meta/conf/bblayers.conf

  • 作用:定義構建系統應該使用哪些層(Layer)。這是啟動構建(bitbake)時首先讀取的配置文件。
  • 核心變量BBLAYERS(列出所有參與的層路徑)。

2、meta/conf/local.conf

  • 作用:用戶的主要配置入口。位于?build/conf?目錄下,通常由?oe-init-build-env?腳本從模板創建。所有針對當前構建目錄(TOPDIR)的個性化設置都應放在這里。

  • 核心變量

  1. MACHINE:定義目標硬件架構。
  2. DISTRO:選擇發行版策略(如?poky,?poky-tiny)。
  3. PACKAGE_CLASSES:設置包打包格式("rpm",?"deb",?"ipk")。
  4. EXTRA_IMAGE_FEATURES:為鏡像添加額外功能(如?"ssh-server-openssh",?"debug-tweaks")。
  5. IMAGE_INSTALL:定制鏡像中要安裝的軟件包列表。
  6. DL_DIR:下載緩存目錄。
  7. SSTATE_DIR:共享狀態緩存目錄。

3、Machine配置文件(meta-<layer>/conf/machine/*.conf

  • 作用:定義特定硬件平臺(Machine)的配置,如 CPU 架構、內核參數、硬件接口等。
  • 核心變量TUNE_PKGARCH,?UBOOT_MACHINE,?SERIAL_CONSOLES,?KERNEL_IMAGETYPE?等。

4、Distro配置文件(meta-<layer>/conf/distro/*.conf

  • 作用:定義發行版(Distro)的整體策略和特性,如軟件包選擇策略、系統初始化管理器(systemd/sysvinit)、C 庫(glibc/musl)等。
  • 核心變量DISTRO_NAME,?DISTRO_FEATURES,?PREFERRED_PROVIDER_virtual/xxx?等。

5、其他site.conf(全局站點級配置)、auto.conf(由自動化工具生成)等。


三、語法最佳實踐與陷阱

  1. 始終使用引號:避免因值中包含空格而導致解析錯誤。

  2. 優先使用?:append?和?:prepend:而不是直接使用?=?覆蓋,除非你明確想要覆蓋之前的所有值。這使你的層(Layer)更容易與其他層兼容。

  3. 理解覆蓋順序:Yocto 加載層的順序決定了變量的最終值。最后被解析的賦值獲勝。bblayers.conf?中列出的層順序決定了加載順序。

  4. 善用??=?設置默認值:在你的自定義層中,使用??=?來提供合理的默認值,同時允許用戶在?local.conf?中輕松覆蓋它。

  5. 注意空格:在?:append?和?:prepend?操作時,等號后面的空格是值的一部分,非常重要。

    # 正確
    IMAGE_INSTALL:append = " package1"
    # 錯誤(缺少空格,會導致 "core-image-minimalpackage1")
    IMAGE_INSTALL:append = "package1"
  6. 使用?bitbake -e?調試:要查看一個變量(例如?IMAGE_INSTALL)的最終值是如何由各種 .conf 和 .bb 文件組合而成的,可以使用命令:

    bitbake -e <recipe-name> | grep ^IMAGE_INSTALL=

    或者直接查看整個環境(輸出很長):

    bitbake -e > env_dump.txt

    然后在這個文件中搜索你關心的變量。


總結

? ? Yocto 的 .conf 文件語法簡潔而強大,其核心在于變量的操作和層的疊加。掌握?=,?:=,??=,?:append,?:prepend?和?:override?這些操作符的細微差別,是編寫靈活、可維護的 Yocto 配置層的關鍵。通過合理組織?bblayers.conf,?local.conf, 機器配置和發行版配置,你可以精確控制從底層硬件到上層應用的整個嵌入式 Linux 系統的構建過程。

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

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

相關文章

知識蒸餾 Knowledge Distillation 序列的聯合概率 分解成 基于歷史的條件概率的連乘序列

知識蒸餾 Knowledge Distillation 序列的聯合概率 分解成 基于歷史的條件概率的連乘序列 flyfish 代碼實踐 論文 Generalized Knowledge Distillation (GKD) On-Policy Distillation of Language Models: Learning from Self-Generated Mistakes 自回歸分解 將 “序列的聯合…

React15.x版本 子組件調用父組件的方法,從props中拿的,這個方法里面有個setState,結果調用報錯

在React 15.x中&#xff0c;子組件通過props調用父組件包含setState的方法時出現錯誤&#xff0c;最常見的原因是父組件方法的this指向丟失&#xff0c;導致調用setState時出現Cannot read property setState of undefined之類的錯誤。 核心原因 React類組件的方法默認不會綁定…

交叉編譯.so到鴻蒙使用

以下是在 Ubuntu 20.04 系統上的操作&#xff0c;tpc_c_cplusplus 他是把編譯的流程都給寫進去了&#xff0c;你只需要關注你要編譯的庫配置好環境就行了。 第一步&#xff1a;下載 tpc_c_cplusplus 倉庫地址&#xff1a; GitCode - 全球開發者的開源社區,開源代碼托管平臺…

LLaMA-Factory 中配置文件或命令行里各個參數的含義

常見參數分類 & 含義對照表&#xff1a; &#x1f539;模型相關參數含義model_name_or_path基礎模型的路徑&#xff08;本地或 HuggingFace Hub 上的名字&#xff0c;如 meta-llama/Llama-2-7b-hf&#xff09;adapter_name_or_pathLoRA/Adapter 權重路徑&#xff08;如果要…

JavaScript 性能優化實戰技術文章大綱

一、引言1.1 背景闡述在當今 Web 應用高度交互化、復雜化的趨勢下&#xff0c;JavaScript 作為核心腳本語言&#xff0c;其性能優劣直接決定了用戶體驗的好壞。從單頁應用&#xff08;SPA&#xff09;的流暢運行&#xff0c;到復雜數據可視化的實時交互&#xff0c;JavaScript …

正點原子【第四期】Linux之驅動開發學習筆記-2.1LED燈驅動實驗(直接操作寄存器)

前言&#xff1a; 本文是根據嗶哩嗶哩網站上“正點原子【第四期】手把手教你學Linux系列課程之 Linux驅動開發篇”視頻的學習筆記&#xff0c;該課程配套開發板為正點原子alpha/mini Linux開發板。在這里會記錄下正點原子 I.MX6ULL 開發板的配套視頻教程所作的實驗和學習筆記內…

【GM3568JHF】FPGA+ARM異構開發板 測試命令

本章節的命令操作均在板卡的終端執行 1 初探/sys目錄 與/proc目錄類似&#xff0c;/sys目錄下的文件/文件夾向用戶提供了一些關于設備、內核模塊、文件系統以及其他內核組件的信息&#xff0c; 如子目錄block中存放了所有的塊設備&#xff1b;子目錄bus中存放了系統中所有的總…

【Win】Motrix+Aria2瀏覽器下載加速

系統安裝Motrix Motrix官網下載&#xff0c;推薦下載NSIS Installer 安裝版 瀏覽器安裝Aria2 下載Aria2插件&#xff0c;然后開發者模式安裝到瀏覽器 Aria2擴展選項的配置如下&#xff1a; 端口號需要改成Motrix的&#xff0c;默認是16800

SpringBoot applicationContext.getBeansOfType獲取某一接口所有實現類,應用于策略模式

本文介紹了如何在Springboot項目中通過ApplicationContext獲取接口的實現類&#xff0c;并通過枚舉策略模式避免if/else&#xff0c;展示了如何使用getBeansOfType獲取TrafficModeService的實現&#xff0c;以及如何在實際場景中應用&#xff0c;如查詢交通方式費用 1 在實際工…

大模型問題:幻覺分類+原因+各個訓練階段產生幻覺+幻覺的檢測和評估基準

1. 什么是幻覺&#xff1f;大模型出現幻覺&#xff0c;簡而言之就是“胡說八道”。 用《A Survey on Hallucination in Large Language Models》1文中的話來講&#xff0c;是指模型生成的內容與現實世界事實或用戶輸入不一致的現象。 研究人員將大模型的幻覺分為事實性幻覺&…

智慧冷庫物聯網解決方案——實現降本增效與風險可控的冷庫管理新范式

一、冷庫管理痛點設備孤島化&#xff1a;冷庫品牌、型號分散&#xff0c;缺乏統一接入標準&#xff0c;數據互通難&#xff0c;依賴人工巡檢&#xff0c;故障響應滯后。能耗黑洞&#xff1a;制冷系統能耗占冷庫總運營成本的60%以上&#xff0c;傳統管理粗放&#xff0c;缺乏動態…

太空生活的八種要素

數代以來&#xff0c;科學家們一直在銀河系中搜尋地外行星存在生命的證據。他們試圖找到一組特定的環境條件與化學物質&#xff0c;在恰當的時間、恰當的地點交匯融合。 通過研究人類、植物、動物及微生物在地球上的生存與繁衍方式&#xff0c;科學家們已識別出生命演化所需的關…

Flutter 小技巧之有趣的 UI 骨架屏框架 skeletonizer

很久沒有更新過小技巧系列&#xff0c;今天簡單介紹一個非常好用的骨架屏框架 skeletonizer &#xff0c;它主要是通過將你現有的布局自動簡化為簡單的骨架&#xff0c;并添加動畫效果來實現加載過程&#xff0c;而使用成本則是簡單的添加一個 Skeletonizer 作為 parent &…

基于SpringBoot的寵物用品系統【2026最新】

作者&#xff1a;計算機學姐 開發技術&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源碼”。 專欄推薦&#xff1a;前后端分離項目源碼、SpringBoot項目源碼、Vue項目源碼、SSM項目源碼、微信小程序源碼 精品專欄&#xff1a;…

MongoDB 分片集群修改管理員密碼

記得關注一下博主&#xff0c;博主每天都會更新IT技術&#xff0c;讓你有意想不到的小收獲哦^_^ 文章目錄*記得關注一下博主&#xff0c;博主每天都會更新IT技術&#xff0c;讓你有意想不到的小收獲哦^_^*一、注釋MongoDB分片集群認證參數&#xff08;三臺主機都要操作&#xf…

C++函數重載與引用詳解

一、函數重載&#xff1a;同名函數的 “差異化生存”?1. 概念定義?函數重載&#xff08;Function Overloading&#xff09;是 C 的重要特性&#xff0c;指在同一作用域內&#xff0c;允許存在多個同名函數&#xff0c;但要求這些函數的參數列表必須不同。&#xff08;參數個數…

2025-08-17 李沐深度學習16——目標檢測

文章目錄1 介紹1.1 實際應用1.2 邊界框1.3 數據集2 錨框2.1 什么是錨框2.2 交并比2.3 分配標簽2.4 非極大值抑制3 經典目標檢測網絡3.1 R-CNN3.1.1 R-CNN (原始版本)3.1.2 Fast R-CNN3.1.3 Faster R-CNN3.1.4 Mask R-CNN3.2 單階段檢測器&#xff1a;SSD 和 YOLO3.2.1 SSD (Sin…

Bluedroid vs NimBLE

&#x1f539; 對比&#xff1a;Bluedroid vs NimBLE 1. 協議棧體積 & 內存占用 Bluedroid&#xff1a;體積大&#xff0c;RAM 占用也大&#xff08;幾十 KB 到上百 KB&#xff09;。NimBLE&#xff1a;輕量級&#xff0c;內存占用大概是 Bluedroid 的一半甚至更少。 &…

(純新手教學)計算機視覺(opencv)實戰八——四種邊緣檢測詳解:Sobel、Scharr、Laplacian、Canny

邊緣檢測詳解&#xff1a;Sobel、Scharr、Laplacian、Canny邊緣檢測是圖像處理和計算機視覺中的重要步驟&#xff0c;主要用于發現圖像中亮度變化劇烈的區域&#xff0c;即物體的輪廓、邊界或紋理特征。OpenCV 提供了多種常用的邊緣檢測算子&#xff0c;本教程將通過四種方法帶…

PyTorch 環境配置

目錄一、安裝 CUDA二、安裝 PyTorch1. 創建虛擬環境2. 安裝 PyTorch三、在 PyCharm 上創建一個 PyTorch 項目參考文章&#xff1a; 【2025年最新PyTorch環境配置保姆級教程&#xff08;附安裝包&#xff09;】 【超詳細 CUDA 安裝與卸載教程&#xff08;圖文教程&#xff09;】…