版本 2.6 (thud)
本节介绍如何从上一版本迁移到 Yocto Project 2.6 版本(代号“thud”)。
默认使用 GCC 8.2
现在默认使用 GNU Compiler Collection 8.2 编译。 GCC 8.x 的变更详情见 https://gcc.gnu.org/gcc-8/changes.html。
如果仍需使用 7.x 编译,也提供 GCC 7.3。 可在配置中将 GCCVERSION 设为 "7.%" 来选择此版本。
已移除的配方
以下配方已移除:
beecrypt:迁移到 RPM 4 后不再需要。
bigreqsproto:由
xorgproto取代。calibrateproto:移除,改用
xinput。compositeproto:由
xorgproto取代。damageproto:由
xorgproto取代。dmxproto:由
xorgproto取代。dri2proto:由
xorgproto取代。dri3proto:由
xorgproto取代。eee-acpi-scripts:已过时。
fixesproto:由
xorgproto取代。fontsproto:由
xorgproto取代。fstests:已过时。
gccmakedep:不再使用。
glproto:由
xorgproto取代。gnome-desktop3:不再需要,移至
meta-oe。icon-naming-utils:2016 年移除 Sato 主题后不再使用。
inputproto:由
xorgproto取代。kbproto:由
xorgproto取代。libusb-compat:已过时。
libuser:已过时。
libnfsidmap:
nfs-utils2.2.1 起不再是外部依赖,现已集成。libxcalibrate:使用
xinput后不再需要。mktemp:已过时。
busybox和coreutils都提供mktemp命令。ossp-uuid:无人维护,基本由
util-linux中的uuid.h取代。pax-utils:不再需要。过去使用它的 QA 测试现在在构建时执行。
pcmciautils:已过时。
pixz:不再需要,
xz现在支持多线程压缩。presentproto:由
xorgproto取代。randrproto:由
xorgproto取代。recordproto:由
xorgproto取代。renderproto:由
xorgproto取代。resourceproto:由
xorgproto取代。scrnsaverproto:由
xorgproto取代。trace-cmd:已过时,功能由
perf取代。videoproto:由
xorgproto取代。wireless-tools:已过时,由
iw取代。xcmiscproto:由
xorgproto取代。xextproto:由
xorgproto取代。xf86dgaproto:由
xorgproto取代。xf86driproto:由
xorgproto取代。xf86miscproto:由
xorgproto取代。xf86-video-omapfb:已过时,改用内核模式设置驱动。
xf86-video-omap:已过时,改用内核模式设置驱动。
xf86vidmodeproto:由
xorgproto取代。xineramaproto:由
xorgproto取代。xproto:由
xorgproto取代。yasm:不再需要,过去的用途现在均可由
nasm满足。
打包变更
打包方式有以下变更:
cmake:
cmake.m4和toolchain文件移至主包。iptables:
iptables模块拆分为独立软件包。alsa-lib:
libasound现在位于主alsa-lib包,而不是libasound包。glibc:
libnss-db拥有独立软件包,并包含更新数据库的/var/db/makedbs.sh脚本。python 和 python3:配方移除了主软件包。必须安装所需的具体包, 或安装
python-modules/python3-modules获取全部内容。systemtap:将
systemtap-exporter移至独立包。
XOrg 协议依赖
*proto 上游仓库合并为一个 "xorgproto" 仓库,相应配方也合并为一个
xorgproto 配方。依赖旧 *proto 配方的配方,需要改为依赖 xorgproto。
因此次仓库变更而移除的配方名称,见 已移除的配方。
distutils 和 distutils3 禁止在 do_configure 期间获取依赖
过去,继承 distutils 和 distutils3 的 Python 配方,如果系统根目录未提供
setup.py 中声明的依赖(即 DEPENDS 缺少提供该依赖的配方),
可能在 do_configure 期间获取代码以满足依赖。
备注
这一变更不只影响 distutils 和 distutils3,而是所有继承 distutils*
类的配方。例如,setuptools 和 setuptools3
因继承这些类而同样受影响。
这种从系统根目录之外获取依赖的方式会损害构建可复现性,因此现在显式禁用。 使用这些类的 Python 配方若缺少依赖,会在 do_configure 期间报错。
正确报告 linux-yocto 配置审计问题
此前由于错误,内核配置审计在构建期间未输出任何警告。现已修复。
如果使用 linux-yocto 风格内核配方并定制了内核配置,现在可能看到这些警告。
镜像/内核产物命名变更
变更如下:
IMAGE_NAME 等名称变量使用新的 IMAGE_VERSION_SUFFIX 代替 DATETIME,使修改更容易、更直接。
bitbake.conf中的定义如下:IMAGE_VERSION_SUFFIX = "-${DATETIME}"
为保持一致,多个变量重命名如下:
Old Variable Name New Variable Name ======================================================== KERNEL_IMAGE_BASE_NAME KERNEL_IMAGE_NAME KERNEL_IMAGE_SYMLINK_NAME KERNEL_IMAGE_LINK_NAME MODULE_TARBALL_BASE_NAME MODULE_TARBALL_NAME MODULE_TARBALL_SYMLINK_NAME MODULE_TARBALL_LINK_NAME INITRAMFS_BASE_NAME INITRAMFS_NAME
移除了
MODULE_IMAGE_BASE_NAME。模块压缩包名称现在直接由 MODULE_TARBALL_NAME 控制。新增 KERNEL_DTB_NAME 和 KERNEL_DTB_LINK_NAME, 用于控制内核设备树二进制(DTB)产物名称,不再修改
KERNEL_IMAGE_*变量实现。新增 KERNEL_FIT_NAME 和 KERNEL_FIT_LINK_NAME, 与其他部署产物类似,用于指定 FIT 内核镜像名称。
MODULE_TARBALL_NAME 和 MODULE_TARBALL_LINK_NAME 的值 不再包含 "module-" 前缀或 ".tgz" 后缀。这些部分现在硬编码, 使变量值与其他产物命名变量一致。
新增 INITRAMFS_LINK_NAME,以便像其他产物类型一样控制符号链接名称。
INITRAMFS_NAME 现在使用 "${PKGE}-${PKGV}-${PKGR}-${MACHINE}${IMAGE_VERSION_SUFFIX}", 而不是 "${PV}-${PR}-${MACHINE}-${DATETIME}",以保持一致。
弃用 SERIAL_CONSOLE
SERIAL_CONSOLE 的功能早已被 SERIAL_CONSOLES 取代。
Yocto Project 2.6 正式弃用 SERIAL_CONSOLE。
2.6 中仍可继续使用旧变量,但为兼容未来版本,建议将所有 SERIAL_CONSOLE
替换为 SERIAL_CONSOLES。
备注
用法上的唯一区别是,SERIAL_CONSOLES 的条目内部使用分号分隔,
而 SERIAL_CONSOLE 使用空格。
配置脚本将未知选项报告为错误
配置脚本报告未知选项时,现在触发 QA 错误而不是警告。 过去即使指定未知选项仍能通过的配方,现在必须修复。
覆盖变更
变更如下:
移除
virtclass-native和virtclass-nativesdk覆盖: 它们自 2012 年起弃用,分别改用class-native和class-nativesdk, 现在正式移除。备注
multilib 的
virtclass-multilib-覆盖仍然有效。forcevariable的优先级现在高于libc覆盖:文档说明forcevariable应为最高优先级,但 OVERRIDES 设置方式中一个长期问题 导致libc-glibc、libc-musl等libc覆盖错误地更高。现已修复。这通常不会造成问题,但某些特殊配置如果依赖旧行为,可能出现变化。 请检查自定义层和配置文件中的
forcevariable和libc-*用法是否合理。移除
build-${BUILD_OS}覆盖(通常为build-linux): 既不支持也不建议在近期 Linux 以外的主机操作系统上构建。 移除此覆盖可避免造成其他主机操作系统可能受支持的误解。"_remove" 运算符现在保留空白。因此,移除列表条目时, 移除操作产生的前后空白会保留。
详细示例见 BitBake 用户手册的 “Removal (Override Style Syntax)”。
systemd 配置拆分到 systemd-conf
systemd 配方的配置已移至 systemd-conf 配方。
独立配方可避免应用机器特定配置(例如 qemu*)时使 systemd 配方本身也变成
机器特定配方。
新配方目前打包以下文件:
${sysconfdir}/machine-id
${sysconfdir}/systemd/coredump.conf
${sysconfdir}/systemd/journald.conf
${sysconfdir}/systemd/logind.conf
${sysconfdir}/systemd/system.conf
${sysconfdir}/systemd/user.conf
如果此前通过 systemd 的 bbappend 修改这些文件,
现在应改为针对 systemd-conf 配方追加。
自动化测试变更
自动化测试有以下变更:
移除
TEST_IMAGE:过去将其设为 "1" 可自动测试成功构建的镜像。 现在此变量已由 TESTIMAGE_AUTO 取代。继承 testimage 和 testsdk: 现在建议使用 IMAGE_CLASSES 而不是 INHERIT 继承这些自动化测试类。
OpenSSL 变更
OpenSSL 从 1.0 升级到 1.1。 默认情况下,依赖链中同时包含两个版本的配方可能因此出问题, 因为构建时不能同时安装两个版本。
备注
运行时可以同时存在两个版本的库。
BitBake 变更
服务器日志 bitbake-cookerdaemon.log 现在始终放在 Build Directory,
而不是当前目录。
安全变更
Poky 现在默认使用安全编译标志。由于更严格地检查代码中的各种潜在安全问题, 可能出现新的构建失败。
安装后处理变更
必须显式标记延后到目标执行的安装后操作。若希望安装后脚本在目标首次启动时执行,
而不是在根文件系统创建时执行,请使用 pkg_postinst_ontarget(),
或在 pkg_postinst() 中调用 postinst_intercept delay_to_first_boot。
pkg_postinst() 的任何失败(包括 exit 1)都会使 do_rootfs 报错。
更多信息见 Yocto Project 开发任务手册的 “安装后脚本”。
Python 3 性能剖析引导优化
python3 现在启用性能剖析引导优化,以少量额外构建时间换取目标运行时性能提升。
仅当当前 MACHINE 支持 QEMU 用户模式仿真时才启用,
即 MACHINE_FEATURES 中包含 "qemu-usermode"(默认如此)。
若希望无论 MACHINE_FEATURES 如何都禁用 Python 的此项优化,
请确保 python3 配方的 PACKAGECONFIG 不包含 "pgo"。
例如在配置中设置:
PACKAGECONFIG_remove_pn-python3 = "pgo"
也可在 python3 的追加文件中设置 PACKAGECONFIG。
其他变更
其他变更如下:
armv7a 及更高版本默认使用 Thumb-2 指令集。 如果自定义配方构建的软件要求 ARM 指令集,请设置:
ARM_INSTRUCTION_SET = "arm"
run-postinsts对dpkg/opkg不再使用/etc/*-postinsts, 改用内置安装后脚本支持。RPM 行为不变。不再使用
NOISO和NOHDD。现在通过 IMAGE_FSTYPES 直接控制*.iso和*.hddimg镜像类型的构建。移除
scripts/contrib/mkefidisk.sh,改用 Wic。qemumips和qemumips64的 RRECOMMENDS 移除了kernel-modules。 此变更也影响x86-base.inc。备注
genericx86和genericx86-64的 RRECOMMENDS 仍保留kernel-modules。移除
LGPLv2_WHITELIST_GPL-3.0。若配置中设置了它, 应改为设置或追加到WHITELIST_GPL-3.0。${ASNEEDED}现在直接包含在 TARGET_LDFLAGS 中。meta/conf/distro/include/as-needed.inc的剩余定义已移至相应配方。OpenSSH 配方移除 DSA 主机密钥支持。如果仍使用 DSA 密钥, 必须按 OpenSSH 上游建议改用更安全的算法。
dhcp配方的dhcpd6.service现在使用dhcpd6.conf处理 IPv6 DHCP, 不再复用现已专供 IPv4 的dhcpd.conf。