版本 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: 配方专属系统根目录使它们所属的机制不再必要,因此移除这两个变量。
绝对符号链接
暂存文件中不再允许绝对符号链接,否则会报错。
显式创建符号链接时可以使用 lnr 脚本,作为 ln -r 的替代。
如果配方构建的软件脚本创建了多个需要修正的绝对符号链接,
可在配方中继承 relative_symlinks,将它们转换为相对链接。
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 检查有以下变更:
其他变更
其他变更如下:
多个配方现在忽略 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不再必要,因此移除。