版本 2.2 (morty)

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

最低内核版本

升级到 glibc 2.24 后,目标系统和 SDK 的最低内核版本为 3.2.0。 其中 AArch64 目标要求 3.14,Nios II 目标要求 3.19。

备注

对于 x86 和 x86_64,可按需将 OLDEST_KERNEL 降至最低 2.6.32。

简化系统根目录中的目录暂存

系统根目录的目录暂存方式已简化,并引入 SYSROOT_DIRS、 SYSROOT_DIRS_NATIVE 和 SYSROOT_DIRS_BLACKLIST (4.0 中由 SYSROOT_DIRS_IGNORE 取代)。更多信息见 OE-Core 邮件列表中的 v2 补丁系列。

启用 tmp/deploy 中旧镜像及其他文件的删除

由于采用了新的暂存方式,现在默认移除 tmp/deploy/ 中的旧镜像和其他文件。 因此,RM_OLD_IMAGE 已成为多余变量。

Python 变更

Python 有以下变更:

BitBake 现在要求 Python 3.4+

BitBake 要求 Python 3.4 或更高版本。

构建主机需要 UTF-8 区域设置

由于使用 Python 3,构建主机必须有 UTF-8 区域设置。 C.UTF-8 并非标准,因此默认使用 en_US.UTF-8。

元数据必须使用 Python 3 语法

元数据现在必须使用 Python 3 语法。可以参考众多 Python 3 移植指南, 或参考 BitBake 的转换提交,并以 OpenEmbedded-Core (OE-Core) 的修改为指导。 需特别注意:

  • subprocess 命令行管道需要按区域设置解码

  • 八进制值语法变化

  • iter*() 函数名称变化

  • 迭代器现在返回视图,而非列表

  • Python 模块重命名

目标 Python 配方切换到 Python 3

多数目标 Python 配方已切换到 Python 3。但使用 RPM 包管理器并通过 SMART 提供在线包管理的系统仍需要 Python 2。

备注

仍可像旧版本一样,为目标构建 Python 2 及使用它的配方。

buildtools-tarball 包含 Python 3

buildtools 压缩包现在包含 Python 3。

musl 取代 uClibc

移除 uClibc,改用 musl。musl 已成熟,维护更完善,且兼容的应用范围比 uClibc 更广。

${B} 不再是任务默认工作目录

${B} 不再是任务的默认工作目录。 自定义任务必须设置 [dirs] 标志,或手动切换到合适目录,例如在 shell 任务中使用 cd。

备注

推荐使用 [dirs] 标志。

runqemu 移植到 Python

runqemu 已移植到 Python,部分情况下行为有所变化,但仍支持原有用法。

新的 runqemu 是 Python 脚本,不再硬编码机器信息。 可使用 qemuboot 配置文件定义 BSP 自己的参数,使其能由 runqemu 启动。 配置文件采用以下名称:

image-name-machine.qemuboot.conf

配置文件可细粒度调整传给 QEMU 的选项,无需脚本硬编码不同机器的信息。 在 OpenEmbedded-Core (OE-Core) 的 qemu* 之外使用其他机器时, 这种方式尤其方便。构建根文件系统时,qemuboot 类生成 qemuboot.conf。 可在 BSP 配置中设置 QEMU 启动参数,该类会将其保存到 qemuboot.conf。

若不使用配置文件,命令形式如下:

$ runqemu machine rootfs kernel [options]

支持以下机器:

  • qemuarm

  • qemuarm64

  • qemux86

  • qemux86-64

  • qemuppc

  • qemumips

  • qemumips64

  • qemumipsel

  • qemumips64el

以下示例使用 qemux86-64,提供根文件系统和内核镜像,并指定 nographic:

$ runqemu qemux86-64 tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.ext4 tmp/deploy/images/qemux86-64/bzImage nographic

以下变量可在 bsp.conf 等配置文件中设置,使 BSP 能由 runqemu 启动:

