3.4 (honister) 迁移说明

本节介绍如何从上一版本迁移到 Yocto Project 3.4 版本(代号“honister”)。

覆盖语法变更

本版本使用 : 字符代替 _ 表示覆盖,最常用于变量的条件赋值。 因此,以下条目:

SRC_URI_qemux86 = "file://somefile"

现在变为:

SRC_URI:qemux86 = "file://somefile"

因为 qemux86 是一个覆盖项。这适用于所有覆盖语法。例如:

SRC_URI_append = " file://somefile"
SRC_URI_append_qemux86 = " file://somefile2"
SRC_URI_remove_qemux86-64 = "file://somefile3"
SRC_URI_prepend_qemuarm = "file://somefile4 "
FILES_${PN}-ptest = "${bindir}/xyz"
IMAGE_CMD_tar = "tar"
BASE_LIB_tune-cortexa76 = "lib"
SRCREV_pn-bash = "abc"
BB_TASK_NICE_LEVEL_task-testimage = '0'

现在变为:

SRC_URI:append = " file://somefile"
SRC_URI:append:qemux86 = " file://somefile2"
SRC_URI:remove:qemux86-64 = "file://somefile3"
SRC_URI:prepend:qemuarm = "file://somefile4 "
FILES:${PN}-ptest = "${bindir}/xyz"
IMAGE_CMD:tar = "tar"
BASE_LIB:tune-cortexa76 = "lib"
SRCREV:pn-bash = "abc"
BB_TASK_NICE_LEVEL:task-testimage = '0'

这也适用于 从数据存储查询变量, 例如使用 getVar 等函数时,d.getVar("RDEPENDS_${PN}") 应变为 d.getVar("RDEPENDS:${PN}")。

一些覆盖很明显,例如 MACHINE 和 DISTRO;另一些则不太直观, 例如 RDEPENDS、FILES 等打包变量将软件包名 (如 ${PN}、${PN}-ptest)用作覆盖。这些覆盖不一定出现在 OVERRIDES 中,而是在打包等特定上下文中有条件地应用。task-<taskname> 也是与上下文相关的 覆盖,其上下文是特定任务。调优覆盖又是一种特殊情况:有些代码将其作为覆盖使用, 有些则不是。我们计划让调优代码未来更一致地使用覆盖。

某些变量不使用覆盖语法,包括 layer.conf 中 BBFILE_PATTERN 等变量的 后缀、SRCREV_xxx (其中 xxx 是 SRC_URI 中的名称), 以及 PREFERRED_VERSION_xxx。尤其是 layer.conf 的后缀可能与 DISTRO 覆盖同名,容易混淆。发现这些问题后,我们计划进一步改善一致性。

为帮助迁移层,OE-Core 提供了脚本。配置好层所使用的覆盖项后,可运行:

<oe-core>/scripts/contrib/convert-overrides.py <layerdir>

备注

请阅读脚本中的说明:它并非完全自动化,也不保证处理所有情况。 尤其需要告知脚本该层使用哪些覆盖(通常是机器和发行版的名称/覆盖项)。 请仔细检查结果,因为脚本可能转换过多,会转换函数名和变量名中的 _append、_remove 和 _prepend 引用。

这项转换很重要,因为变量名也会使用下划线,而不一定表示覆盖。 新语法让 BitBake 更可靠地区分覆盖与普通名称,也有助于继续改进和简化语法, 提升易用性。此外,BitBake 不再需要猜测 my_functionname 中的 functionname 是否为覆盖,也不必为此维护庞大的查找列表,因此效率也应有所改善。

新增主机依赖

构建主机现在必须安装 lz4c、pzstd 和 zstd 命令,以支持 LZ4 和 Zstandard 压缩。多数 Linux 发行版通常通过 lz4 和 zstd 软件包提供它们。 如果发行版未提供,也可以使用 buildtools 压缩包中的版本。 更多信息见 构建主机所需的软件包。

已移除的配方

本版本移除了以下配方:

  • assimp:许可证方面存在问题,且没有其他使用者

  • clutter-1.0:旧组件,移至 meta-gnome

  • clutter-gst-3.0:旧组件,移至 meta-gnome

  • clutter-gtk-1.0:旧组件,移至 meta-gnome

  • cogl-1.0:旧组件,移至 meta-gnome

  • core-image-clutter:随 clutter 一同移除

  • linux-yocto:移除 5.4 版本配方(仍提供 5.14 和 5.10)

  • mklibs-native:缺乏积极测试,且上游 mklibs 仍要求 Python 2

  • mx-1.0:已过时(最后发布于 2012 年),没有已知层使用它

  • packagegroup-core-clutter:随 clutter 一同移除

已移除的类

  • clutter:随 clutter 本身移至 meta-gnome

  • image-mklibs:缺乏积极测试,且上游 mklibs 仍要求 Python 2

  • meta:已无实用价值。需要跳过软件包安装的配方应改为继承 nopackages。

默认禁用预链接

