Yocto 中哪些配置应放在 distro conf,哪些应放在 image recipe?
结论
把影响整个发行版的软件构建策略放在 distro conf;把某个镜像需要安装的软件包和镜像功能放在 image recipe。
判断时可以先看设置的影响范围:需要影响其他软件编译的设置,通常放在发行版配置或相关软件的 recipe 中;只决定当前镜像最终包含什么的设置,通常放在 image recipe 中。
你的 dev.conf 与 dev-image.bb 不必一一对应。如果 dev 和 user 只是预装工具不同,通常使用一个 distro 和两个 image recipe 就足够了。
为什么两种文件都能修改变量,却不能随意互换?
你给出的目录结构本身没有问题。两类文件都使用 BitBake 语法,但变量生效的上下文不同,这一点容易混淆。
BitBake 先读取全局配置,再为每个 recipe 创建一份基础配置的副本。因此:
- 被选中的 distro conf 参与全局配置,其设置可以被各个 recipe 读取,具体效果还取决于 override、后续赋值和变量使用方式。
- image recipe 中的普通变量赋值作用于该 image recipe 的上下文,不会自动传播到它依赖的软件 recipe。
例如,在 dev-image.bb 中修改 DISTRO_FEATURES,另一个库的 recipe 不会因此自动按新的 feature 重新配置编译。BitBake 解析流程
常见配置应该放在哪里?
| 配置意图 | 通常放置的位置 | 典型变量或方式 |
|---|---|---|
| 决定发行版支持哪些软件能力 | distro conf | DISTRO_FEATURES |
| 统一选择软件 provider 或版本 | distro conf | PREFERRED_PROVIDER_*、PREFERRED_VERSION_* |
| 指定某个镜像安装哪些包 | image recipe | IMAGE_INSTALL |
| 为某个镜像启用 SSH 服务、调试工具等功能 | image recipe | IMAGE_FEATURES |
| 调整单个软件的编译方式 | 该软件的 recipe 或 .bbappend;发行版策略也可通过配置定向设置 | PACKAGECONFIG、构建参数等 |
| 临时调整本地构建 | build/conf/local.conf | 按需要设置相应变量 |
要注意区分 DISTRO_FEATURES 和 IMAGE_FEATURES:
DISTRO_FEATURES表达发行版希望支持的能力,相关 recipe 可以据此选择编译选项或依赖;效果取决于 recipe 是否实现了对应支持。IMAGE_FEATURES表达镜像需要的功能,由镜像相关 class 转换成软件包选择或 root filesystem 配置。
在 DISTRO_FEATURES 中启用某项功能,并不意味着对应软件已经完整安装进镜像。Yocto 变量说明
如何调整你的 dev 和 user 配置?
只有预装软件不同:保留一个 distro,使用两个镜像
假设 dev 镜像需要额外的排查工具,user 镜像使用相同的发行版构建策略,那么两者可以基于同一个镜像基础。
下面是一种组织方式,项目中未必已有这些配置。
dev-image.bb:
require recipes-core/images/core-image-minimal.bb
IMAGE_INSTALL:append = " strace"
IMAGE_FEATURES:append = " tools-debug"
user-image.bb:
require recipes-core/images/core-image-minimal.bb
选择同一个 DISTRO 后,分别构建:
bitbake dev-image
bitbake user-image
开发镜像会额外请求安装 strace 和调试工具。两个镜像仍共享同一套发行版策略及相容的软件包构建结果。
公共软件较多时,可以用 packagegroup 管理包集合,再由两个 image recipe 分别引用。在 recipe 内使用 IMAGE_FEATURES 设置镜像功能;如果需要从配置文件统一追加镜像功能,可以使用 EXTRA_IMAGE_FEATURES,并留意其影响范围。Yocto 镜像定制指南
软件构建策略也不同:保留两个 distro
如果 dev 和 user 需要不同的 DISTRO_FEATURES、软件 provider 或其他发行版级策略,分别保留 dev.conf 和 user.conf 是合理的。
两份配置可以通过公共 .inc 文件共享设置,再各自保留差异。相应的 image recipe 仍只负责镜像组成。
distro 和镜像的选择相互独立。例如,在构建配置中设置:
DISTRO = "dev"
然后执行:
bitbake dev-image
文件名之间没有自动绑定关系。执行 bitbake user-image 不会因为名称相似就自动切换到 user.conf。
修改后如何确认配置生效?
可以查看目标 recipe 的最终变量值和赋值历史:
bitbake -e dev-image
bitbake -e user-image
重点检查 DISTRO、DISTRO_FEATURES、IMAGE_INSTALL 和 IMAGE_FEATURES。如果修改涉及某个库的编译,还应检查该库 recipe 的环境,不能只看 image recipe 中的值。BitBake 环境检查方式
示例使用支持冒号 override 语法的 BitBake 写法;旧分支需要采用对应语法。:append 不会自动补空格,因此示例中的前导空格需要保留。另外,user-image 这个名称不保证镜像适合生产使用,其最终功能仍受基础镜像、distro 和本地配置共同影响。
备注:内容仅供参考。
