版本 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。
已移除的类
以下类已移除:
小幅打包变更
打包有以下小幅变化:
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构建文档。