版本 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-confignfs-export-rootbashbinutils-symlinks
如果 qemu* 机器的镜像仍需要其中某些软件包,而尚未添加,
请将它们显式加入 IMAGE_INSTALL 或镜像依赖链的其他合适位置。
替换 DHCP 服务器与客户端
dhcp 软件包已无人维护,因此其功能由 dhcpcd (客户端)和 kea (服务器)
取代。需要相应替换配方和软件包名称引用。最常见的情况是将软件包层面的
dhcp-client 替换为 dhcpcd,将 dhcp-server 替换为 kea。
如有自定义配置文件,也需要调整,详情见 dhcpcd 和 kea 的上游文档。
打包变更
python3:urllibPython 包移入核心包,因为它不仅用于 netclient, 还广泛用于 email、xml、mimetypes 和 pydoc 等。此外,pathlib也已进入核心包。iptables:将iptables-apply和ip6tables-apply拆分到独立软件包, 避免主iptables包依赖 bash。
软件包 QA 检查变更
以下软件包 QA 检查过去产生警告,但它们可能表明存在真实的底层问题, 因此现在按错误处理:
compile-host-path
此外,新增了以下检查,默认触发错误:
shebang-size:检查超过 128 个字符的 shebang(#!)行, 它们可能因操作系统不同而在运行时报错。
unhandled-features-check:检查是否设置了 features_check 支持的变量,却没有继承该类。
missing-update-alternatives: 检查配方是否为任一软件包设置 ALTERNATIVE,却未继承 update-alternatives 类。
S 或 B 的值若有末尾斜杠或重复斜杠,现在会触发警告, 提醒移除以使路径比较更可靠。出现警告时,请移除配方中相应内容。
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调优文件,因为它似乎很少使用,且已无法正常工作。