版本 2.3 (pyro)

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

配方专属系统根目录

OpenEmbedded 构建系统现在为每个配方使用独立的系统根目录,解决配置脚本自动检测 未声明依赖的长期问题。因此,过去编写的自定义配方可能缺少依赖声明, 尤其是通常在构建流程较早阶段碰巧已构建、因而在旧版共享系统根目录中已经存在的依赖。

请注意以下事项:

  • 声明构建时依赖:必须显式声明配方的所有构建时依赖, 否则它们不会填充到该配方的系统根目录中。

  • 指定安装前后脚本的 native 工具依赖:必须使用 PACKAGE_WRITE_DEPS 明确指定 pkg_preinst 和 pkg_postinst 脚本的特殊 native 工具依赖, 确保这些脚本在 do_rootfs 期间于构建主机上运行时有相应工具可用。

    例如,dbus 配方的 pkg_postinst 在 DISTRO_FEATURES 包含 "systemd" 时调用 systemctl。它也以同样条件将 systemd-systemctl-native 加入 PACKAGE_WRITE_DEPS。

  • 检查使用 SSTATEPOSTINSTFUNCS 的配方:需要逐一检查并确定调整方式。

    加入 SSTATEPOSTINSTFUNCS 的函数仍像旧版本一样调用。 但现在为每个配方单独填充系统根目录,如果这些函数执行重定位, 就需要改用安装后脚本,并由加入 SYSROOT_PREPROCESS_FUNCS 的函数安装该脚本。

    示例见 Yocto Project 源码仓库 中 meta/classes/ 下的 pixbufcache 类。

    备注

    SSTATEPOSTINSTFUNCS 变量本身也已弃用,改用 do_populate_sysroot[postfuncs]。 如果仍有函数需要在配方系统根目录组件创建后执行,建议按前述方式使用安装后脚本, 为后续版本移除 SSTATEPOSTINSTFUNCS 做好准备。

  • 使用某些外部脚本时指定系统根目录:共享系统根目录已不存在, oe-find-native-sysroot 和 oe-run-native 已调整, 需要明确使用哪个配方的 STAGING_DIR_NATIVE。

备注

配方专属系统根目录的工作原理见“staging”。

PATH 变量

构建任务运行环境的 PATH 现在经过清理,移除通常的本机二进制路径 (/bin、/sbin、/usr/bin 等),改为加入一个目录, 其中仅包含指向 HOSTTOOLS 和 HOSTTOOLS_NONFATAL 所列主机程序的符号链接。

因此,需要调用的主机本机程序,必须在配置层面列入这两个变量之一。

另一种方式是在配方的 DEPENDS 中加入提供该程序的 native(-native)配方。

备注

devshell 中不会以同样方式清理 PATH,否则很难在 shell 中使用主机工具 进行开发和调试。

脚本变更

脚本有以下变更:

  • oe-find-native-sysroot:用法改为:

    $ . oe-find-native-sysroot recipe
    

    必须提供 recipe 参数,指定配方。2.3 之前不需要该参数。

  • oe-run-native:用法改为:

    $ oe-run-native native_recipe tool
    

    必须提供 native 配方名称和要运行的工具。2.3 之前不需要 native 配方参数。

  • cleanup-workdir:已移除,因为发现它会删除不应删除的文件,破坏构建树。 与其尝试局部删除 TMPDIR 并冒出错风险,建议直接删除整个 TMPDIR,让后续构建从共享状态(sstate)恢复。

  • wipe-sysroot:配方专属系统根目录出现后不再需要,已移除。

函数变更

移除此前已弃用的 bb.data.getVar()、bb.data.setVar() 及相关函数, 改用 d.getVar()、d.setVar() 等。

请修正所有旧函数引用。

BitBake 变更

