版本 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",修复部分配方的可复现性问题。