近期测试表明,只有不启用 PIE 时预链接才有效 (见 此处)。 PIE 是值得启用的安全功能,也是 Yocto Project 唯一提供并测试的配置, 因此继续启用 prelink 已没有意义。

此外,这部分代码似乎无人维护,仍有未解决的错误,包括 这个严重问题。 考虑到 prelink 会执行复杂的地址运算并重写二进制文件,最佳选择是禁用它。 如果自己的配置当前启用了此功能,建议考虑禁用。

虚拟运行时提供者

配方不应在 RPROVIDES 和 RDEPENDS 中使用 virtual/ 字符串, 因为它在这些变量中没有特殊含义,会造成混淆;这与构建时的 PROVIDES 和 DEPENDS 不同。

调优文件移至特定架构目录

conf/machine/include 中的调优文件已移至该位置下各自架构名称对应的目录。 例如,x86 文件移至 x86 子目录,MIPS 文件移至 mips 子目录。 ARM 调优还多了一层(armv8a、armv8m 等),部分文件重命名以保持一致。 参见 此提交。

如果引用了调优文件(例如在自定义机器配置中),需要更新这些引用。

可扩展 SDK 的主机扩展

对于普通 SDK,某些层无条件向 TOOLCHAIN_HOST_TASK 追加内容没有问题, 但当 eSDK 尝试将该变量覆盖为自己的值时就会出问题。eSDK 不安装此变量指定的 软件包,而是使用 native 配方,这是一种截然不同的方式。结果可能是二进制文件 被加入 SDK 却没有重定位,产生难以理解的错误。

为避免这些问题,新增了 TOOLCHAIN_HOST_TASK_ESDK。 若要扩展 eSDK 主机部分安装的内容,现在需要设置此变量。

软件包与配方拆分

  • 为便于维护,perl-cross 已从主 perl 配方中拆分为独立的 perlcross 配方。 如果有 perl 配方的 bbappend,可能需要扩展它们。

  • wayland 配方现在将二进制文件放入 wayland-tools 软件包, 而不是 wayland-dev。

  • Xwayland 已从 xserver-xorg 源码树中拆分出来,因此现在拥有独立的 xwayland 配方。如果镜像需要 Xwayland,可能需要显式添加它。

  • rpm 软件包的 RRECOMMENDS 不再包含 rpm-build。 如果镜像仍需要 RPM 软件包构建功能,而尚未显式添加 rpm-build,请将其加入镜像。

  • Python 的 statistics 标准模块现在打包为独立的 python3-statistics, 不再放入 python3-misc。

镜像/SDK 生成变更

  • 构建 SDK 时现在禁用对 do_build 任务的递归依赖。 通常不需要这些依赖。如果确实遇到问题,通常是缺少需要补充的显式依赖。

  • 构建镜像时,不再忽略安装“补充”软件包(例如 *-dbg 和 *-dev)期间的错误。 过去部分此类软件包存在安装问题,如今已不再如此。 如果仍因此报错,需要修复安装或打包问题。

  • 如果启用多种软件包类型(非典型配置),构建镜像时仅生成实际用于镜像构建的类型, 即 PACKAGE_CLASSES 的第一项。如果 CI 系统需要原来的行为, 请使用 bitbake --runall build <target>。

  • 将 LICENSE_CREATE_PACKAGE 设为 "1" 时,不再自动将 -lic 软件包 加入所有其他软件包的 RRECOMMENDS。 如果希望安装镜像中各软件包对应的全部许可证包,应改为将新的 lic-pkgs 功能加入 IMAGE_FEATURES。

其他变更

  • BitBake 通过 HTTPS 获取源码时,现在会正确验证证书。如果自定义配方因此报错, 需要使用镜像,或与相关服务器的运营者共同解决问题。

  • avahi 默认禁用 GTK+ 支持。若要重新启用,可在 avahi 配方的 bbappend 或自定义发行版配置文件中设置 AVAHI_GTK = "gtk3"。

  • 将 BUILD_REPRODUCIBLE_BINARIES 设为 "0" 时,不再使用异常陈旧的 2011 年 4 月 回退日期,而是如预期那样禁用可复现二进制构建。

  • 将 noexec/nostamp/fakeroot 变量标志设为 "1" 以外的任何值,现在都会触发警告。 应设置为 "1" 来启用,或不设置以禁用。

  • 移除了此前已弃用的 COMPRESS_CMD 和 CVE_CHECK_CVE_WHITELIST。 应分别改用 CONVERSION_CMD 和 CVE_CHECK_WHITELIST (后者在 4.0 中由 CVE_CHECK_IGNORE 取代)。

  • 移除了 utils 类原来提供的过时函数 oe_machinstall。 对于机器特定的安装,建议改用获取器内置的覆盖支持,或一般的覆盖机制。

  • EXTRA_USERS_PARAMS 中的 useradd 和 usermod 条目不再支持 -P (--clear-password)选项。它原本通过 shadow 配方的自定义补丁实现, 与 shadow 4.9 上游新增的 -P 选项冲突,而且本质上并不安全。 仍支持硬编码密码,但需要先哈希,示例见 EXTRA_USERS_PARAMS。