BitBake 有以下变更:

  • 替换图形依赖浏览器:depexp 由 taskexp (Task Explorer)取代, 以图形方式浏览 task-depends.dot。展示的数据比 depexp 更准确。 普通 *.dot 查看器通常难以应对该文件的规模,因此数据可视化是常见需求。

  • "-g" 输出变更:bitbake -g 不再生成 package-depends.dot 和 pn-depends.dot,改为生成 task-depends.dot 的折叠版本 recipe-depends.dot。

    原来的两个文件主要源自基于任务执行之前的时代,没有考虑配方之间的任务级依赖, 可能误导用户,因此作此调整。

  • 镜像变量分隔方式:MIRRORS、PREMIRRORS 和 SSTATE_MIRRORS 现在可完全用空格分隔值,无需 "\n"。 BitBake 会寻找成对的值,简化用法。现有镜像变量值不需要修改。

  • Subversion(SVN)获取器使用 "ssh" 而非 "rsh" 参数: 当 "protocol" 设为 "svn+ssh" 时,可用新的可选 "ssh" 参数指定 SVN 使用的 ssh 程序。获取器在 do_fetch 期间通过 SVN_SSH 环境变量 传递该参数。

    更多信息见 BitBake 用户手册的 Subversion 获取器。

  • 移除 BB_SETSCENE_VERIFY_FUNCTION 和 BB_SETSCENE_VERIFY_FUNCTION2: 配方专属系统根目录使它们所属的机制不再必要,因此移除这两个变量。

GPLv3 配方的旧 GPLv2 版本移至独立层

GPLv3 配方的旧 GPLv2 版本已移至独立的 meta-gplv2 层。

如果通过 INCOMPATIBLE_LICENSE 排除 GPLv3,或通过 PREFERRED_VERSION 用 GPLv2 版本替换 GPLv3 配方,必须将该层加入配置。

备注

可在 OpenEmbedded 层索引 https://layers.openembedded.org/layerindex/branch/master/layer/meta-gplv2 找到 meta-gplv2。

这些移出的 GPLv2 配方不会得到与其他核心配方相同程度的维护,没有安全修复, 上游也不再维护。事实上,上游社区对继续使用这些旧版本的用户持强烈反对态度。 将它们移至独立层,可以明确其维护需求差异,也能清楚标明数量。

备注

对于必须从目标系统排除 GPLv3 组件的用户,长期方案可能是使用 BSD 许可的替代组件。 后续 Yocto Project 版本将研究此方案。

软件包管理变更

软件包管理有以下变更:

  • Smart 由 DNF 取代。Smart 上游已无人维护,也未移植到 Python 3.x, 因此必须更换,而 DNF 是唯一可行的候选。

    功能上的变化是:目标设备从远程软件包源进行运行时包管理时, 改用具有不同命令行选项的工具。直接调用工具或其 API 的脚本需要修正。

    更多信息见 DNF 文档。

  • Rpm 5.x 由 Rpm 4.x 取代,主要有两个原因:

    • DNF 与 Rpm 5.x 的 API 不兼容,移植及持续维护工作并不简单。

    • Rpm 5.x 上游维护有限,Yocto Project 是仅剩的少数用户之一。

  • 移除 Berkeley DB 6.x,将 5.x 作为默认版本:

    • 6.x 因采用 AGPLv3 许可证而普遍不被开源社区接受。 大多数需要 DB 的主流开源项目仍针对 DB 5.x 开发和测试。

    • OE-core 中仅 Rpm 5.x 需要 DB 6.x,因此没有理由继续保留 6.x。

  • createrepo 由 createrepo_c 取代。

    createrepo_c 是生成远程仓库元数据工具的当前实现,以 C 编写, 相比 Python 编写的 createrepo 更快,而且仍在维护。

  • 架构无关 RPM 包使用 "noarch",而不是 "all"。

    DNF/RPM4 栈中很多地方已作此假设。仅文件名和架构标签改变, OE-core 的其他内容,尤其 allarch,没有变化。

  • 当前不支持通过 PACKAGE_FEED_SIGN 签署远程软件包源,后续版本将完整解决。 关于 2.3 中 RPM 软件包源签名的解决办法,见 问题 11209。

  • OPKG 默认使用 libsolv 后端求解依赖,显著优于原有的临时内部求解器。 这会略微增加磁盘空间(约 500 KB)和内存占用。

    备注

    更多信息见 提交说明。

已移除的配方

以下配方已移除:

  • linux-yocto 4.8:移除 4.8,现提供 4.1(LTSI)、4.4(LTS)、4.9(LTS/LTSI)和 4.10。

  • python-smartpm:功能由 dnf 取代。

  • createrepo:由 createrepo-c 配方取代。

  • rpmresolve:改用 RPM 4 后由 RPM 自身完成,不再需要。

  • gstreamer:移除已陈旧的 GStreamer Git 版本配方,仍保留 1.10.x 配方。

  • alsa-conf-base:并入 alsa-conf,因为 libasound 同时依赖两者, 实际无法只安装其中一个。

  • tremor:移至 meta-multimedia。当前硬件不再需要定点整数 Vorbis 解码, 因而 GStreamer 的 ivorbis 插件默认禁用,OpenEmbedded-Core (OE-Core) 也就不再需要此配方。

  • gummiboot:由 systemd-boot 取代。

