版本 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-utils 2.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 配方追加。

自动化测试变更

自动化测试有以下变更:

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。