【加关注,不迷路,持续输出中...】

    Yocto Project 是一个开源的嵌入式 Linux 系统构建框架,其核心是通过元数据(Metadata)来定义如何构建系统。这些元数据主要包括配方(.bb / .bbappend)、配置(.conf)和类(.bbclass)文件。其中,.conf 文件扮演着全局定义、默认设置和用户配置的角色,是定制化构建过程的基石。理解 .conf 文件的语法是掌握 Yocto 的关键。本文将深入解析其语法规则、核心变量和最佳实践。


一、.conf 文件的基本语法结构

    .conf 文件的语法非常简单,核心是 键值对(Key-Value Pairs) 的赋值,并辅以一些特殊的运算符和语法结构。

1. 变量赋值(最基本的操作)

这是 .conf 文件中最常见的操作。

VARIABLE = "value"
  • 变量名(VARIABLE):通常使用大写字母和下划线命名。Yocto 定义了大量核心变量(如 MACHINEDISTROIMAGE_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:选择发行版策略(如 pokypoky-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_PKGARCHUBOOT_MACHINESERIAL_CONSOLESKERNEL_IMAGETYPE 等。

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

  • 作用:定义发行版(Distro)的整体策略和特性,如软件包选择策略、系统初始化管理器(systemd/sysvinit)、C 库(glibc/musl)等。
  • 核心变量DISTRO_NAMEDISTRO_FEATURESPREFERRED_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.conflocal.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;】…