版本 3.2 (gatesgarth)

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

最低系统要求

构建主机最低要求 gcc 6.0。对于无法提供该版本的旧主机发行版, 可以使用 buildtools-extended 压缩包 (可通过 scripts/install-buildtools 轻松安装)。

已移除的配方

以下配方已移除:

  • bjam-native:由 boost-build-native 取代

  • avahi-ui:并入主 avahi 配方,可通过其 PACKAGECONFIG 禁用 GTK 界面

  • build-compare:移除 packagefeed-stability 类后不再需要

  • dhcp:已过时,功能由 dhcpcd 和 kea 取代

  • libmodulemd-v1:由 libmodulemd 取代

  • packagegroup-core-device-devel:已过时

已移除的类

以下类(.bbclass 文件)已移除:

  • spdx:已过时。Yocto Project 坚定支持 SPDX,但此类采用旧方法,代码陈旧, 可能造成误导。meta-sdpxscanner 层的方法更现代且仍在积极开发,建议用它替代。

  • packagefeed-stability:哈希等价和可复现构建出现后,此类已过时。

pseudo 路径过滤与不匹配行为

pseudo 现在仅操作经过过滤的文件子集。这是它在 OpenEmbedded 中工作方式的重要变化。 默认情况下,pseudo 会监视并记录(加入数据库) fakeroot 环境中创建或修改的 所有文件。但该上下文中有很多文件的权限并不重要,例如 ${S}、${B}、 ${T}、${SSTATE_DIR}、中央共享状态控制目录等。

本版本启用 pseudo 的新功能,忽略这些目录树(由新变量 PSEUDO_IGNORE_PATHS 控制)。这会使数据库更清晰,并减少文件在 pseudo 上下文外修改时发生意外不匹配的 可能性。由于避免了进程间向服务器往返通信,也应减少部分开销。

这可能使某些现有配方失效。例如,有配方在 do_install 的 make install 中写入 ${B}/install。由于 ${B} 被列为不跟踪目录, 对该位置文件执行 chown root 时就发生错误。另一个例子是 tcl 配方: 其 S 指向源码树的子目录,但文件被写入该子目录上层的目录结构。 自己的配方遇到此类情况时,应扩展 PSEUDO_IGNORE_PATHS, 覆盖 pseudo 不应监视的其他路径。

此外,pseudo 处理不匹配的行为也已改变。如果发现文件的路径不同、但 inode 与此前 见过的另一个文件相同,不再执行事实证明相当危险的“修补”,而是调用 abort(), 并指向说明处理方法的 Wiki 页面。

multilib 条件添加运行时依赖现在要求 MLPREFIX

为解决此前难以处理的运行时依赖与 multilib 问题,现在有条件地添加依赖时, 必须在软件包名称前显式加上 MLPREFIX,例如 RDEPENDS 和 RRECOMMENDS 中的值。

如果自定义配方通过匿名 Python 或内联 Python 有条件地添加依赖,且希望配方支持 multilib,就需要确保依赖的软件包名称带有 ${MLPREFIX} 前缀。 例如,以下内容来自 glibc 配方:

RRECOMMENDS_${PN} = "${@bb.utils.contains('DISTRO_FEATURES', 'ldconfig', '${MLPREFIX}ldconfig', '', d)}"

当有条件地向 PACKAGES 添加本身带有依赖的软件包时,这也同样适用。 例如,以下内容来自 alsa-plugins 配方:

PACKAGES += "${@bb.utils.contains('PACKAGECONFIG', 'pulseaudio', 'alsa-plugins-pulseaudio-conf', '', d)}"
...
RDEPENDS_${PN}-pulseaudio-conf += "\
        ${MLPREFIX}libasound-module-conf-pulse \
        ${MLPREFIX}libasound-module-ctl-pulse \
        ${MLPREFIX}libasound-module-pcm-pulse \
"

qemu* 机器镜像不再包含 packagegroup-core-device-devel

过去,qemu* 机器的镜像会自动加入 packagegroup-core-device-devel。 但该组的用途和应包含的内容已不再明确,而且用户空间开发组件通常应在镜像或类层面 加入镜像,因此移除了这个软件包组。

该组过去引入以下软件包:

  • distcc-config

  • nfs-export-root

  • bash

  • binutils-symlinks

如果 qemu* 机器的镜像仍需要其中某些软件包,而尚未添加, 请将它们显式加入 IMAGE_INSTALL 或镜像依赖链的其他合适位置。

替换 DHCP 服务器与客户端

dhcp 软件包已无人维护,因此其功能由 dhcpcd (客户端)和 kea (服务器) 取代。需要相应替换配方和软件包名称引用。最常见的情况是将软件包层面的 dhcp-client 替换为 dhcpcd,将 dhcp-server 替换为 kea。 如有自定义配置文件,也需要调整,详情见 dhcpcd 和 kea 的上游文档。

打包变更

  • python3:urllib Python 包移入核心包,因为它不仅用于 netclient, 还广泛用于 email、xml、mimetypes 和 pydoc 等。此外,pathlib 也已进入核心包。

  • iptables:将 iptables-apply 和 ip6tables-apply 拆分到独立软件包, 避免主 iptables 包依赖 bash。

软件包 QA 检查变更

以下软件包 QA 检查过去产生警告,但它们可能表明存在真实的底层问题, 因此现在按错误处理:

