🔍
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=