Wic 变更

Wic 有以下变更:

备注

更多信息见 Yocto Project 开发任务手册的 “使用 Wic 创建分区镜像”。

  • 默认输出目录变更:现在默认输出到当前目录,而不是不常见的 /var/tmp/wic。

    -o 和 --outdir 保持不变,仍可用于指定其他输出目录。

  • 移除 fsimage 插件:该插件与 rawcopy 功能重复,因此移除。

QA 变更

QA 检查有以下变更:

  • unsafe-references-in-binaries:移除原本默认禁用的此项检查。 它用于检测 /bin 中链接 /usr/lib 库的二进制程序, 以处理 /usr 与 / 位于不同文件系统的情况。

    该检查存在错误,且 /usr 独立分区如今很少见,因此移除。

  • file-rdeps:现在默认报错而不是警告,必须修复缺失的运行时依赖。

    更多信息见 insane 和 “错误和警告”。

其他变更

其他变更如下:

  • 多个配方现在忽略 DISTRO_FEATURES 中的 largefile,无条件启用大文件支持。 此功能过去一直默认启用,禁用时的行为未得到广泛测试。

    备注

    后续版本将彻底移除禁用 largefile 的能力,使其在所有位置无条件启用。

  • 如果 DISTRO_VERSION 含 DATE (Poky 发布之间的默认行为), 登录提示所显示的 /etc/issue 和 /etc/issue.net 现在会显式排除日期, 避免启用 Multilib 时冲突。无论如何,如果 base-files 从共享状态恢复而非重新 构建,日期本来也不准确。

    若要在 /etc/issue* 或镜像其他位置记录构建日期,更好的方式是定义后处理函数, 并通过 ROOTFS_POSTPROCESS_COMMAND 调用,确保日期始终与生成的镜像一致。

  • Dropbear 的 init 脚本默认禁用 DSA 主机密钥,与仅支持 RSA 的 systemd 服务文件 及弃用 DSA 的近期 OpenSSH 保持一致。

  • buildhistory 现在正确地用制表符分隔 installed-package-sizes.txt 的所有列,便于导入其他工具。

  • USE_LDCONFIG 由 DISTRO_FEATURES 的 "ldconfig" 功能取代。 过去设置:

    USE_LDCONFIG = "0"
    

    的发行版现在应改用:

    DISTRO_FEATURES_BACKFILL_CONSIDERED_append = " ldconfig"
    
  • COPYLEFT_LICENSE_INCLUDE 默认值现在除 GPL 和 LGPL 外,还包含所有 AGPL 版本。

    备注

    默认列表并不保证完整或足够安全。不确定时,应根据分发内容寻求法律意见。

  • 内核模块包现在以内核版本为后缀,使多个内核版本的模块包可在目标系统共存。 若要恢复不带版本后缀的命名,使用:

    KERNEL_MODULE_PACKAGE_SUFFIX = ""
    
  • 默认移除 libtool 的 *.la 文件。这些文件在 Linux 上实际不需要, 重定位它们只会增加不必要的负担。

    若需保留(例如自定义发行版),应修改 INHERIT_DISTRO, 使其不包含“remove-libtool”。

  • 为 GCC 5+ 构建的可扩展 SDK 现在拒绝安装到主机 GCC 为 4.8 或 4.9 的发行版, 因为已知 uninative 共享状态包的构建方式会导致安装失败。 详情见 uninative。

  • 所有 native 和 nativesdk 配方现在使用 独立的 DISTRO_FEATURES,不再与目标配方共享,避免不必要的重建。

    native 的值为 DISTRO_FEATURES_NATIVE, 加上 DISTRO_FEATURES 与 DISTRO_FEATURES_FILTER_NATIVE 的交集。

    nativesdk 的对应变量为 DISTRO_FEATURES_NATIVESDK 和 DISTRO_FEATURES_FILTER_NATIVESDK。

  • 移除此前已弃用且很少使用的 FILESDIR。设置该变量的配方应改为设置 FILESPATH。

  • 配方专属系统根目录使 MULTIMACH_HOST_SYS 不再必要,因此移除。