Yocto 项目 OVERRIDES 机制:原理、结构与实战 - 你搞懂了吗?

🔍

B站相应的视频教程
📌 Yocto项目实战教程-第7章-定制镜像菜谱与内核菜谱
记得三连,标为原始粉丝,感谢大神支持。



在 Yocto 项目中,条件元数据是实现配置分析、应用选择和组合的核心机制。OVERRIDES 就是这套机制的核心代表。本文将全面讲解 OVERRIDES 的概念、工作原理、常见组成和实际使用例子,帮助您完全理解这一关键机制。


在这里插入图片描述

一、什么是 OVERRIDES?

OVERRIDES 是 BitBake 中的特殊变量,用于在解析元数据时,根据条件选择对应的变量版本。

它提供了一种 挖掘特定环境、应用选择的优选规则,使得同一变量可以根据不同的 MACHINE、DISTRO 或构建类型有条件地使用不同值。

示例:

TEST = "default"
TEST:os = "osspecific"
OVERRIDES = "os"

这里 BitBake 会选择 TEST:os 的值,而非 TEST,因为 OVERRIDES 中包含 “os”。


二、OVERRIDES 是如何被构造的?

首先,OVERRIDES 是由多个导入的辅助变量组合而成:

OVERRIDES = "${TARGET_OS}:${TRANSLATED_TARGET_ARCH}:pn-${PN}:${MACHINEOVERRIDES}:${DISTROOVERRIDES}:${CLASSOVERRIDE}${LIBCOVERRIDE}:forcevariable"

常见辅助变量含义

变量说明
MACHINEOVERRIDES补充本机器特定的条件值
DISTROOVERRIDES补充变量以适配特定发行版
CLASSOVERRIDE指明是 target 还是 native 类型
LIBCOVERRIDE用于根据 C 库切换选择

三、MACHINEOVERRIDES 实战

以 Raspberry Pi 4B 为例:

conf/machine/raspberrypi4-64.conf 中,有如下设置:

MACHINEOVERRIDES =. "raspberrypi4:"

这表示,在 OVERRIDES 解析时,会把 “raspberrypi4” 前置添加到 OVERRIDES 中:

OVERRIDES = "...:raspberrypi4:..."

使得这样的变量生效:

KERNEL_DEVICETREE:raspberrypi4 = "bcm2711-rpi-4-b.dtb"

四、值操作:append 和 prepend

BitBake 支持对条件变量进行值操作,如 append/“prepend”:

DEPENDS = "glibc ncurses"
DEPENDS:append:raspberrypi4 = " libdrm"

当 OVERRIDES 中含有 raspberrypi4 时,最终 DEPENDS = “glibc ncurses libdrm”

当前用法中推荐使用“:”分类符格式的 append/prepend 语法,不再使用 _append_prepend等旧样式,但旧样式仍被支持。


五、BitBake 内部如何处理 OVERRIDES

BitBake 会在读取 conf/菜谱/模板时,收集 OVERRIDES 并将其分割为列表:

self.overrides = self.getVar("OVERRIDES", False).split(":")

然后对所有变量进行匹配,优先选择 FOO:<override> 版本。


六、FILESOVERRIDES 的机制和使用

除了 OVERRIDES 之外,还有一个类似机制是 FILESOVERRIDES,专门用于控制 FILES 变量的条件应用:

FILESOVERRIDES = "${TRANSLATED_TARGET_ARCH}:${MACHINEOVERRIDES}:${DISTROOVERRIDES}"

它允许为 FILES:<override> 提供匹配判断依据。

实际例子:

FILES:imx8mp-nxp-bsp += "/opt/nxp-fw"

如果 FILESOVERRIDES 中包含 imx8mp-nxp-bsp,则上面的文件路径就会添加到最终打包文件列表中。

这种机制与 OVERRIDES 相同,但仅适用于 FILES 类变量。


七、BitBake -e 输出验证机制

要确认实际构建时的 OVERRIDES 构成,可使用如下命令:

bitbake -e | grep ^OVERRIDES=

示例输出(来自 NXP Yocto 工程构建环境):

DISTROOVERRIDES="ocean"
MACHINEOVERRIDES="aarch64:armv8a:use-nxp-bsp:imx-generic-bsp:imx-nxp-bsp:imxdrm:imxvpu:imxgpu:imxgpu2d:imxgpu3d:imxvulkan:mx8-generic-bsp:mx8-nxp-bsp:mx8m-generic-bsp:mx8m-nxp-bsp:mx8mp-generic-bsp:mx8mp-nxp-bsp:imx8mp-lpddr4-ocean"
OVERRIDES="runtime-gnu:toolchain-gcc:linux:aarch64:pn-defaultpkgname:aarch64:armv8a:use-nxp-bsp:imx-generic-bsp:imx-nxp-bsp:imxdrm:imxvpu:imxgpu:imxgpu2d:imxgpu3d:imxvulkan:mx8-generic-bsp:mx8-nxp-bsp:mx8m-generic-bsp:mx8m-nxp-bsp:mx8mp-generic-bsp:mx8mp-nxp-bsp:imx8mp-lpddr4-ocean:ocean:class-target:libc-glibc:forcevariable"

这表明最终拼接进 OVERRIDES 的所有组成,确认了 MACHINEOVERRIDES 与 DISTROOVERRIDES 的合并结果,并驱动了条件变量生效。


八、实际工程应用示例

1. 根据桥带设置定制内核分支

KBRANCH = "standard/base"
KBRANCH:qemuarm = "standard/arm-versatile-926ejs"
KBRANCH:qemux86 = "standard/common-pc/base"

根据 OVERRIDES 中是否包含 qemuarm,使用不同的内核 branch。

2. 配合 task 定制

FOO:task-compile = "value-a"
FOO:task-configure = "value-b"

这也是一种 OVERRIDES:BitBake 在 do_compile 任务时会添加 task-compile 到 OVERRIDES ,从而匹配到对应值。


九、总结和建议

  • OVERRIDES 是 Yocto 项目配置选择的核心机制
  • MACHINEOVERRIDES 和 DISTROOVERRIDES 是最常用的条件来源
  • 推荐使用 : 分类格式的 append/prepend 语法
  • FILESOVERRIDES 是 FILES 特化变量的匹配机制
  • 通过 bitbake -e 查看 OVERRIDES 构成是调试的重要手段
bitbake -e | grep ^OVERRIDES=

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值