版本 2.5 (sumo)
本节介绍如何从上一版本迁移到 Yocto Project 2.5 版本(代号“sumo”)。
打包变更
打包方式有以下变更:
bind-libs:bind 配方打包的库放入独立的bind-libs包。libfm-gtk:libfm的 GTK+ 绑定拆分到独立的libfm-gtk包。flex-libfl:flex 配方将 libfl 拆分为flex-libfl,避免仅需要库时引入过多依赖。grub-efi:配置拆分到独立的grub-bootconf配方。grub-efi通过 virtual/grub-bootconf 提供者建立依赖,因此也可由自定义配方提供。 还可以通过 BitBake 追加文件将配置重新并入grub-efi配方。armv7a 旧软件包源支持:移除软件包源从
armv7a过渡到armv7a-vfp-neon的兼容支持,过去由PKGARCHCOMPAT_ARMV7A启用。 该过渡发生在 2011 年,仍活跃的软件包源如今应已更新为新名称。
已移除的配方
以下配方已移除:
gcc:6.4 配方由 7.x 取代。gst-player:随上游重命名为gst-examples。hostap-utils:软件已过时。latencytop:上游不再维护,最后发布于 2009 年。libpfm4:唯一需要它的是已移除的oprofile。linux-yocto:移除 4.4、4.9 和 4.10,保留 4.12、4.14 和 4.15。man:由现代的man-db取代。mkelfimage:上游 coreboot 已移除此工具,移除 ELF 镜像类型后也不再需要它。nativesdk-postinst-intercept:无人维护。neon:上游不再维护,OpenEmbedded-Core 中也已无使用者。oprofile:功能由perf取代,且难以持续保持与musl的兼容。pax:软件已过时。stat:上游不再维护,coreutils提供现代的 stat 二进制程序。zisofs-tools-native:压缩 ISO 镜像功能移除后不再需要。
脚本与工具变更
yocto-bsp、yocto-kernel和yocto-layer:移除这些原随 poky 提供、 但不属于 OpenEmbedded-Core 的脚本。它们无人维护且已过时,许多情况下功能也有限。bitbake-layers create-layer可直接替代yocto-layer。 创建 BSP 或内核配方的方法见“BSP 内核配方示例”。devtool finish:如果配方源码仓库中有未提交修改,或正在进行 rebase/am, 现在会报错退出。这种情况下,可能存在未提交的变更,无法包含在配方补丁更新中。 如果未提交内容无关紧要且希望继续,可使用 -f/--force 选项。scripts/oe-setup-rpmrepo:功能由bitbake package-index取代。scripts/test-dependencies.sh:上一版本引入配方专属系统根目录后, 此脚本基本已失去用途。
BitBake 变更
--runall选项有变化。用户可能需要两种不同的行为:行为 A:对给定目标或目标集合遍历任务图,仅在任务 X 存在且将被构建时执行它。
行为 B:对给定目标或目标集合遍历任务图,只要图中任一配方有任务 X 就执行它, 即使该任务不在原始任务图中。
--runall现在执行“行为 B”,此前执行“行为 A”。 新增--runonly以保留执行“行为 A”的能力。移除多个专门用于“为依赖树所有配方执行此任务”的任务,如
fetchall、checkuriall,以及distrodata和 archiver 提供的*all任务。BitBake 可通过选项对任意任务执行此操作。例如:bitbake <target> -c fetchall
现在应替换为:
bitbake <target> --runall=fetch
Python 与 Python 3 变更
Python 和 Python 3 的自动打包有以下变化。
过去用于生成 Python 和 Python 3 软件包、由脚本维护的 python-*-manifest.inc,
已由更易读和维护的 JSON 文件取代。新增任务供 Python 配方维护者在升级版本时更新
JSON。现在可以直接编辑文件,而无需先修改脚本再运行脚本更新。
需要特别注意,Python 配方不再为它生成的软件包提供构建时提供者。
假设 python-foo 是 Python 配方提供的包之一,现在不能执行
bitbake python-foo,也不能在 DEPENDS 中指定 python-foo。
但以下任一种用法仍可正常工作:
IMAGE_INSTALL_append = " python-foo"
或者:
RDEPENDS_${PN} = "python-foo"
旧的构建时提供者行为是 Python 清单文件生成方式造成的特殊情况。 详情见 此提交。
其他变更
kernel 类支持为多个内核构建软件包。 如果内核配方或
.bbappend涉及打包,应将包名中的内核引用改为${KERNEL_PACKAGE_NAME}。例如,用RDEPENDS_kernel-base = ""禁用 内核镜像自动安装时,应改为RDEPENDS_${KERNEL_PACKAGE_NAME}-base = ""以避免警告。buildhistory 默认提交仓库变更,无需再设置
BUILDHISTORY_COMMIT = "1"。若要禁用提交,请设置BUILDHISTORY_COMMIT = "0"。beaglebone参考机器重命名为beaglebone-yocto。该 BSP 仅使用 OpenEmbedded-Core 和meta-yocto-bsp中的主线组件作为参考实现; Texas Instruments 则在meta-ti维护功能完整的 BSP。 重命名避免了这两个 BSP 之间的名称冲突。update-alternatives 不再用于 SysV
init脚本, 因为这种用法存在问题。sysklogd也不再使用update-alternatives, 因为它与其他实现不兼容。cmake 默认使用
ninja而不是make,以改善构建性能。 如果配方不能用ninja构建,可设置OECMAKE_GENERATOR = "Unix Makefiles"切回make。移除此前已弃用的
base_*函数,改用meta/lib/oe和bitbake/lib/bb中的替代函数。它们通常用于配方和类,所有旧引用都必须更新。 下表列出已移除函数及其替代项:已移除
替代项
base_path_join()
oe.path.join()
base_path_relative()
oe.path.relative()
base_path_out()
oe.path.format_display()
base_read_file()
oe.utils.read_file()
base_ifelse()
oe.utils.ifelse()
base_conditional()
oe.utils.conditional()
base_less_or_equal()
oe.utils.less_or_equal()
base_version_less_or_equal()
oe.utils.version_less_or_equal()
base_contains()
bb.utils.contains()
base_both_contain()
oe.utils.both_contain()
base_prune_suffix()
oe.utils.prune_suffix()
oe_filter()
oe.utils.str_filter()
oe_filter_out()
oe.utils.str_filter_out() (或使用 _remove 运算符)
通过
exit 1将安装后脚本延后到首次启动的做法现已弃用,因为机制不直观, 且会掩盖真实错误。若要显式延后到目标首次启动而不是rootfs创建时, 请使用pkg_postinst_ontarget(),或在pkg_postinst()中调用postinst_intercept delay_to_first_boot。pkg_postinst()的任何失败 (包括exit 1)都会在 do_rootfs 期间触发警告。更多信息见 Yocto Project 开发任务手册的 “安装后脚本”。
移除
elf镜像类型,因为创建它所需的mkelfimage已不再由 coreboot 上游 提供,而且每次更新binutils都需要更新该工具。移除 .iso 镜像压缩支持(过去通过
COMPRESSISO = "1"启用)。 用户空间工具zisofs-tools无人维护,而squashfs提供更好的性能与压缩。 若要构建启用 squashfs+lz4 的 live 镜像,请设置LIVE_ROOTFS_TYPE = "squashfs-lz4", 并确保 IMAGE_FSTYPES 包含live。无条件依赖
libpam的配方,仅在 DISTRO_FEATURES 包含pam时可构建。 如果依赖确实可选,建议使其以 DISTRO_FEATURES 包含pam为条件。对 EFI 机器,引导加载程序(默认
grub-efi)安装在镜像的 /boot。 必要时可使用 Wic 将引导加载程序与根文件系统拆分到不同分区。上下文不完全匹配的补丁(应用时 patch 报告 "fuzz")现在会产生警告。 示例见 此提交。
层应设置
LAYERSERIES_COMPAT_layername,声明兼容的 OpenEmbedded-Core 版本。 使用版本代号,多个值用空格分隔,例如 "rocko sumo"。 未设置时会警告;设置了但不含当前版本(2.5 为 "sumo")时会报错。构建环境将
TZ环境变量设为 "UTC",修复部分配方的可复现性问题。