QB_SYSTEM_NAME: QEMU name (e.g. "qemu-system-i386")
QB_OPT_APPEND: Options to append to QEMU (e.g. "-show-cursor")
QB_DEFAULT_KERNEL: Default kernel to boot (e.g. "bzImage")
QB_DEFAULT_FSTYPE: Default FSTYPE to boot (e.g. "ext4")
QB_MEM: Memory (e.g. "-m 512")
QB_MACHINE: QEMU machine (e.g. "-machine virt")
QB_CPU: QEMU cpu (e.g. "-cpu qemu32")
QB_CPU_KVM: Similar to QB_CPU except used for kvm support (e.g. "-cpu kvm64")
QB_KERNEL_CMDLINE_APPEND: Options to append to the kernel's -append
                          option (e.g. "console=ttyS0 console=tty")
QB_DTB: QEMU dtb name
QB_AUDIO_DRV: QEMU audio driver (e.g. "alsa", set it when support audio)
QB_AUDIO_OPT: QEMU audio option (e.g. "-soundhw ac97,es1370"), which is used
              when QB_AUDIO_DRV is set.
QB_KERNEL_ROOT: Kernel's root (e.g. /dev/vda)
QB_TAP_OPT: Network option for 'tap' mode (e.g.
            "-netdev tap,id=net0,ifname=@TAP@,script=no,downscript=no -device virtio-net-device,netdev=net0").
             runqemu will replace "@TAP@" with the one that is used, such as tap0, tap1 ...
QB_SLIRP_OPT: Network option for SLIRP mode (e.g. "-netdev user,id=net0 -device virtio-net-device,netdev=net0")
QB_ROOTFS_OPT: Used as rootfs (e.g.
               "-drive id=disk0,file=@ROOTFS@,if=none,format=raw -device virtio-blk-device,drive=disk0").
               runqemu will replace "@ROOTFS@" with the one which is used, such as
               core-image-minimal-qemuarm64.ext4.