此外,新增了以下检查,默认触发错误:

SRC_URI 的 file:// 条目不再支持通配符

SRC_URI 中 file:// URL 的通配符(* 和 ?)未能正确支持文件校验和。 因此,源码文件变更不一定改变 do_fetch 的任务校验和, 也就无法确保后续构建纳入变更后的文件。

在此处通用地实现通配匹配并不现实,因此决定移除 file:// URL 的通配符支持。 如果配方使用了它,需要显式列出所有预期匹配的文件;若仍需动态引入文件, 可以将文件放入子目录,并改为引用该目录。

deploy 类现在于 do_deploy 前清空 DEPLOYDIR

deploy 类实现的 do_deploy 现在在执行前清理 ${DEPLOYDIR},如同 do_install 在执行前清理 ${D}。 这降低了增量构建中 DEPLOYDIR 意外混入此前构建(甚至不同配置)文件的风险。

大多数继承 deploy 或与 do_deploy 交互的配方和类 不会受影响,除非它们为 do_deploy 添加了 同时 向 ${DEPLOYDIR} 放入文件的 prefuncs。这种情况应重构为使用 do_deploy_prepend。

自定义 SDK/SDK 风格配方需包含 nativesdk-sdk-provides-dummy

所有 nativesdk 软件包都因其安装后脚本片段而需要 /bin/sh, 因此 SDK 必须虚拟提供此包。现在由 nativesdk-sdk-provides-dummy 实现。 如果有自定义 SDK 配方,或类似 buildtools-tarball 的自建 SDK 风格配方, 需确保 TOOLCHAIN_HOST_TASK 包含 nativesdk-sdk-provides-dummy 或等效内容。

ld.so.conf 移回主 glibc 软件包

有些情况下不希望目标上包含 ldconfig,例如只读根文件系统中它没有太大意义, 但镜像构建时仍需要 /etc/ld.so.conf。

如果某配方将库安装到非标准位置,并安装 /etc/ld.so.conf.d/foo.conf 文件, 则需要 /etc/ld.so.conf 包含:

include /etc/ld.so.conf.d/*.conf

才能识别其他这些位置。

因此,/etc/ld.so.conf 现在放入主 glibc 包,确保镜像构建即将结束时 运行构建时 ldconfig,始终有 ld.so.conf 可用。

ld.so.conf 和 ld.so.conf.d/*.conf 占用空间很小,至少相对于约 700kB 的 ldconfig 二进制文件如此;如果 ldconfig 可安装,也可能需要它们, 因此镜像构建后仍保留这些文件。技术上可按需删除,但若还希望构建时 ldconfig 正常工作,处理起来并不简单。ROOTFS_POSTPROCESS_COMMAND 不适用, 因为 ldconfig 在该变量引用的函数之后执行。

runqemu 的 GL 支持现在使用主机 DRI 驱动

runqemu 现在在所有使用 virgl 的场景(指定 gl、gl-es 或 egl-headless 选项时)使用 mesa-native 库,但让它们加载主机上的 DRI 驱动。 遗憾的是,这可能无法与 Nvidia 等专有图形驱动良好配合。 如果使用这类驱动,可能需要切换到替代方案(如 Nvidia 硬件上的 Nouveau), 或避免使用 GL 选项。

Initramfs 镜像现在使用空后缀

参考 Initramfs 镜像(core-image-minimal-initramfs、 core-image-tiny-initramfs 和 core-image-testmaster-initramfs) 现在将 IMAGE_NAME_SUFFIX 设为空字符串,其默认值原为 ".rootfs"。 这些镜像不是根文件系统,因此 rootfs 标记没有意义。 如果直接查找这些配方生成的输出文件,需要适应不含 .rootfs 的新命名。

镜像产物命名变量集中到 image-artifact-names 类

以下镜像产物命名变量的默认值已从 bitbake.conf 移至新的 image-artifact-names 类:

镜像相关类现在继承该类。通常这些变量仅在镜像配方中引用,因此不受影响。 但如果非镜像配方或全局启用的类引用了这些变量,就需要添加 inherit image-artifact-names。

其他变更

  • 移除早已弃用的 PACKAGE_GROUP 支持,剩余引用应改为 FEATURE_PACKAGES。

  • 移除此前已弃用的 FILESPATHPKG。剩余引用应改为适当使用 FILESEXTRAPATHS。

  • 配置文件中错误地使用 inherit += (而不是 INHERIT +=)现在会报错, 不再默默忽略。

  • kbd 配方移除了 ptest 支持,因为上游改用难以在交叉编译环境中使用的 autotest。

  • oe.utils.is_machine_specific() 和 oe.utils.machine_paths() 因用途存疑而移除。 如果自己的代码恰好引用了它们,需要重新实现相关逻辑。

  • 构建 busybox 时默认禁用 i2ctransfer 模块,与其他 i2c 工具的禁用保持一致。 若要在 BusyBox 中构建它,可在自定义 BusyBox 配置中加入 CONFIG_I2CTRANSFER=y。

  • 补丁的 Upstream-Status 头约定中,Accepted 已被 Backport 取代, 因为两者几乎总是表示同一件事:补丁已进入上游,未来升级配方时可能需要移除。 为自己的补丁添加此头时,应使用 Backport 表示补丁已提交到上游。

  • 移除 tune-supersparc.inc 调优文件,因为它似乎很少使用,且已无法正常工作。