QB_SERIAL_OPT: Serial port (e.g. "-serial mon:stdio")
QB_TCPSERIAL_OPT: tcp serial port option (e.g.
                  " -device virtio-serial-device -chardev socket,id=virtcon,port=@PORT@,host=127.0.0.1 -device      virtconsole,chardev=virtcon"
                  runqemu will replace "@PORT@" with the port number which is used.

使用前按下述方式设置 IMAGE_CLASSES,然后运行 runqemu:

备注

"QB" 表示 "QEMU Boot"。

备注

命令行语法见 runqemu help。

IMAGE_CLASSES += "qemuboot"

默认链接器哈希风格变更

gcc-cross 的默认链接器哈希风格现在为 "sysv",用于发现构建软件时未使用 OpenEmbedded LDFLAGS 的配方。这些配方可能出现 "No GNU_HASH in the elf binary" QA 问题,需要修复为使用预期的 LDFLAGS。 视软件构建方式而定,可能需要给 Makefile 等构建系统打补丁, 但有时只需在配方中添加:

TARGET_CC_ARCH += "${LDFLAGS}"

KERNEL_IMAGE_BASE_NAME 不再使用 KERNEL_IMAGETYPE

KERNEL_IMAGE_BASE_NAME 不再用 KERNEL_IMAGETYPE 创建镜像基础名称。 由于现在可构建多种内核镜像类型,基础名称中的这一部分已移除,仅剩:

KERNEL_IMAGE_BASE_NAME ?= "${PKGE}-${PKGV}-${PKGR}-${MACHINE}-${DATETIME}"

直接使用 KERNEL_IMAGE_BASE_NAME 的配方或类可能需要更新引用,以确保继续工作。

多数场景用 IMGDEPLOYDIR 取代 DEPLOY_DIR_IMAGE

引入 IMGDEPLOYDIR 是为了让镜像创建结果可进入共享状态缓存。 定义自定义 IMAGE_CMD 或对生成镜像进行后处理的镜像配方, 需要改用 IMGDEPLOYDIR 而非 DEPLOY_DIR_IMAGE。 否则,IMAGE_MANIFEST 创建和最新镜像文件符号链接都会失败。

BitBake 变更

BitBake 有以下变更:

  • 移除 "goggle" 界面和独立 image-writer 工具,因为它们依赖 GTK+ 2.0 且无人维护。

  • Perforce 获取器现在通过 SRCREV 指定源码修订版本,无论是 ${AUTOREV}、changelist 编号、p4date 还是标签, 不再推荐独立的 SRC_URI 参数。这与其他源码控制获取器更一致。 从 Perforce 获取源码的配方,需要从 SRC_URI 改为用 SRCREV 指定修订版本。

  • 为支持新的多配置功能,BitBake 访问配方缓存的部分内部结构已改变, 会影响使用 tinfoil 模块的外部工具。可参考 OpenEmbedded-Core 脚本的修改: 1 和 2。

  • 任务管理代码重写以避免 ID 间接寻址,提高性能。大多数用户不会受影响, 但 BB_SETSCENE_VERIFY_FUNCTION 指向的 setscene 验证函数签名需要改变。 因此新增 BB_SETSCENE_VERIFY_FUNCTION2,使适当编写的元数据 (包括 OpenEmbedded-Core 和 Poky)可兼容多个 BitBake 版本。 自定义任务调度器也可能需要更新以适应新结构。

移除 Swabber

Swabber 原用于检测构建过程中的主机污染,但已有一段时间无人维护或使用, 效果也一直有限,因此移除。OpenEmbedded 构建系统后来加入了增强 QA 检查等多种机制, 对这类工具的需求已减少。

已移除的配方

以下配方已移除:

  • augeas:不再需要,移至 meta-oe。

  • directfb:无人维护,移至 meta-oe。

  • gcc:移除 4.9,仍保留 5.4 和 6.2。

  • gnome-doc-utils:不再需要。

  • gtk-doc-stub:由 gtk-doc 取代。

  • gtk-engines:不再需要,移至 meta-gnome。

  • gtk-sato-engine:已过时。

  • libglade:不再需要,移至 meta-oe。

  • libmad:无人维护,功能由 libmpg123 取代,移至 meta-oe。

  • libowl:已过时。

  • libxsettings-client:不再需要。

  • oh-puzzles:功能由 puzzles 取代。

  • oprofileui:已过时,OProfile 基本由 perf 取代。

  • packagegroup-core-directfb.bb:移除。

  • core-image-directfb.bb:移除。

  • pointercal:不再需要,移至 meta-oe。

  • python-imaging:不再需要,移至 meta-python。

  • python-pyrex:不再需要,移至 meta-python。

  • sato-icon-theme:已过时。

  • swabber-native:Swabber 已移除,见 相关说明。

  • tslib:不再需要,移至 meta-oe。

  • uclibc:移除,改用 musl。

  • xtscal:不再需要,移至 meta-oe。

已移除的类

以下类已移除:

  • distutils-native-base:不再需要。

  • distutils3-native-base:不再需要。

  • sdl:仅设置 DEPENDS 和 SECTION,直接在配方中设置更合适。

  • sip:基本无人使用。

  • swabber:见 相关说明。

小幅打包变更

打包有以下小幅变化:

  • grub:将 grub-editenv 拆分到独立包。

  • systemd:将容器和虚拟机相关单元拆分到新包 systemd-container。

  • util-linux:将 prlimit 移至独立的 util-linux-prlimit。

其他变更

其他变更如下:

  • package_regex.inc:其中的定义已移至各自配方,因此移除。

  • devtool add 和 recipetool create 从 Git 仓库获取源码时默认使用固定 SRCREV。两者都可用 -a 或 --autorev 命令行选项改为 ${AUTOREV}。

  • distcc:默认禁用 GTK+ 界面。

  • packagegroup-core-tools-testapps:移除 Piglit。

  • image:将 COMPRESS(ION) 重命名为 CONVERSION。 COMPRESSIONTYPES、COMPRESS_DEPENDS 和 COMPRESS_CMD 已弃用, 改用 CONVERSIONTYPES、CONVERSION_DEPENDS 和 CONVERSION_CMD。 2.2 中旧名称仍可用,但无需向后兼容的元数据应改用新名,因为未来将移除旧名。

  • gtk-doc:现在提供完整版本。但部分旧软件无法使用当前 gtk-doc 构建文档, 其配方需要显式禁用通过 gtk-doc 构建文档。