6 类
类文件用于抽象公共功能,使多个配方(.bb)文件可以共享它们。
使用类时,只需让配方继承该类。多数情况下,继承就足以启用类的功能;
但有时还需要在配方中设置变量或覆盖默认行为。
也可以通过 INHERIT 全局继承类,使其作用于每个配方。
配方中常见的任何 Metadata 都可以放入类文件。
类文件使用 .bbclass 扩展名,通常位于 layer 的以下子目录之一:
classes-recipe/:供配方分别继承的类。
classes-global/:供全局继承的类。
classes/:使用上下文尚未明确的类。
类文件也可以位于 BUILDDIR (例如 build/)所指向的位置,
方式与 conf 目录中的 .conf 文件相同。
类文件和 .conf 文件一样,沿 BBPATH 搜索。
本章只介绍最实用和重要的类。
OpenEmbedded-Core (OE-Core) 的 meta/classes* 目录中还有其他类,
可直接查阅对应 .bbclass 文件了解详情。
6.1 allarch
allarch 供不产生架构专用输出的配方继承。 它禁用生成可执行二进制文件的配方通常需要的功能, 例如预先构建交叉编译器和 C 库,以及打包时拆分调试符号。
备注
与 Debian 等某些发行版的配方不同,OpenEmbedded 配方如果通过 RDEPENDS 和 TUNE_PKGARCH 使软件包依赖特定调优配置, 就绝不应使用 allarch 将其设为适用于所有架构, 即使它不生成架构专用输出也是如此。
这样配置会使 do_package_write_* 在调优配置不同的机器上具有不同签名。 此外,即使配方从未修改,每次为不同 MACHINE 构建镜像时, 也会产生不必要的重新构建。
默认所有配方继承 base 和 package, 启用生成可执行输出所需的功能。 如果配方只生成包含配置文件、媒体文件或 Python、Perl 等脚本的软件包, 应继承 allarch。
6.2 archiver
archiver 支持随二进制文件发布源码及其他材料。
有关源码归档的详情,请参阅《Yocto Project 开发任务手册》的 “在产品生命周期中维护开源许可证合规” 一节。用于控制归档创建的变量标志(varflags)见 ARCHIVER_MODE。
6.3 autotools*
autotools* 支持使用 GNU Autotools 构建的软件包。
autoconf、automake 和 libtool 提供标准化支持。
该类定义了适用于所有 Autotools 软件包的任务,例如 configure、compile。
通常只需定义几个标准变量,再使用 inherit autotools 即可。
这些类也适用于模拟 Autotools 行为的软件。
更多信息请参阅《Yocto Project 开发任务手册》的
“构建 Autotools 软件包”一节。
默认使用树外构建,即 autotools.bbclass 以 B != S 构建。
如果软件不支持树外构建,应让配方继承 autotools-brokensep。 它与 autotools* 行为相同,但使用 B == S。 当树外构建支持缺失或损坏时,这种方式有用。
备注
只要可能,建议修复并使用树外构建支持。
了解 autotools* 定义的任务及内部行为会有帮助:
do_configure:通过
autoreconf重新生成 configure 脚本, 再使用交叉编译的标准参数运行它。 可以通过 EXTRA_OECONF 或 PACKAGECONFIG_CONFARGS 向configure传递额外参数。do_compile:运行
make,通过参数指定编译器和链接器。 可通过 EXTRA_OEMAKE 传递额外参数。do_install:运行
make install, 将${D}作为DESTDIR传入。
6.4 barebox
barebox 管理 barebox 引导加载程序的构建。
如果 SRC_URI 包含名为 defconfig 的文件,
它会被复制为构建目录中的 .config,用作 barebox 配置。
也可以不提供文件,而将 BAREBOX_CONFIG 设为 barebox 源码树提供的 defconfig。
如果两者均未指定,该类会报错。
此类支持配置片段,并在内部包含 cml1, 为 barebox 提供 Kconfig 支持,从而启用 do_menuconfig 和 do_diffconfig 等任务。
生成的 barebox 二进制文件部署到 DEPLOY_DIR_IMAGE,
并安装到 BAREBOX_INSTALL_PATH (默认为 /boot),成为配方基本软件包的一部分。
这样既支持将其作为独立产物使用,也支持安装到根文件系统。
可通过 BAREBOX_BINARY 选择特定二进制文件进行部署和安装。
如果 EFI_PROVIDER 设为 barebox,该类使用
conf/image-uefi.conf
定义默认安装路径和命名约定。
向 BAREBOX_ENV_DIR 添加环境文件可以扩展编译进 barebox 的环境。
BAREBOX_FIRMWARE_DIR 可指定固件二进制文件搜索目录,
以加载 TF-A 或 OP-TEE 等额外固件。
6.5 base
base 很特殊,每个 .bb 文件都会隐式继承它。
它定义获取、解包、配置(默认为空)、编译(运行存在的 Makefile)、
安装(默认为空)和打包(默认为空)等标准基本任务。
这些任务经常被 autotools* 或 package
等其他类覆盖或扩展。
它还包含 oe_runmake 等常用函数。
oe_runmake 运行 make,同时传入 EXTRA_OEMAKE
以及直接传给该函数的参数。
6.6 bash-completion
为包含 bash-completion 数据的软件配方设置适当的打包方式和依赖。
6.7 bin_package
bin_package 是配方辅助类,禁用 do_configure 和 do_compile,并将 S 的内容复制到 D。 通过在 SRC_URI 中提供二进制软件包(例如 RPM)并继承该类, 可以方便地安装这些软件包。
对于 RPM 等不包含顶层子目录的软件包,应将 SRC_URI 的 subdir
选项设为 BP,使内容提取到 S 默认值所预期的目录。例如:
SRC_URI = "https://example.com/downloads/somepackage.rpm;subdir=${BP}"
此类也可用于压缩包,例如:
SRC_URI = "file://somepackage.tar.xz;subdir=${BP}"
它假定软件包在 S 中的内容布局与目标安装后的布局一致,
二进制软件包通常符合此要求。
例如,库的 RPM 包通常包含 usr/lib,
应解压为 ${S}/usr/lib/<library>.so.<version>,才能正确安装到 D。
备注
SRC_URI 中软件包的提取不由 bin_package 处理, 而是根据扩展名由适当的 获取器 处理。
6.8 binconfig
binconfig 帮助修正 shell 脚本中的路径。
pkg-config 普及之前,库通常附带名为 LIBNAME-config 的 shell 脚本,
提供构建软件所需的库和包含路径信息。此类辅助使用这类脚本的配方。
暂存阶段,构建系统将这些脚本安装到 sysroots/。
继承此类后,脚本中的全部路径会改为指向 sysroots/,
确保使用脚本的构建采用正确的交叉编译目录布局。
更多信息见 BINCONFIG_GLOB。
6.9 binconfig-disabled
binconfig 的替代版本,
通过让二进制配置脚本返回错误来禁用它们,改用 pkg-config 查询信息。
继承此类的配方应通过 BINCONFIG 指定待禁用脚本。
6.10 buildhistory
buildhistory 记录构建输出元数据的历史, 用于发现可能的回归并分析构建输出。 更多信息请参阅《Yocto Project 开发任务手册》的 使用 buildhistory 维护构建输出质量 一节。
6.11 buildstats
buildstats 记录构建期间每个任务的性能统计, 例如耗时、CPU 使用量和 I/O 使用量。
输出位于 BUILDSTATS_BASE,默认是 ${TMPDIR}/buildstats/。
可以使用 scripts/pybootchartgui/pybootchartgui.py 分析耗时,
它生成整个构建过程的级联图,有助于发现瓶颈。
要启用此类,可将“buildstats”添加到 USER_CLASSES。
6.12 buildstats-summary
全局继承时,在构建结束后输出共享状态复用统计。 此类需要启用 buildstats 才能工作。
6.13 cargo
cargo 允许使用 Cargo 编译 Rust 程序。Cargo 是 Rust 软件包管理器,可以获取依赖并构建程序。
使用此类构建 Rust 程序很简单,只需将 SRC_URI 指向可由 Cargo
构建的源码仓库,通常是通过 cargo new 创建、包含 Cargo.toml、
Cargo.lock 和 src 子目录的仓库。
如需构建并打包程序测试,请继承 ptest-cargo, 而不是 cargo。
示例见 zvariant_3.12.0.bb, 其中还展示如何处理 Git 源码依赖。 另一个只有 crate 依赖的示例是 uutils-coreutils, 由 cargo-bitbake 生成。
此类继承 cargo_common。
6.14 cargo_c
配方可以继承 cargo_c,生成可由 C/C++ 代码调用的 Rust 库。
只需将 inherit cargo 替换为 inherit cargo_c。
6.15 cargo_common
cargo_common 是内部类,不应直接使用。
例外是构建 Rust 编译器和运行时库的“rust”配方: 它由 Cargo 构建,但不能使用 cargo, 这也是引入此类的原因。
6.16 cargo-update-recipe-crates
cargo-update-recipe-crates 允许配方开发者读取源码树中的
Cargo.lock,更新 SRC_URI 中的 Cargo crate 列表。
为程序创建配方,例如使用 devtool, 让它继承 cargo 和 cargo-update-recipe-crates, 然后运行:
bitbake -c update_crates recipe
这会生成可在配方中包含的 recipe-crates.inc:
require ${BPN}-crates.inc
也可以通过 cargo-bitbake 实现。
6.17 ccache
ccache 为构建启用 C/C++ 编译器缓存,提供小幅性能提升。
有关编译器缓存的信息见 https://ccache.samba.org/。
如何在配置文件中启用、对特定配方禁用,以及跨构建共享 ccache 文件,
详见 ccache.bbclass。
在 configuration file 中提供以下设置后,
包括 native 在内的配方可通过 HOSTTOOLS
使用主机的 ccache 二进制程序:
ASSUME_PROVIDED += "ccache-native"
HOSTTOOLS += "ccache"
即使已启用此类,配方仍可将 CCACHE_DISABLE 设为“1”, 显式禁用 Ccache 支持。
使用 ccache 可能产生意外副作用,不建议使用。
6.18 chrpath
chrpath 封装“chrpath”工具,
在 nativesdk、cross
和 cross-canadian 配方构建期间修改二进制文件的 RPATH,
使其可重定位。
6.19 cmake
cmake 允许配方使用
CMake 构建软件。
通过 EXTRA_OECMAKE 可指定传给 cmake 的额外配置选项。
默认使用 Ninja 而非 GNU make,以提高构建性能。
如果配方无法通过 Ninja 构建,可以将 OECMAKE_GENERATOR
设为 Unix Makefiles,改用 GNU make。
如果需要安装应用提供的自定义 CMake 工具链文件,应在 do_install
期间将其安装到首选 CMake 模块目录 ${D}${datadir}/cmake/modules/。
6.20 cmake-qemu
cmake-qemu 可替代 cmake。
除后者功能外,它还向 cmake 传入 CMAKE_CROSSCOMPILING_EMULATOR,
允许通过 QEMU 用户模式模拟在主机上执行交叉编译的二进制程序。
更多信息见 CMake 文档相关章节。
QEMU 并不支持所有平台,此类仅适用于 机器功能
包含 qemu-usermode 的机器。
用户模式模拟存在一定风险,因此默认没有纳入主要的 cmake。
一种用法是在构建机器上通过 CTest 执行交叉编译的单元测试。
配置 CMAKE_CROSSCOMPILING_EMULATOR 后:
cmake --build --target test
即可透明地通过 QEMU 用户模式运行。
如果 CMake 项目在开发时考虑了这一场景,效果会很好。
这也适用于配置为使用 cmake-native 交叉编译的 IDE。
6.21 cml1
cml1 为 Linux 内核风格的构建配置系统提供基本支持。 “cml”表示“配置菜单语言”,源于 Linux 内核,也用于 U-Boot、BusyBox 等项目。 它也可以称为“kconfig”。
CML 配置文件 .config 默认应位于构建目录(B),
可通过 KCONFIG_CONFIG_ROOTDIR 覆盖。
6.22 compress_doc
启用手册页和 info 页的压缩,旨在全局继承。 默认压缩机制为 gz(gzip),可通过 DOC_COMPRESS 选择其他机制。
6.23 copyleft_compliance
copyleft_compliance 为许可证合规保留源码。 它是 archiver 的替代类, 虽然已弃用并推荐改用后者,但仍有部分用户使用。
6.24 copyleft_filter
供 archiver 和 copyleft_compliance 过滤许可证的内部类,不应直接使用。
6.25 core-image
core-image 为 core-image-* 镜像配方提供公共定义,
例如额外的 IMAGE_FEATURES 支持。
6.26 cpan*
cpan* 支持 Perl 模块。
Perl 模块配方通常很简单,只需指向源码归档,再继承适当的类。 根据模块作者所用的构建方式,分为两种:
使用旧
Makefile.PL构建系统的模块,配方需要cpan.bbclass。使用
Build.PL构建系统的模块,配方需要cpan_build.bbclass。
两种方式都继承 cpan-base,提供基本 Perl 支持。
6.27 create-spdx
create-spdx 支持根据镜像和 SDK 内容自动创建 SPDX SBOM 文档。
应从配置文件全局继承此类:
INHERIT += "create-spdx"
顶层 SPDX 输出以 JSON 格式生成,文件名为 IMAGE-MACHINE.spdx.json,
位于 Build Directory 的 tmp/deploy/images/MACHINE/。
该目录及 tmp/deploy/spdx 中还有其他相关文件。
具体行为和输出量可通过 SPDX_PRETTY、SPDX_INCLUDE_SOURCES
以及其他 SPDX_ 开头的变量控制。
详情见这些变量的说明,以及《Yocto Project 开发任务手册》的 “创建软件物料清单”一节。
6.28 cross
cross 为构建交叉编译工具的配方提供支持。
6.29 cross-canadian
cross-canadian 为构建 SDK 的 Canadian Cross 交叉编译工具的配方提供支持。更多信息见《Yocto Project 概览与概念手册》的 “交叉开发工具链生成”一节。
6.30 crosssdk
crosssdk 为构建 SDK 所用交叉编译工具的配方提供支持。 更多信息见《Yocto Project 概览与概念手册》的 “交叉开发工具链生成”一节。
6.31 cython
6.32 debian
debian 重命名输出软件包,使其遵循 Debian 命名政策,
例如 glibc 变为 libc6,glibc-devel 变为 libc6-dev。
重命名后的软件包名包含库名称和版本。
如果配方为多个库(.so 共享对象文件)创建软件包,
使用 LEAD_SONAME 指定应用该命名方案的库。
6.33 deploy
deploy 处理文件到 DEPLOY_DIR_IMAGE 的部署,
主要作用是使部署步骤能够通过共享状态加速。
继承此类的配方应定义自己的 do_deploy 函数,
将待部署文件复制到 DEPLOYDIR,并通过 addtask
将任务插入适当位置,通常在 do_compile
或 do_install 之后。
随后该类负责将文件从 DEPLOYDIR 暂存到 DEPLOY_DIR_IMAGE。
6.34 devicetree
devicetree 支持通过配方编译内核树之外的设备树源码。
树外设备树与内核树内设备树的编译过程相同,
支持包含内核中的 SoC dtsi 文件,以及 gpio.h 等 C 头文件。
do_compile 编译两类文件:
扩展名为
.dts的普通设备树源码。文件内容包含
/plugin/;字符串的设备树覆盖文件。
生成的设备树二进制文件部署到
${DEPLOY_DIR_IMAGE}/devicetree/。
这类似于 kernel-devicetree,
但额外使用 devicetree 子目录以避免命名冲突。
设备树还会填充到系统根目录,供其他配方访问。
默认编译 DT_FILES_PATH 中的全部设备树源码。
若只需特定文件,将 DT_FILES 设为以空格分隔、
相对于 DT_FILES_PATH 的文件列表。
为方便使用,.dts 和 .dtb 扩展名均可接受。
非覆盖类型的设备树二进制文件末尾会附加填充空间, 通常用于在启动时添加额外属性。 可将 DT_PADDING_SIZE 设为所需字节数,调整其大小。
控制此类的其他变量见 devicetree.bbclass 源码。
以下摘录自继承该类的 recipes-kernel/linux/devicetree-acme.bb 示例配方:
inherit devicetree
COMPATIBLE_MACHINE = "^mymachine$"
SRC_URI:mymachine = "file://mymachine.dts"
6.35 devshell
devshell 添加 do_devshell 任务。 是否包含此类由发行版策略决定。 更多使用说明见《Yocto Project 开发任务手册》的 “使用开发 Shell”一节。
6.36 devupstream
devupstream 通过 BBCLASSEXTEND 添加配方变体, 改从其他 URI(例如 Git)获取源码,而非使用压缩包。例如:
BBCLASSEXTEND = "devupstream:target"
SRC_URI:class-devupstream = "git://git.example.com/example;branch=main"
SRCREV:class-devupstream = "abcd1234"
添加这些语句后,将创建 DEFAULT_PREFERENCE 为“-1”的变体,
因此需要显式选择该变体才能使用。
针对开发的调整可通过 class-devupstream 覆盖完成。例如:
DEPENDS:append:class-devupstream = " gperf-native"
do_configure:prepend:class-devupstream() {
touch ${S}/README
}
目前只支持创建目标配方的开发变体,不支持 native 或 nativesdk 变体。
BBCLASSEXTEND 的语法 devupstream:target 为 native 和 nativesdk
变体预留了支持,因此未来版本可以添加此功能。
由于 BitBake 自动获取依赖(例如 subversion-native)的机制,
对 Subversion 等其他版本控制系统的支持有限。
6.37 externalsrc
externalsrc 支持从 OpenEmbedded 构建系统之外的源码构建软件, 这意味着不使用通常的获取、解包和补丁流程。
默认情况下,构建系统分别通过 S 和 B 定位解包后的配方源码和构建目录。 继承此类后,使用 EXTERNALSRC 和 EXTERNALSRC_BUILD 最终定义 S 和 B。
此类默认要求源码支持将生成的对象放入 B 指定的独立目录。 B 默认设置如下,与源码目录 S 分离:
${WORKDIR}/${BPN}-{PV}/
此类的更多说明见 OpenEmbedded-Core (OE-Core) 中
meta/classes/externalsrc.bbclass 的注释。
使用方式见《Yocto Project 开发任务手册》的
“从外部源码构建软件”一节。
6.38 extrausers
extrausers 允许在镜像层面应用额外用户和组配置。 全局继承或在镜像配方中继承后,可以通过 EXTRA_USERS_PARAMS 执行额外用户和组操作。
备注
此类添加的操作除镜像配方外,不绑定其他特定配方, 因而可作用于整个镜像。 要为特定配方添加用户和组配置,请使用 useradd*。
以下是在镜像配方中使用该类的示例:
inherit extrausers
EXTRA_USERS_PARAMS = "\
useradd -p '' tester; \
groupadd developers; \
userdel nobody; \
groupdel -g video; \
groupmod -g 1020 developers; \
usermod -s /bin/sh tester; \
"
以下示例添加“tester-jim”和“tester-sue”两个用户并设置密码。 先在主机上生成已转义的密码哈希:
printf "%q" $(mkpasswd -m sha256crypt tester01)
将哈希保存到变量,再用于 useradd 参数:
inherit extrausers
PASSWD = "\$X\$ABC123\$A-Long-Hash"
EXTRA_USERS_PARAMS = "\
useradd -p '${PASSWD}' tester-jim; \
useradd -p '${PASSWD}' tester-sue; \
"
最后,以下示例设置 root 密码:
inherit extrausers
EXTRA_USERS_PARAMS = "\
usermod -p '${PASSWD}' root; \
"
备注
从安全角度看,硬编码默认密码通常并不可取, 在某些司法辖区甚至不合法。构建生产镜像时不建议这样做。
6.39 features_check
features_check 允许各配方检查必需和冲突的 DISTRO_FEATURES、MACHINE_FEATURES 或 COMBINED_FEATURES。
支持以下变量:
REQUIRED_MACHINE_FEATURESCONFLICT_MACHINE_FEATURESANY_OF_MACHINE_FEATURESREQUIRED_COMBINED_FEATURESCONFLICT_COMBINED_FEATURESANY_OF_COMBINED_FEATURES
如果配方通过这些变量指定的任一条件不满足,则跳过配方; 构建系统若尝试构建该配方,就会报错。
6.40 fontcache
fontcache 为字体包生成适当的安装后和删除后脚本
(postinst/postrm)。脚本调用 Fontconfig 的 fc-cache,
将字体添加到字体信息缓存。
缓存文件与架构相关,因此镜像创建期间若需在构建主机运行 postinst,
则通过 QEMU 执行 fc-cache。
如果字体位于主软件包之外的包中,使用 FONT_PACKAGES 指定这些包。
6.41 fs-uuid
fs-uuid 从 ${ROOTFS} 提取 UUID,
调用时根文件系统必须已构建完成。此类仅适用于 ext 文件系统,依赖 tune2fs。
6.42 gconf
gconf 为需要安装 GConf schema 的配方提供公共功能。
继承后自动创建独立包 ${PN}-gconf,存放这些 schema。
该包通过适当的安装后和删除后脚本,在目标镜像中注册和注销 schema。
6.43 gettext
gettext 支持构建使用 GNU gettext 国际化和本地化系统的软件。
所有构建此类软件的配方都应继承该类。
此类会配置配方构建翻译,除非:
USE_NLS 设为
no;或设置了 INHIBIT_DEFAULT_DEPS,且配方未同时继承 cross-canadian。
6.44 github-releases
对于从 GitHub 获取发布压缩包的配方,github-releases
提供统一的上游版本检查方式,支持 devtool upgrade 和自动升级助手(AUH)。
使用时将此类添加到配方的 inherit 行。
如果 GITHUB_BASE_URI 默认值不合适,在配方中设置自己的值,
并在 SRC_URI 中使用 ${GITHUB_BASE_URI}。
6.45 gnomebase
gnomebase 是构建 GNOME 软件栈的配方基类。 它设置 SRC_URI 以从 GNOME 镜像站下载源码, 并向 FILES 添加典型 GNOME 安装路径。
6.46 go
go 支持构建 Go 程序。 由必需的 GO_IMPORT,以及可选的 GO_INSTALL 和 GO_INSTALL_FILTEROUT 控制行为。
使用 Yocto Project 构建 Go 程序时,可参考 go-helloworld_0.1.bb。
6.47 go-mod
另请参阅相关变量 GO_WORKDIR。
6.48 go-mod-update-modules
go-mod-update-modules 可用于 Go 配方,
定义可手动运行的 do_update_modules 任务,更新两个文件:
以下“BPN”对应 BPN。
BPN-go-mods.inc:配方依赖的 Go 模块列表。BPN-licenses.inc:各依赖 Go 模块的许可证列表。
随后可通过 do_update_modules 自动更新这些文件。
6.49 go-vendor
go-vendor 支持离线构建,也称 Go vendoring。 模块依赖在 do_fetch 中下载,而不是在导入模块时下载, 符合 Yocto 预先获取全部源码的理念。
依赖解包到模块的 vendor 目录,并在其中生成清单文件。
6.50 gobject-introspection
支持构建提供 GObject introspection 功能的软件。 只有 DISTRO_FEATURES 包含“gobject-introspection-data”, 且 MACHINE_FEATURES 包含“qemu-usermode”时才启用。
备注
此功能 默认启用。 如果不适用,应分别通过 DISTRO_FEATURES_OPTED_OUT 或 MACHINE_FEATURES_OPTED_OUT 禁用。
6.51 grub-efi
grub-efi 提供用于构建可启动镜像的 grub-efi 专用函数。
支持以下变量:
INITRD:要连接并用作初始 RAM 磁盘的文件系统镜像列表,可选。 可为每个
LABEL分别指定。ROOTFS:要纳入作为根文件系统的镜像,可选。
GRUB_GFXSERIAL:设为“1”时,在启动菜单中同时支持图形和串口。
LABELS:自动配置的目标列表。
APPEND:每个
LABEL的追加字符串覆盖列表。GRUB_TITLE:每个
LABEL的自定义标题。 未提供时,使用标签本身作为 GRUB 菜单项标题。GRUB_OPTS:添加到配置中的额外选项,可选,以分号(
;)分隔。GRUB_TIMEOUT:执行默认
LABEL前的等待时间,可选。
LABELS 中的每个 LABEL 都创建一个 GRUB 启动项,
部分变量可按标签分别定义,覆盖名称形式为 grub_LABEL。
例如,factory 标签的覆盖名称是 grub_factory。
要创建标题为“Factory Install”且附加 factory=yes 参数的菜单项,可使用:
LABELS:append = " factory"
APPEND:grub_factory = "factory=yes"
GRUB_TITLE:grub_factory = "Factory Install"
6.52 gsettings
gsettings 为安装 GSettings(glib)schema 的配方提供公共功能。 假定 schema 属于主软件包,添加适当的安装后和删除后脚本, 在目标镜像中注册和注销 schema。
6.53 gtk-doc
gtk-doc 是辅助类,引入适当的 gtk-doc 依赖并禁用 gtk-doc。
6.54 gtk-icon-cache
gtk-icon-cache 为使用 GTK+ 并安装图标的软件包生成
安装后和删除后脚本。脚本调用 gtk-update-icon-cache,
将字体添加到 GTK+ 图标缓存。
缓存文件与架构相关,因此镜像创建时若需在构建主机运行 postinst,
会通过 QEMU 执行该工具。
6.55 gtk-immodules-cache
gtk-immodules-cache 为安装虚拟键盘 GTK+ 输入法模块的软件包
生成安装后和删除后脚本。
脚本调用 gtk-update-icon-cache,将输入法模块添加到缓存。
缓存文件与架构相关,因此镜像创建时若需在构建主机运行 postinst,
会通过 QEMU 执行该工具。
如果模块不在主软件包中,使用 GTKIMMODULES_PACKAGES 指定包含模块的包。
6.56 gzipnative
gzipnative 允许使用不同的 native 版本 gzip 和 pigz,
而不是构建主机上的版本。
6.57 image
image 支持创建不同格式的镜像。
先根据软件包格式使用相应 rootfs*.bbclass 从软件包创建根文件系统,
再创建一个或多个镜像文件。
IMAGE_FSTYPES 控制生成的镜像类型。
IMAGE_INSTALL 控制安装到镜像中的软件包列表。
镜像定制见《Yocto Project 开发任务手册》的 “定制镜像”一节。 镜像创建过程见《Yocto Project 概览与概念手册》的 “镜像”一节。
6.58 image-buildinfo
image-buildinfo 将构建信息写入目标文件系统的纯文本文件,
默认位于 ${sysconfdir}/buildinfo,由 IMAGE_BUILDINFO_FILE 指定。
这有助于手动确定任意镜像的来源。文件包含两节:
Build Configuration:变量及其值的列表,由 IMAGE_BUILDINFO_VARS 指定,默认包含 DISTRO 和 DISTRO_VERSION。
Layer Revisions:构建所用全部层的修订版本。
构建 SDK 时,也会将相同内容写入文件,默认位置为 /buildinfo,
由 SDK_BUILDINFO_FILE 指定。
6.59 image_types
image_types 定义可通过 IMAGE_FSTYPES 启用的全部标准镜像输出类型。添加自定义类型时可参考此类。
image 默认自动启用该类,
通过 IMGCLASSES 变量使用它,方式如下:
IMGCLASSES = "rootfs_${IMAGE_PKGTYPE} image_types ${IMAGE_CLASSES}"
# Only Linux SDKs support populate_sdk_ext, fall back to populate_sdk_base
# in the non-Linux SDK_OS case, such as mingw32
inherit populate_sdk_base
IMGCLASSES += "${@['', 'populate_sdk_ext']['linux' in d.getVar("SDK_OS")]}"
IMGCLASSES += "${@bb.utils.contains_any('IMAGE_FSTYPES', 'live iso hddimg', 'image-live', '', d)}"
IMGCLASSES += "${@bb.utils.contains('IMAGE_FSTYPES', 'container', 'image-container', '', d)}"
IMGCLASSES += "image_types_wic"
IMGCLASSES += "rootfs-postcommands"
IMGCLASSES += "image-postinst-intercepts"
IMGCLASSES += "overlayfs-etc"
inherit_defer ${IMGCLASSES}
此类还处理镜像的转换和压缩。
备注
构建 VMware VMDK 镜像时,需要向 IMAGE_FSTYPES 添加“wic.vmdk”。 Virtual Box 虚拟磁盘镜像(“vdi”)和 QEMU 写时复制第 2 版 (“qcow2”)镜像的处理方式类似。
6.60 image-container
IMAGE_FSTYPES 包含 container 的 镜像
配方自动继承 image-container。
它提供相应设置,生成可供符合 OCI
标准的容器管理工具使用的镜像,例如 Podman
或 Docker。
备注
此类不会为目标构建或安装容器管理工具。 这些工具由 meta-virtualization 层提供。
应在 configuration file 中将 Linux 内核的 PREFERRED_PROVIDER
设为 linux-dummy:
PREFERRED_PROVIDER_virtual/kernel = "linux-dummy"
否则会报错。如有需要,可将 IMAGE_CONTAINER_NO_DUMMY 设为“1” 以避免此错误。
linux-dummy 扮演内核配方的角色,但不构建任何内容。
容器镜像无需包含 Linux 内核,因此适合将其作为首选内核提供者,
也能缩短构建时间。
使用此类只会向 DEPLOY_DIR_IMAGE 额外部署一个 tar.bz2 归档。
可在通常名为 Dockerfile 或 Containerfile 的容器文件中使用它。
例如,对于 Podman 或
Docker,
容器文件 可包含:
FROM scratch
ADD ./image-container-qemux86-64.rootfs.tar.bz2 /
ENTRYPOINT /bin/sh
这样即可使用生成的根文件系统镜像构建容器。
6.61 image-live
此类控制 live 镜像(HDDIMG 和 ISO)的构建。 镜像包含用于传统启动的 syslinux;如果 MACHINE_FEATURES 包含“efi”,还会包含 EFI_PROVIDER 指定的引导加载程序。
通常不直接使用此类,而是向 IMAGE_FSTYPES 添加“live”。
6.62 insane
insane 在软件包生成过程中增加质量保证检查, 对构建输出进行一系列检查,发现可能在运行时出现的常见问题。 是否包含此类通常由发行版策略决定。
可配置特定检查失败时产生警告或错误。 新引入的检查通常先产生警告;当元数据已达到已知良好状态后, 同一检查再失败则改为报错。 默认配置下可能遇到的消息见“质量检查错误和警告消息”章。
通过 WARN_QA 和 ERROR_QA 可全局控制检查行为,
例如在自定义发行版配置中设置。
若要在配方中跳过检查,应使用 INSANE_SKIP。
例如,要跳过主软件包中 .so 符号链接检查,可添加以下设置。
必须使用软件包名覆盖,本例为 ${PN}:
INSANE_SKIP:${PN} += "dev-so"
质量检查用于发现打包输出中真实或潜在的问题,禁用时应谨慎。
可列入 WARN_QA 和 ERROR_QA 的检查, 见《Yocto Project 参考手册》的 质量检查错误和警告消息。
6.63 kernel
kernel 处理 Linux 内核构建,包含构建各类内核树的代码。 所需头文件会暂存到 STAGING_KERNEL_DIR, 使树外模块可以使用 module 构建。
如果 SRC_URI 列出名为 defconfig 的文件,
do_configure 默认将它复制为构建目录中的 .config,
自动作为本次内核配置。如果 .config 已存在,则不复制,
以允许配方通过 do_configure:prepend 等其他方式生成配置。
每个构建出的内核模块单独打包,通过解析 modinfo 输出创建模块间依赖。
如果需要全部模块,安装 kernel-modules 会安装所有模块包,
以及 kernel-vmlinux 等其他内核包。
此类还支持在构建内核镜像时嵌入初始 RAM 文件系统(Initramfs)。 构建方法见《Yocto Project 开发任务手册》的 “构建初始 RAM 文件系统(Initramfs)镜像”一节。
kernel 和 module 内部还使用 kernel-arch、module-base 等类。
6.64 kernel-arch
kernel-arch 为 Linux 内核及模块编译设置 ARCH 环境变量。
6.65 kernel-devicetree
kernel-devicetree 由 kernel 继承, 支持生成设备树。
主要由以下变量控制:
KERNEL_DEVICETREE_BUNDLE:是否将内核和设备树捆绑。
KERNEL_DTBDEST:DTB 文件安装目录。
KERNEL_DTBVENDORED:是否保留厂商子目录。
KERNEL_DTC_FLAGS:设备树编译器
dtc的标志。KERNEL_PACKAGE_NAME:内核软件包的基本名称。
6.66 kernel-fit-image
kernel-fit-image 支持将内核镜像、设备树、U-Boot 脚本、 Initramfs 和额外可加载对象打包成单个 FIT 镜像。 理论上,FIT 可包含任意数量的内核、U-Boot 脚本、Initramfs 和设备树。 但此类目前只支持有限场景:一个内核镜像、可选的单个 U-Boot 脚本、 可选的单个 Initramfs,以及任意数量的设备树和可加载对象。
FIT 镜像由继承此类的配方创建,例如 linux-yocto-fitimage
为 Linux Yocto 内核创建 FIT 镜像。
此外,KERNEL_CLASSES 必须包含 kernel-fit-extra-artifacts,
将所需内核产物导出到 DEPLOY_DIR_IMAGE,供 FIT 镜像创建使用。
最简单的构建方式是在机器 configuration file 中添加:
KERNEL_CLASSES += "kernel-fit-extra-artifacts"
然后执行:
bitbake linux-yocto-fitimage
结果是部署到 DEPLOY_DIR_IMAGE 的 fitImage 文件,
以及可安装的 linux-yocto-fitimage 软件包。
同样的方法适用于全部 linux-yocto 变体。
例如使用 linux-yocto-rt 时,在机器配置中添加:
KERNEL_CLASSES += "kernel-fit-extra-artifacts"
PREFERRED_PROVIDER_virtual/kernel = "linux-yocto-rt"
再运行以下命令,构建包含 RT 内核的 FIT 镜像:
bitbake linux-yocto-fitimage
其他层提供的内核也可使用同样方法。
不过,在自定义内核配方旁添加自定义 FIT 镜像配方通常更直观。
例如,提供 linux-vanilla 的层可以增加 linux-vanilla-fitimage,
以 linux-yocto-fitimage 的副本为基础定制。
内核通常作为镜像的依赖构建。 如果希望以 FIT 镜像替代安装到根文件系统中的内核镜像, 可以在机器配置等位置设置以下变量:
# Create and deploy the vmlinux artifact which gets included into the FIT image
KERNEL_CLASSES += "kernel-fit-extra-artifacts"
# Do not install the kernel image package
RRECOMMENDS:${KERNEL_PACKAGE_NAME}-base = ""
# Install the FIT image package
MACHINE_ESSENTIAL_EXTRA_RDEPENDS += "linux-yocto-fitimage"
# Configure the image.bbclass to depend on the FIT image instead of only
# the kernel to ensure the FIT image is built and deployed with the image
KERNEL_DEPLOY_DEPEND = "linux-yocto-fitimage:do_deploy"
此类处理以下配置变量:
创建 FIT 时传给
mkimage -D的设备树编译器选项, 由 UBOOT_MKIMAGE_DTCOPTS 指定。FIT 只能包含一个内核,且内核是必需组件。 U-Boot 加载地址由 UBOOT_LOADADDRESS 指定, 入口点由 UBOOT_ENTRYPOINT 指定。 如果地址为 64 位,必须将 FIT_ADDRESS_CELLS 设为“2”。
FIT 可包含多个设备树,设备树为可选组件。 设备树覆盖的 U-Boot 加载地址由 UBOOT_DTBO_LOADADDRESS 指定, 普通设备树二进制文件的地址由 UBOOT_DTB_LOADADDRESS 指定。
FIT 只能包含一个可选的 Initramfs。 RAM 磁盘镜像加载地址由 UBOOT_RD_LOADADDRESS 指定, 入口点由 UBOOT_RD_ENTRYPOINT 指定。 设置 INITRAMFS_IMAGE 后,它会被加入 FIT。
建议将 Initramfs 和内核作为独立镜像节点加入 FIT。 也可以将 INITRAMFS_IMAGE_BUNDLE 设为“1”, 先将 RAM 磁盘镜像与内核捆绑,再加入 FIT。 但这样每次 RAM 磁盘修改都需要重建内核, 且需要完整内核构建目录,与 SSTATE_DIR 乃至 SDK 不太兼容。
FIT 只能包含一个可选的 U-Boot 启动脚本。 脚本在 ITS 中指定为包含 U-Boot 命令的文本文件。 继承此类的配方应将脚本加入 SRC_URI, 并将 FIT_UBOOT_ENV 设为文件名称,例如:
FIT_UBOOT_ENV = "boot.txt" SRC_URI += "file://${FIT_UBOOT_ENV}"
运行时可配置 U-Boot 启动命令,从 FIT 加载并执行该脚本。
FIT 可包含多个额外的可加载对象,例如辅助处理器固件。 这些对象可选,由 FIT_LOADABLES 指定。 通过以下变量的标志可分别配置各对象:FIT_LOADABLE_ARCH、 FIT_LOADABLE_COMPRESSION、FIT_LOADABLE_DESCRIPTION、 FIT_LOADABLE_ENTRYPOINT、FIT_LOADABLE_FILENAME、 FIT_LOADABLE_LOADADDRESS、FIT_LOADABLE_OS 和 FIT_LOADABLE_TYPE。 这样指定的所有对象都会加入 FIT 中的全部配置。
适当设置 UBOOT_SIGN_ENABLE、UBOOT_MKIMAGE_DTCOPTS、 UBOOT_SIGN_KEYDIR 和 UBOOT_SIGN_KEYNAME 后, 生成的 FIT 镜像会被签名。 FIT_HASH_ALG 和 FIT_SIGN_ALG 默认分别为“sha256”和“rsa2048”。 FIT_GENERATE_KEYS 与 UBOOT_SIGN_ENABLE 均设为“1”时, 此类还能生成签名所需的密钥。
6.67 kernel-fit-extra-artifacts
kernel-fit-extra-artifacts 将所需内核产物导出到 DEPLOY_DIR_IMAGE。 kernel-fit-image 使用这些产物创建 FIT 镜像, 其中可包含内核、设备树、可选的 U-Boot 脚本和 Initramfs。
构建 FIT 时,通常在内核配方或机器配置的 KERNEL_CLASSES 中添加此类。 它确保打包 FIT 所需的内核二进制文件、DTB 等相关文件均可用。
例如,启用方式为:
KERNEL_CLASSES += "kernel-fit-extra-artifacts"
使用 kernel-fit-image 为内核生成 FIT 时,此设置必需。
6.68 kernel-grub
kernel-grub 在已部署目标上安装 RPM 更新内核时, 更新启动区域和启动菜单,将该内核设为优先启动项。
6.69 kernel-module-split
kernel-module-split 提供将 Linux 内核模块拆分为独立软件包的公共功能。
6.70 kernel-uboot
kernel-uboot 支持从 vmlinux 风格的内核源码构建。
6.71 kernel-uimage
kernel-uimage 支持打包 uImage。
6.72 kernel-yocto
kernel-yocto 提供从 linux-yocto 风格内核仓库构建的公共功能。
6.73 kernel-yocto-rust
kernel-yocto-rust 创建 Linux 内核所需的 Rust 依赖,
并在内核源码树中运行 make rustavailable,确保这些依赖可用。
6.74 kernelsrc
kernelsrc 设置 Linux 内核源码及版本。
6.75 lib_package
lib_package 适用于同时构建库和可执行程序,
但不希望程序默认随库安装的配方。
程序被放入独立的 ${PN}-bin 包,使安装可选。
6.76 libc*
libc* 支持构建使用 libc 的软件包:
libc-common 提供构建公共支持。
libc-package 支持打包
glibc和eglibc。
6.77 license
license 提供许可证清单生成和许可证排除功能。 通过 INHERIT_DISTRO 的默认值自动启用。
6.78 linuxloader
提供 linuxloader(),返回平台动态加载器/链接器的值,供其他多个类使用。
6.79 logging
logging 提供按 BitBake 严重级别记录消息的标准 shell 函数,
包括 bbplain、bbnote、bbwarn、bberror、bbfatal 和 bbdebug。
由于 base 继承此类,默认已启用。
6.80 meson
meson 支持使用 Meson 构建软件。
可通过 MESON_BUILDTYPE、MESON_TARGET 和 EXTRA_OEMESON
指定传给 meson 命令行的额外配置选项。
6.81 metadata_scm
metadata_scm 提供查询源码管理系统(SCM)仓库分支和修订版本的功能。
base 在每次构建开始前用它输出各层修订版本。 由于被 base 继承,此类默认启用。
6.82 mime
mime 为安装 MIME 类型文件的软件包生成安装后和删除后脚本。
脚本调用 update-mime-database,将 MIME 类型添加到共享数据库。
6.83 mime-xdg
mime-xdg 为安装含 MimeType 条目的 .desktop 文件的
软件包生成安装后和删除后脚本。
脚本调用 update-desktop-database,将类型添加到桌面文件处理的 MIME 数据库。
因此,在新创建的镜像中通过文件浏览器打开文件时, 用户无需从所有已知应用中选择,避免列出无法打开该文件的应用。
如果配方将 .desktop 安装为绝对符号链接,当前实现无法检测到这些文件。
此时需将对应软件包名称加入 MIME_XDG_PACKAGES。
6.84 mirrors
mirrors 设置标准源码镜像站的 MIRRORS 条目。 当配方 SRC_URI 指定的上游源码不可用时,提供回退来源。
由于 base 继承此类,默认已启用。
6.85 module
module 支持构建树外 Linux 内核模块。 它继承 module-base 和 kernel-module-split, 实现 do_compile 与 do_install, 提供构建和打包内核模块所需的全部功能。
有关树外模块的一般信息,请参阅《Yocto Project Linux 内核开发手册》的 “集成树外模块”一节。
6.86 module-base
module-base 提供构建 Linux 内核模块的基础功能。 如果软件包含一个或多个模块,且有自己的模块构建方式, 配方通常继承此类而不是 module。
6.87 module-rust
module-rust 支持构建 Rust 编写的树外 Linux 内核模块, 并继承 module。
有关树外模块的一般信息,请参阅《Yocto Project Linux 内核开发手册》的 “集成树外模块”一节。
6.88 multilib*
multilib* 支持为不同目标优化配置或架构构建库, 并将它们并存安装到同一镜像中。
更多信息请参阅《Yocto Project 开发任务手册》的 “将多个版本的库文件组合到同一镜像”一节。
6.89 native
native 为构建在 Build Host 上运行的工具提供公共功能, 即使用构建主机编译器或其他主机工具构建的工具。
可以通过两种方式创建此类配方:
创建继承 native 的
myrecipe-native.bb。 必须将该 inherit 语句放在所有其他 inherit 之后,确保最后继承此类。备注
使用这种方式时,配方名称必须遵循:
myrecipe-native.bb
现有代码依赖此命名约定,不遵守可能导致隐蔽问题。
或者,在任意目标配方(例如
myrecipe.bb)中添加以下设置, 创建 native 变体:BBCLASSEXTEND = "native"
在配方中使用
:class-native和:class-target覆盖, 分别指定主机和目标特有的功能。
两种方式都使用 native,只是应用方法不同。 第二种方式的优势是,如果同时需要主机和目标版本, 无需维护两个独立配方,公共部分自动共享。
6.90 nativesdk
nativesdk 为构建 SDK 中运行的工具提供公共功能, 即在 SDKMACHINE 上运行的工具。
可以通过两种方式创建配方:
创建继承 nativesdk 的
nativesdk-myrecipe.bb。 必须将该 inherit 语句放在所有其他 inherit 之后,确保最后继承此类。备注
配方名称必须遵循:
nativesdk-myrecipe.bb
现有代码依赖此命名约定,不遵守可能导致隐蔽问题。
或者,在任意目标配方(例如
myrecipe.bb)中添加以下设置, 创建 nativesdk 变体:BBCLASSEXTEND = "nativesdk"
在配方中使用
:class-nativesdk和:class-target覆盖, 分别指定 SDK 机器和目标特有的功能。
两种方式都使用 nativesdk,只是应用方法不同。 第二种方式的优势是,如果同时需要 SDK 机器和目标版本, 无需维护两个独立配方,公共部分自动共享。
6.91 nopackages
为不需要打包的配方和类禁用打包任务。
6.92 nospdx
nospdx 允许配方退出 create-spdx 提供的 SPDX 生成。
6.93 npm
警告
NPM 获取器目前因安全问题而禁用。 更多信息见 355cd22。
支持构建通过 Node 软件包管理器(NPM) 获取的 Node.js 软件。
备注
当前继承此类的配方必须使用 npm:// 获取器,才能自动获取并打包依赖。
创建 NPM 包的方法见《Yocto Project 开发任务手册》的 “创建 Node Package Manager(NPM)软件包”一节。
6.94 overlayfs
嵌入式系统通常希望根文件系统只读,但很多应用又需要读写部分目录。
尤其当更新机制覆盖整个根文件系统,而应用数据需要跨更新保留时,
这种需求很常见。overlayfs 通过 overlayfs 实现它,
同时保持底层根文件系统只读。
使用时,在机器配置中为 overlayfs 上层使用的分区设置挂载点。 底层文件系统可以是 overlayfs 支持的任何类型。 以下设置必须放在机器配置中:
OVERLAYFS_MOUNT_POINT[data] = "/data"
备注
如果在配方中重新定义此变量,质量检查将无法正确检查文件是否存在。
只检查 systemd 挂载单元文件是否存在,不检查其内容。
overlayfs 内部机制及支持操作的详情见 Linux 内核官方文档。
此类假定 BSP 的其他位置(例如 systemd-machine-units 配方)
已定义 data.mount systemd 单元,并将其安装到镜像。
随后可按配方指定可写目录,例如在 my-application.bb 中:
OVERLAYFS_WRITABLE_PATHS[data] = "/usr/share/my-custom-application"
使用不同变量标志可支持多个挂载点。
假设需要可写位置,但数据无需在重启后保留,
则可为 tmpfs 文件系统定义 mnt-overlay.mount 单元。
机器配置中设置:
OVERLAYFS_MOUNT_POINT[mnt-overlay] = "/mnt/overlay"
配方中设置:
OVERLAYFS_WRITABLE_PATHS[mnt-overlay] = "/usr/share/another-application"
实际使用中,应用运行前可能需要挂载多个覆盖层,避免写入底层文件系统,
尤其底层只读时更是如此。此类提供名为 ${PN}-overlays.service
的 systemd 辅助服务来挂载覆盖层。
应用配方(下例名为 application)的 systemd 单元可添加以下依赖:
[Unit]
After=application-overlays.service
Requires=application-overlays.service
备注
此类不支持 /etc 目录本身,因为 systemd 依赖它。
要将 /etc 放入 overlayfs,请参阅 overlayfs-etc。
6.95 overlayfs-etc
将 /etc 放入 overlayfs,需要在启动早期特殊处理。
方法是提供自定义 init 脚本,在真正的 init 程序启动前先挂载 /etc,
因为后者启动时已需要该目录。
镜像配方中的用法示例:
IMAGE_FEATURES += "overlayfs-etc"
备注
不得直接继承此类,应使用 IMAGE_FEATURES 或 EXTRA_IMAGE_FEATURES。
机器配置至少应定义 overlayfs 所用设备、挂载点和文件系统类型:
OVERLAYFS_ETC_MOUNT_POINT = "/data"
OVERLAYFS_ETC_DEVICE = "/dev/mmcblk0p2"
OVERLAYFS_ETC_FSTYPE ?= "ext4"
如需更细致地控制挂载行为,可设置挂载选项,默认使用 defaults:
OVERLAYFS_ETC_MOUNT_OPTIONS = "wsync"
此类为 /sbin/init 生成提供两种选择:
默认将原
/sbin/init重命名为/sbin/init.orig, 生成的 init 使用原名称/sbin/init。 优点是无需修改内核参数;限制是不能使用软件包管理, 因为更新初始化管理器会移除生成的脚本。如果希望原 init 保持不变,可设置:
OVERLAYFS_ETC_USE_ORIG_INIT_NAME = "0"
生成的 init 将命名为
/sbin/preinit, 需要在引导加载程序配置中手动扩展内核参数。
6.96 own-mirrors
own-mirrors 便于设置自己的 PREMIRRORS, 使构建系统先从这些镜像获取源码,再尝试配方 SRC_URI 中指定的上游。
全局继承并设置 SOURCE_MIRROR_URL 即可使用。例如:
INHERIT += "own-mirrors"
SOURCE_MIRROR_URL = "http://example.com/my-source-mirror"
SOURCE_MIRROR_URL 只能指定一个 URL。
6.97 package
package 支持从构建输出生成软件包。
通用核心功能位于 package.bbclass,特定包格式的代码位于
package_deb、package_rpm
和 package_ipk。
在 build/conf/local.conf 或发行版 configuration file 中设置 PACKAGE_CLASSES,可控制输出格式列表,支持一种或多种格式。 镜像从软件包生成,因此必须使用打包类才能生成镜像。 变量中列出的第一个类用于镜像生成。
可选地在开发主机建立 DNF 可访问的软件包仓库(软件包源), 即可在目标运行镜像时从该源安装软件包,即运行时安装。 更多信息见《Yocto Project 开发任务手册》的 “使用运行时软件包管理”一节。
所选打包类会影响构建性能和空间占用。 在依赖均已构建、完整构建同一或类似软件包的情况下, IPK 通常比 RPM 少耗时约百分之三十。 原因是 RPM 管理器创建和处理的 Metadata 更多。 因此,构建小型系统时可考虑将 PACKAGE_CLASSES 设为“package_ipk”。
但作出选择前,还应考虑 RPM 的以下特性:
更多元数据带来更多能力,例如逐文件类型记录、文件校验和生成和安装时校验、 稀疏文件支持、Multilib 冲突检测与解决、ACID 风格升级,以及重新打包以支持回滚。
对小型系统,Berkeley Database 和元数据的额外空间占用, 可能影响设备端升级能力。
关于打包类影响的更多讨论见 Yocto Project 邮件列表: https://lists.yoctoproject.org/g/poky/topic/61292484#msg6286。
6.98 package_deb
package_deb 支持创建 Debian(.deb)格式软件包,
并输出到 ${DEPLOY_DIR_DEB}。
此类继承 package,通过 PACKAGE_CLASSES 启用。
6.99 package_ipk
package_ipk 支持创建 IPK(.ipk)格式软件包,
并输出到 ${DEPLOY_DIR_IPK}。
此类继承 package,通过 PACKAGE_CLASSES 启用。
6.100 package_rpm
package_rpm 支持创建 RPM(.rpm)格式软件包,
并输出到 ${DEPLOY_DIR_RPM}。
此类继承 package,通过 PACKAGE_CLASSES 启用。
6.101 packagedata
packagedata 提供读取 PKGDATA_DIR 中 pkgdata
文件的公共功能。这些文件包含构建系统生成的各输出软件包的信息。
由于 package 继承此类,默认已启用。
6.102 packagegroup
packagegroup 为软件包组配方设置适当默认值, 例如 PACKAGES、PACKAGE_ARCH、ALLOW_EMPTY 等。 强烈建议所有软件包组配方继承此类。
用法见《Yocto Project 开发任务手册》的 “使用自定义软件包组定制镜像”一节。
此类以前称为 task。
备注
如果定义软件包组时需要设置:
PACKAGE_ARCH = "${MACHINE_ARCH}"
必须在配方的 inherit packagegroup 之前设置。
如果放在其后,可能破坏 BitBake 解析、产生“allarch”架构不匹配错误,
或使架构无关的默认值覆盖你的设置。
6.103 patch
patch 提供 do_patch 期间应用补丁的全部功能。
由于 base 继承此类,默认已启用。
6.104 perlnative
配方继承 perlnative 后,使用构建系统构建的 native Perl, 而非构建主机提供的版本。
6.105 pypi
pypi 为从 Python 软件包索引 PyPI 构建模块的配方设置适当变量。 默认根据 BPN 推导 PyPI 包名,移除存在的“python-”或“python3-”前缀。 部分情况下需要手动设置 PYPI_PACKAGE。
设置的变量包括 SRC_URI、SECTION、HOMEPAGE、 UPSTREAM_CHECK_URI、UPSTREAM_CHECK_REGEX 和 CVE_PRODUCT。
6.106 python_flit_core
python_flit_core 支持构建在 pyproject.toml 的
[build-system] 中将 build-backend 声明为 flit_core.buildapi
的 Python 模块。该后端符合 PEP-517,
另见 PEP-518。
此后端构建的模块是纯 Python,不含 C 或 Rust 扩展。
内部使用 python_pep517。
6.107 python_maturin
python_maturin 支持 python-maturin, 它替代 setuptools_rust,是构建 Python Wheel 的另一种后端。
6.108 python_mesonpy
python_mesonpy 支持使用 meson-python 构建系统的 Python 模块。
内部使用 python_pep517。
6.109 python_pbr
python_pbr 支持使用 Python Build Reasonableness 后端的 Python 项目。
它向构建时依赖添加 python3-pbr-native,内部使用 python_pep517。
6.110 python_pdm
python_pdm 支持通过 PDM 软件包和依赖管理器构建 Python 包。
它向构建时依赖添加 python3-pdm-backend-native,
内部使用 python_pep517。
6.111 python_pep517
python_pep517 构建并安装 Python wheel 二进制归档,
见 PEP-517。
配方通常不直接继承它,而是通过另一个类继承并添加相应 native 依赖。
例如 python_flit_core、python_setuptools_build_meta 和 python_poetry_core。
6.112 python_poetry_core
python_poetry_core 支持使用 Poetry Core 构建系统的 Python 模块。
内部使用 python_pep517。
6.113 python_pyo3
python_pyo3 确保 Rust 编写、使用 PyO3 构建的 Python 扩展正确设置交叉编译环境。
这是 python-setuptools3_rust 的内部类,配方不应直接使用。
6.114 python_uv_build
python_uv_build 可用于通过 uv_build 构建、
符合 PEP-517 的 Python 配方。
6.115 python-setuptools3_rust
python-setuptools3_rust 支持通过 PyO3 构建 Rust 实现的 Python 扩展,使编译和分发过程像 C 扩展一样方便。
此类继承 setuptools3 和 python_pyo3。
6.116 pixbufcache
pixbufcache 为安装 gdk-pixbuf 所用 pixbuf 加载器的软件包
生成安装后和删除后脚本。脚本调用 update_pixbuf_cache 将加载器加入缓存。
缓存与架构相关,因此镜像创建时若需在构建主机运行 postinst,
会通过 QEMU 执行该工具。
如果加载器不在配方的主软件包中,使用 PIXBUF_PACKAGES 指定包含它们的包。
6.117 pkgconfig
pkgconfig 提供通过 pkg-config 获取头文件和库信息的标准方式,
便于将 pkg-config 集成到使用它的库中。
暂存期间,BitBake 将 pkg-config 数据安装到 sysroots/。
利用 pkg-config 自身的系统根目录功能,此类无需再修改这些文件。
6.118 populate_sdk
populate_sdk 支持仅生成 SDK 的配方。 通过 do_populate_sdk 构建交叉开发工具链的优势, 见《Yocto Project 应用开发与可扩展软件开发工具包(eSDK)手册》的 “构建 SDK 安装程序”一节。
6 populate_sdk_*
populate_sdk_* 支持 SDK 创建,包括:
populate_sdk_base: 支持所有包管理器(DEB、RPM 和 opkg)的 SDK 创建基类。
populate_sdk_deb:支持 Debian 包管理器。
populate_sdk_rpm:支持 RPM 包管理器。
populate_sdk_ipk:支持 opkg(IPK 格式)包管理器。
populate_sdk_ext: 在所有包管理器下支持可扩展 SDK 创建。
基类根据 IMAGE_PKGTYPE 继承相应的 populate_sdk_deb、
populate_sdk_rpm 或 populate_sdk_ipk。
基类确保创建全部源目录和目标目录,然后填充 SDK。
之后建立两个系统根目录:${SDK_ARCH}-nativesdk
包含交叉编译器和相关工具;目标系统根目录包含为 SDK 用途配置的目标根文件系统。
两者位于 SDK_OUTPUT,布局如下:
${SDK_OUTPUT}/${SDK_ARCH}-nativesdk-pkgs
${SDK_OUTPUT}/${SDKTARGETSYSROOT}/target-pkgs
最后,基类创建工具链环境设置脚本、SDK 压缩包和安装程序。
各格式专用类由基类继承和使用,分别支持相应类型的 SDK。
交叉开发工具链生成的更多信息见《Yocto Project 概览与概念手册》的 “交叉开发工具链生成”一节。 使用 do_populate_sdk 的优势,见《Yocto Project 应用开发与 可扩展软件开发工具包(eSDK)手册》的 “构建 SDK 安装程序”一节。
6.120 prexport
备注
不应直接使用此类;运行 bitbake-prserv-tool export 时会启用它。
6.121 primport
备注
不应直接使用此类;运行 bitbake-prserv-tool import 时会启用它。
6.122 prserv
prserv 支持使用 PR 服务, 自动管理各配方 PR 的递增。
由于 package 继承此类,它默认启用。 不过,只有设置 PRSERV_HOST 后,构建系统才实际启用其功能。
6.123 ptest
ptest 为提供运行时测试的软件配方提供测试打包和安装功能。
此类应由各配方分别继承,但除非 DISTRO_FEATURES 包含“ptest”, 否则大部分功能都被禁用。 更多信息见《Yocto Project 测试环境手册》的 “使用 ptest 测试软件包”一节。
6.124 ptest-cargo
ptest-cargo 扩展 cargo,
添加 compile_ptest_cargo 和 install_ptest_cargo,
分别构建并安装 Cargo.toml 定义的测试套件,放入专用 -ptest 包。
6.125 ptest-gnome
为 GNOME 软件包启用专用 ptest,其测试通过 gnome-desktop-testing 执行。
配置和运行方法见《Yocto Project 测试环境手册》的 “使用 ptest 测试软件包”一节。
6.126 ptest-python-pytest
Python 配方可继承 ptest-python-pytest, 为使用 pytest 单元测试框架的包自动配置 ptest。
配方中的 PTEST_PYTEST_DIR 指定测试目录,
do_install_ptest_base 将其与专用 run-ptest 脚本安装到 D。
6.127 python3-dir
python3-dir 提供 Python 3 的基本版本、位置和 site-packages 位置。
6.128 python3native
python3native 支持使用构建系统构建的 native Python 3, 而不是构建主机提供的版本。
6.129 python3targetconfig
python3targetconfig 同样使用构建系统构建的 native Python 3,
但允许访问目标机器的配置,例如正确的安装目录。
它还会增加对目标 python3 的依赖,因此只应在确有需要时使用,
避免不必要地延长构建时间。
6.130 qemu
qemu 为需要 QEMU 或检查 QEMU 是否存在的配方提供功能。 通常用于通过 QEMU 应用模拟模式,在构建主机上运行目标程序。
6.131 recipe_sanity
recipe_sanity 检查主机上是否存在可能影响构建的配方前置条件, 例如已设置的变量或已安装的软件。
6.132 relative_symlinks
relative_symlinks 遍历 D 中的符号链接, 将指向绝对路径的链接改为相对路径。 部分配方在构建 native 版本时会产生错误链接, 或破坏 共享状态缓存,可使用此类修正。
例如,若在 D 中发现:
/usr/bin/foo -> /sbin/bar
会替换为:
/usr/bin/foo -> ../../sbin/bar
6.133 relocatable
relocatable 使二进制文件安装到系统根目录后可重定位。
6.134 remove-libtool
remove-libtool 向 do_install 添加后置函数,
删除 libtool 安装的全部 .la 文件,使系统根目录和目标软件包都不包含它们。
如果配方需要这些文件,可通过以下设置禁用删除:
REMOVE_LIBTOOL_LA = "0"
备注
此类默认不启用。
6.135 report-error
report-error 支持启用 错误报告工具, 将构建错误信息提交到中央数据库。
它收集配方、版本、任务、机器、发行版、构建系统、目标系统、主机发行版、
分支、提交和日志等调试信息,生成 JSON 报告,
保存到 ${LOG_DIR}/error-report。
6.136 retain
retain 在配方任务失败时,将工作目录或其他指定目录打成压缩包。 当构建环境是临时环境,或调试时无法直接访问检查时,这很有用。
在配置中添加以下内容以启用:
INHERIT += "retain"
可通过 RETAIN_ENABLED 对特定配方禁用。
6.137 rm_work
rm_work 支持删除临时工作区,降低构建对磁盘空间的需求。
OpenEmbedded 构建可能占用大量空间,其中一部分是各配方在
${TMPDIR}/work 下的工作文件。
软件包生成后,这些文件不再必需,但默认保留以便检查和调试。
若希望构建过程中删除它们以节省空间,可在 Build Directory
的 build/conf/local.conf 中添加:
INHERIT += "rm_work"
如果正在配方工作目录内修改和构建源码,启用此类可能导致修改丢失。 可将正在开发的配方名称加入 RM_WORK_EXCLUDE,排除删除其工作目录。 该变量也可在 build/conf/local.conf 中设置,例如:
RM_WORK_EXCLUDE += "busybox glibc"
若配方仍使用此类,但希望 BitBake 保留 WORKDIR 中
除 temp 外的特定文件或目录,可设置 RM_WORK_EXCLUDE_ITEMS:
RM_WORK_EXCLUDE_ITEMS += "items_to_keep"
6.138 rootfs*
rootfs* 支持创建镜像根文件系统,包括:
rootfs-postcommands:定义镜像配方的文件系统后处理函数。
rootfs_deb:从
.deb软件包创建根文件系统。rootfs_rpm:从
.rpm软件包创建根文件系统。rootfs_ipk:从
.ipk软件包创建根文件系统。rootfsdebugfiles: 将构建主机上的额外文件直接安装到根文件系统。
根据 PACKAGE_CLASSES 选择其中一个类,从软件包创建根文件系统。
更多信息见《Yocto Project 概览与概念手册》的 “生成镜像”一节。
6.139 rust
rust 是仅供“rust”配方构建 Rust 编译器和运行时库的内部类。 除该配方外,不应直接使用。
6.140 rust-common
rust-common 是 cargo_common 和 rust 使用的内部类,不应直接使用。
6.141 rust-target-config
rust-target-config 是 cargo_common 和 rust 使用的内部类,不应直接使用。
它通过 do_rust_gen_targets,根据 TUNE_FEATURES
生成用于交叉编译的 JSON 规格文件。
6.142 sanity
sanity 检查主机是否安装前置软件, 提醒用户可能影响构建的问题。 它还对 build/conf/local.conf 进行基本用户配置检查, 防止常见错误导致构建失败。是否包含此类通常由发行版策略决定。
6.143 sbom-cve-check
sbom-cve-check 使用 sbom-cve-check 命令行工具进行构建后 CVE 分析。 由于输入为 SPDX 文件,它依赖 create-spdx。
应通过 core/yocto/sbom-cve-check 片段启用:
$ bitbake-config-build enable-fragment core/yocto/sbom-cve-check
镜像构建后,根据 SBOM_CVE_CHECK_EXPORT_VARS 当前值, 在 DEPLOY_DIR_IMAGE 生成一份或多份报告。
配置行为的更多信息见
Yocto Project 参考手册变量表
中以 SBOM_CVE_CHECK_ 开头的变量。
6.144 sbom-cve-check-recipe
sbom-cve-check-recipe 使用 sbom-cve-check 对配方进行构建后 CVE 分析,输入为 SPDX,因而依赖 create-spdx。
任意配方均可继承它。与 ref-classes-sbom-cve-check 不同,
它只使用 create_recipe_sbom 之后生成的配方 SBOM,
识别底层软件并分析,因此无需构建配方本身。
在配方中继承后,运行:
$ bitbake <recipe> -c sbom_cve_check_recipe
随后根据 SBOM_CVE_CHECK_EXPORT_VARS 当前值, 在 DEPLOY_DIR_IMAGE 生成一份或多份报告。
配置行为的更多信息见
Yocto Project 参考手册变量表
中以 SBOM_CVE_CHECK_ 开头的变量。
6.145 scons
scons 支持使用 SCons 构建系统的软件配方。 可通过 EXTRA_OESCONS 指定传给 SCons 命令行的额外配置选项。
6.146 sdl
sdl 支持构建使用 Simple DirectMedia Layer(SDL)库的软件。
6.147 python_setuptools_build_meta
python_setuptools_build_meta 支持在 pyproject.toml
的 [build-system] 中将 build-backend 声明为 setuptools.build_meta
的 Python 模块,符合 PEP-517。
另见 PEP-518。
这些模块可以是纯 Python,也可以包含 C 或 Rust 扩展。
内部使用 python_pep517。
6.148 setuptools3
setuptools3 支持使用基于 setuptools 的构建系统的 Python 3.x 扩展,
例如只有 setup.py,尚未迁移到正式 pyproject.toml 格式的项目。
使用这类构建系统的配方应继承此类。
备注
do_compile 现在调用
setup.py bdist_wheel构建 wheel 二进制归档,见 PEP-427。因此,仍使用 Python 标准库中已弃用 distutils 的旧软件不能打包为 wheel。 常见解决方式是将
from distutils.core import setup替换为from setuptools import setup。备注
do_install 现在安装 wheel 二进制归档。 当前 setuptools 已弃用旧的
setup.py install。 如果 setup.py 不兼容 wheel,例如创建 Python 模块或标准入口点之外的文件, 应使用 setuptools3_legacy。
6.149 setuptools3_legacy
setuptools3_legacy 支持使用 setuptools 的 Python 3.x 扩展,
例如只有 setup.py 而未迁移到 pyproject.toml 的项目。
与 setuptools3 不同,它使用传统 setup.py 的 build
和 install 命令,不使用 wheel。
这种用法已经
弃用,
但仍较常见。
6.150 setuptools3-base
setuptools3-base 为其他构建 Python 3.x 扩展的类提供可复用基础。
若需要 setuptools3 未提供的功能,
可使用 inherit setuptools3-base。
部分配方不需要 setuptools3 的任务,因此改为继承此类。
6.151 sign_rpm
sign_rpm 支持生成已签名的 RPM 软件包。
6.152 siteinfo
siteinfo 提供其他类或配方可能需要的目标信息。
例如,Autotools 的某些测试必须在目标硬件运行,交叉编译时通常不可行。
site 信息提供缓存结果,使测试可以跳过,同时仍获得正确值。
meta/site 目录按架构、字节序和所用 libc 等类别保存测试结果。
此类通过 CONFIG_SITE 提供与当前构建相关的数据文件列表,
由 Autotools 自动读取。
它还提供 SITEINFO_ENDIANNESS、SITEINFO_BITS 等变量,供元数据其他位置使用。
6.153 sstate
sstate 提供共享状态支持, 通过 INHERIT_DISTRO 的默认值启用。
更多信息见《Yocto Project 概览与概念手册》的 “共享状态缓存”一节。
6.154 staging
staging 将系统根目录文件安装到各配方工作目录,包含两个关键任务:
do_populate_sysroot:处理最终进入配方系统根目录的文件。
do_prepare_recipe_sysroot:与前者配套, 将文件安装到各配方的 WORKDIR。
此类代码较复杂,基本分为两个阶段:
第一阶段: 处理需要向依赖自己的其他配方共享文件的配方。 这些文件通常由 do_install 安装到
${D}。 do_populate_sysroot 将其中一部分复制到${SYSROOT_DESTDIR}, 由 SYSROOT_DIRS、SYSROOT_DIRS_NATIVE 和 SYSROOT_DIRS_IGNORE 控制范围。备注
配方还可通过 SYSROOT_PREPROCESS_FUNCS 声明处理函数,进一步定制文件。
随后根据这些文件构建共享状态对象, 并将文件放入 build/tmp/sysroots-components/ 的子目录。 扫描文件中指向原安装位置的硬编码路径。 如果在文本文件中发现,将路径替换为标记,并生成需要替换的文件列表。 这些调整称为“FIXMEs”。扫描范围由 SSTATE_SCAN_FILES 控制。
第二阶段: 处理通过 DEPENDS 声明依赖、需要使用其他配方内容的配方。 do_prepare_recipe_sysroot 执行时, 在 WORKDIR 创建
recipe-sysroot和recipe-sysroot-native, 将sysroots-components中对应文件硬链接到配方工作目录。备注
无法建立硬链接时,构建系统使用实际复制。
然后根据第一阶段生成的列表修复路径中的“FIXMEs”。 最后执行系统根目录
${bindir}中以postinst-开头的所有文件。备注
不建议普遍使用这类系统根目录安装后脚本, 但它们可解决用户创建、模块索引等问题。
配方还可能存在 DEPENDS 之外的依赖, 例如
do_unpack[depends] += "tar-native:do_populate_sysroot"。 因此,系统根目录创建函数extend_recipe_sysroot也会作为这些任务的前置函数,执行类似处理。安装依赖时会遍历依赖图,按与共享状态安装完全相同的规则处理。 例如,native 工具会加入其 native 依赖, 但目标库的依赖不会继续遍历或安装。 两者使用相同的共享状态依赖代码,确保无论是否使用共享状态,构建结果都一致。 详情见 sstate 的
setscene_depvalid()。构建系统维护已安装文件的清单,以便按需安装任意依赖。 还会保存已安装内容的共享状态哈希,变化时可以重新安装。
6.155 syslinux
syslinux 提供用于构建可启动镜像的 syslinux 专用功能。
支持以下变量:
INITRD:要连接并用作初始 RAM 磁盘的文件系统镜像列表,可选。
ROOTFS:要作为根文件系统纳入的镜像,可选。
AUTO_SYSLINUXMENU:设为“1”时自动创建菜单。
LABELS:自动配置的目标列表。
APPEND:各标签的追加字符串覆盖列表。
SYSLINUX_OPTS:添加到 syslinux 文件的额外选项,以分号分隔。
SYSLINUX_SPLASH:使用启动菜单时,指定 VGA 菜单背景。
SYSLINUX_DEFAULT_CONSOLE:设为“console=ttyX”,改变内核默认启动控制台。
SYSLINUX_SERIAL:设置另一个串口;空字符串表示关闭串口。
SYSLINUX_SERIAL_TTY:设置另一个“console=tty...”内核启动参数。
6.156 systemd
systemd 支持安装 systemd 单元文件的配方。 只有 DISTRO_FEATURES 包含“systemd”时,其功能才启用。
配方或 Makefile,即 do_install 调用的安装过程,
应将单元文件放入 ${D}${systemd_unitdir}/system。
如果单元文件不在主软件包中,应通过 SYSTEMD_PACKAGES 指定所属软件包。
将 SYSTEMD_SERVICE 设为服务文件名称,
并使用软件包名称覆盖指定作用对象。
主软件包使用 ${PN},例如 connman 配方中:
SYSTEMD_SERVICE:${PN} = "connman.service"
服务默认配置为开机自动启动,除非 SYSTEMD_AUTO_ENABLE 设为“disable”。
更多信息见《Yocto Project 开发任务手册》的 “选择初始化管理器”一节。
6.157 systemd-boot
systemd-boot 提供 systemd-boot 引导加载程序专用的可启动镜像功能。 这是内部类,不应直接使用。
备注
此类源于旧版 Yocto Project 的 gummiboot 类与 systemd 项目的合并。
将 EFI_PROVIDER 设为“systemd-boot”即可使用。 这样会创建不依赖 systemd 的独立 EFI 引导加载程序。
相关配置变量见 SYSTEMD_BOOT_CFG、SYSTEMD_BOOT_ENTRIES 和 SYSTEMD_BOOT_TIMEOUT。
另请参阅 Systemd-boot 文档。
6.158 terminal
terminal 支持启动终端会话, 由 OE_TERMINAL 控制使用哪个终端模拟器。
其他类在需要独立终端时使用它。 例如 PATCHRESOLVE 为“user”时的 patch, 以及 cml1 和 devshell。
6.159 testexport
testexport 基于 testimage, 将测试环境导出到 OpenEmbedded Build System 之外。 它生成所需目录结构,以便通过 Python 脚本 runexported.py 执行运行时测试。
详情见《Yocto Project 测试环境手册》的 导出测试 一节。
6.160 testimage
testimage 支持通过 QEMU 或真实硬件对镜像运行自动化测试, 负责加载测试和启动镜像。使用之前需要配置环境。
在配置中添加以下内容以启用:
IMAGE_CLASSES += "testimage"
测试通过 ssh 在目标上运行命令,使用 Python 编写并使用 unittest 模块。
可以按如下方式对镜像运行测试:
$ bitbake -c testimage image
若希望每个镜像构建后自动测试,可设置 TESTIMAGE_AUTO:
TESTIMAGE_AUTO = "1"
启用、运行和创建测试的方法见《Yocto Project 测试环境手册》的 “执行自动化运行时测试”一节。
6.161 testsdk
此类支持对 SDK 运行自动化测试,调用方式为:
$ bitbake -c testsdk image
运行的测试模块列表由 TESTSDK_SUITES 控制。
备注
建议通过 IMAGE_CLASSES 而非 INHERIT 继承 testsdk,进行 SDK 自动化测试。
6.162 texinfo
上游软件在构建时调用 texinfo 工具的配方应继承此类。
为提高性能,native 和 cross 配方使用 texinfo-dummy-native 的替代脚本;
目标架构配方使用真正的 Texinfo 工具,默认采用主机系统提供的版本。
备注
若希望使用构建系统附带的 Texinfo 配方,可从 ASSUME_PROVIDED 移除“texinfo-native”,并从 SANITY_REQUIRED_UTILITIES 移除 makeinfo。
6.163 toaster
toaster 收集软件包和镜像信息, 将其作为 BitBake 用户界面可接收的事件发送。 Toaster 界面运行时启用此类,不应直接使用。
6.164 toolchain-scripts
toolchain-scripts 提供设置已安装 SDK 环境的脚本。
6.165 toolchain/clang
toolchain/clang 定义使用 Clang/LLVM 编译器和工具构建配方的命令。
不应直接继承,而应选择以下方式之一:
在 Configuration File 中将 PREFERRED_TOOLCHAIN_TARGET、 PREFERRED_TOOLCHAIN_NATIVE 或 PREFERRED_TOOLCHAIN_SDK 设为“clang”,使 base 相应使用此类。 所有配方使用 Clang/LLVM,除非自身将 TOOLCHAIN 或 TOOLCHAIN_NATIVE 覆盖为其他值。
配方需要覆盖上述变量指定的默认工具链时, 将 TOOLCHAIN 或 TOOLCHAIN_NATIVE 设为“clang”。
6.166 toolchain/clang-native
toolchain/clang-native 定义通过 Clang/LLVM 编译器和工具 构建 native 配方的命令,不受构建上下文影响。
toolchain/gcc-native 定义 BUILD_CC、BUILD_CXX 等配方很少直接使用的变量。 例外是构建过程中某个阶段需要使用主机编译器的目标配方。
不应直接继承。TOOLCHAIN_NATIVE 为“clang”时, 由 base 继承。
6.167 toolchain/gcc
toolchain/gcc 定义使用 GCC/Binutils 编译器和工具构建配方的命令。
不应直接继承,而应选择以下方式之一:
在 Configuration File 中将 PREFERRED_TOOLCHAIN_TARGET、 PREFERRED_TOOLCHAIN_NATIVE 或 PREFERRED_TOOLCHAIN_SDK 设为“gcc”,使 base 相应使用此类。 所有配方使用 GCC/Binutils,除非自身将 TOOLCHAIN 或 TOOLCHAIN_NATIVE 覆盖为其他值。
配方需要覆盖上述变量指定的默认工具链时, 将 TOOLCHAIN 或 TOOLCHAIN_NATIVE 设为“gcc”。
6.168 toolchain/gcc-native
toolchain/gcc-native 定义通过 GCC/Binutils 编译器和工具 构建 native 配方的命令,不受构建上下文影响。
它定义 BUILD_CC、BUILD_CXX 等配方很少直接使用的变量。 例外是构建过程中某个阶段需要使用主机编译器的目标配方。
不应直接继承。TOOLCHAIN_NATIVE 为“gcc”时, 由 base 继承。
6.169 typecheck
typecheck 根据定义的类型,验证配置层面设置的变量值。 构建系统允许通过“type”变量标志定义类型,例如:
IMAGE_FEATURES[type] = "list"
6.170 uboot-config
uboot-config 支持配置一个或多个 U-Boot 构建配置。
有三种方式为机器配置配方:
使用 UBOOT_MACHINE 及配套的 UBOOT_BINARY,例如:
UBOOT_MACHINE = "config" UBOOT_BINARY = "u-boot.bin"
使用 UBOOT_CONFIG 相关变量,例如:
UBOOT_CONFIG ??= "foo bar" UBOOT_CONFIG[foo] = "config" UBOOT_CONFIG[bar] = "config2" UBOOT_CONFIG_IMAGE_FSTYPES[bar] = "fstype" UBOOT_CONFIG_BINARY[foo] = "binary" UBOOT_CONFIG_MAKE_OPTS[foo] = "FOO=1" UBOOT_CONFIG_MAKE_OPTS[bar] = "BAR=1" UBOOT_CONFIG_FRAGMENTS[foo] = "foo.fragment"
上例选择所有可能配置(
foo和bar)。 也可以修改 UBOOT_CONFIG,仅包含其中一个, 从而只构建foo或bar。例如:UBOOT_CONFIG = "foo" UBOOT_CONFIG[foo] = "config" UBOOT_CONFIG[bar] = "config2"
每个构建配置对应 UBOOT_CONFIG 的一个变量标志定义, 各配置的相关调整由不同的 UBOOT_CONFIG_* 变量定义。
UBOOT_CONFIG[config]:此构建配置选用的 defconfig 文件, 位于 U-Boot 源码树的configs文件夹。此选项必需。
更多信息见 UBOOT_CONFIG。
UBOOT_CONFIG_IMAGE_FSTYPES[config]:为该构建配置生成镜像时, 追加到 IMAGE_FSTYPES 的镜像类型。这允许构建使用该配置生成的二进制文件的额外镜像格式。
此项可选,不需要时可以不指定。
更多信息见 UBOOT_CONFIG_IMAGE_FSTYPES。
UBOOT_CONFIG_BINARY[config]:选择要部署到 DEPLOY_DIR_IMAGE 的二进制文件。 U-Boot 构建可能生成多个文件,例如:u-boot.bin u-boot-with-spl.bin
将
binary设为u-boot-with-spl.bin后,会部署该文件, 并在过程中重命名以包含构建配置名称,即上例中的foo或bar。未指定时默认使用 UBOOT_BINARY。
更多信息见 UBOOT_CONFIG_BINARY。
UBOOT_CONFIG_MAKE_OPTS[config]:配置和编译此 U-Boot 配置时, 传给make的额外选项,添加在 UBOOT_MAKE_OPTS 的选项之前。此项可选,未指定时不添加任何内容。 如果某配置不需要 make 选项,可不设置该配置的标志。
更多信息见 UBOOT_CONFIG_MAKE_OPTS。
UBOOT_CONFIG_FRAGMENTS[config]:源码树中的额外配置片段, 在do_configure()期间用于设置构建, 添加在 UBOOT_FRAGMENTS 的片段之前。此项可选,未指定时不添加任何内容。 如果某配置没有额外片段,可不设置该配置的标志。
更多信息见 UBOOT_CONFIG_FRAGMENTS。
仅使用 UBOOT_CONFIG 的旧方式。 此方法正在弃用,见下文说明。 例如:
UBOOT_CONFIG ??= "foo bar" UBOOT_CONFIG[foo] = "config,images,binary" UBOOT_CONFIG[bar] = "config2,images2,binary2"
上例选择所有配置(
foo和bar)。 修改 UBOOT_CONFIG,只包含其中一个,也可仅构建该配置。每个构建配置对应 UBOOT_CONFIG 的一个变量标志, 最多包含三个逗号分隔选项(
config,images,binary):config:选择的 defconfig 文件,位于 U-Boot 源码树的configs目录。 此选项必需。images:追加到 IMAGE_FSTYPES 的镜像类型,供当前配置生成镜像。 这允许构建使用该配置生成的二进制文件的额外镜像格式。 此项可选,可以留空。binary:选择要部署到 DEPLOY_DIR_IMAGE 的二进制文件。 U-Boot 构建可能输出多个文件,例如:u-boot.bin u-boot-with-spl.bin
设为
u-boot-with-spl.bin后,将部署该文件, 同时重命名以包含配置名称,即上例中的foo或bar。 未设置时默认使用 UBOOT_BINARY。
备注
旧流程已经弃用,不建议继续使用。 未来控制选项的扩展不会加入该方式, 此功能将在 wrynose LTS 版本之后移除。
不能同时使用 UBOOT_MACHINE 和 UBOOT_CONFIG。
更多信息见这两个变量的说明。
6.171 uboot-extlinux-config
uboot-extlinux-config 支持生成 extlinux.conf,
它属于 U-Boot 的
通用发行版配置方案。
可在 U-Boot 配方中继承:
inherit uboot-extlinux-config
默认禁用实际功能。要启用,在 U-Boot 配方或 bbappend 中 将 UBOOT_EXTLINUX 设为“1”:
UBOOT_EXTLINUX = "1"
此外,还必须将 UBOOT_EXTLINUX_ROOT 设为
Linux 内核命令行
的 root= 参数。例如,以下设置指向 MMC 块设备 0 的第二分区:
UBOOT_EXTLINUX_ROOT = "root=/dev/mmcblk0p2"
构建 U-Boot 配方后,生成的 extlinux.conf 放入 DEPLOY_DIR_IMAGE:
tmp/deploy/images/<MACHINE>/extlinux.conf
可使用《Yocto Project 参考手册》的 变量表
中以 UBOOT_EXTLINUX_ 开头的变量定制该文件。
备注
UBOOT_EXTLINUX_LABELS 可以指定多个标签,即多个启动项。 此时应使用覆盖式赋值指定各标签属性。更多信息见该变量定义。
小技巧
在 WIC 中使用 bootloader 时,
应在 .wks.in 显式设置 --configfile="${DEPLOY_DIR_IMAGE}/extlinux.conf",
使用此类生成的配置。否则会生成默认 extlinux.conf,不考虑此类的设置。
6.172 uboot-sign
uboot-sign 支持 U-Boot 验证启动,应由 U-Boot 配方继承。
使用以下变量:
SPL_MKIMAGE_DTCOPTS:构建 FIT 时传给 U-Boot
mkimage的 DTC 选项。SPL_SIGN_ENABLE:启用 FIT 签名。
SPL_SIGN_KEYDIR:签名密钥目录。
SPL_SIGN_KEYNAME:签名密钥的文件名主体。
SPL_DTB_BINARY:SPL 设备树二进制文件名。 空字符串表示不创建 SPL,也不将其添加到 FIT。
UBOOT_FIT_ADDRESS_CELLS:FIT 的
#address-cells值。UBOOT_FIT_DESC:编码到 FIT 中的描述字符串。
UBOOT_FIT_GENERATE_KEYS:密钥不存在时生成。
UBOOT_FIT_HASH_ALG:FIT 哈希算法。
UBOOT_FIT_KEY_GENRSA_ARGS:
openssl genrsa参数。UBOOT_FIT_KEY_REQ_ARGS:
openssl req参数。UBOOT_FIT_SIGN_ALG:FIT 签名算法。
UBOOT_FIT_SIGN_NUMBITS:FIT 签名私钥大小。
UBOOT_FIT_KEY_SIGN_PKCS:FIT 签名公钥证书的算法。
UBOOT_FITIMAGE_ENABLE:启用 U-Boot FIT 生成。
UBOOT_MKIMAGE_DTCOPTS:重建包含内核的 FIT 时传给
mkimage的 DTC 选项。UBOOT_FIT_ARM_TRUSTED_FIRMWARE:在 FIT 中包含 Trusted Firmware-A(TF-A)。
UBOOT_FIT_ARM_TRUSTED_FIRMWARE_IMAGE:TF-A 二进制文件路径。
UBOOT_FIT_TEE:在 FIT 中包含可信执行环境(TEE)二进制文件。
UBOOT_FIT_TEE_IMAGE:TEE 二进制文件路径。
UBOOT_FIT_USER_SETTINGS:添加用户自定义的 U-Boot 镜像树源码(ITS)片段。
UBOOT_FIT_CONF_FIRMWARE:向配置节点的
firmware属性添加一个镜像。UBOOT_FIT_CONF_USER_LOADABLES:向配置节点的
loadables属性 添加一个或多个用户定义的镜像。
更多详情见 U-Boot 的 验证启动 和 签名过程 文档。
另请参阅此类所仿照的 kernel-fit-image。
6.173 uki
uki 支持
统一内核镜像(UKI)。
UKI 将内核、Initramfs、签名、元数据等组合为单个兼容 UEFI 固件的二进制文件。
此类应由根文件系统镜像配方继承。
构建配置还应使用 Initramfs,以 systemd-boot 提供启动菜单,
目标硬件必须支持 UEFI,建议以 systemd 作为初始化系统。
镜像构建应创建 UEFI 的 ESP 分区,并将 systemd-boot 和 UKI 复制到该分区。
Wic 示例配置见 meta/files/wic/efi-uki-bootdisk.wks.in。
UKI 使用 systemd 的参考实现
ukify 生成。
此类使用多个变量,并尽量提供合理默认值。
变量包括:
EFI_ARCH:EFI 标准中的架构名称,在 meta/conf/image-uefi.conf 设置。
IMAGE_EFI_BOOT_FILES:安装到
bootimg_efiWic 插件所创建 EFI 分区的文件。INITRAMFS_IMAGE:initramfs 配方名称。
KERNEL_DEVICETREE:可选的待嵌入设备树文件。
UKI_CMDLINE:UKI 使用的内核命令行。
UKI_CONFIG_FILE:可选的 ukify 配置文件。
UKI_FILENAME:UKI 输出文件名。
UKI_KERNEL_FILENAME:内核镜像文件名。
UKI_SB_CERT:可选的 UEFI Secure Boot 证书,应与私钥匹配。
UKI_SB_KEY:可选的 UKI 签名 UEFI Secure Boot 私钥。
UKI_DEVICETREE:要包含的设备树二进制文件列表。
用法示例见 oeqa 自测试 meta/lib/oeqa/selftest/cases/uki.py。 另有运行时测试 meta/lib/oeqa/runtime/cases/uki.py, 验证目标启动的 UKI 是否与构建时 UKI_FILENAME 指定的文件相同。
6.174 uninative
uninative 允许二进制程序在较旧或较新的 Glibc 系统上运行。 因此,native 配方的 共享状态缓存 可以跨不同主机发行版及版本共享,成为“通用”缓存。
为实现这一点,编译时通过 --dynamic-linker
将动态加载器改为我们自己的 ld.so。
程序执行时会找到它,再由其修改后的搜索路径找到较新版本的 Glibc。
链接时不改变二进制程序的链接对象,因为系统头文件与较新 Glibc 不匹配, 会导致难以理解的故障。替换加载器相当于程序编译后系统升级了 Glibc, 因此是上游支持的机制。
一个限制是,uninative Glibc 必须不旧于所有共享该缓存的系统上的版本。 因此,开发分支和稳定分支会定期更新 uninative。
另一个潜在问题是静态链接:在较新 Glibc 系统上创建的静态库, 可能使用旧版没有的符号,导致旧系统链接失败。 这也是 native 二进制程序不使用静态链接的原因之一。
启用后,构建开始时会下载包含预构建 C 库的压缩包。
OpenEmbedded-Core (OE-Core) 默认通过
meta/conf/distro/include/yocto-uninative.inc
启用。不是从 Poky 派生的发行版也可使用
require conf/distro/include/yocto-uninative.inc。
也可以自行构建 uninative-tarball 配方,发布压缩包,例如通过 HTTP,
再相应设置 UNINATIVE_URL 和 UNINATIVE_CHECKSUM。
示例同样见
meta/conf/distro/include/yocto-uninative.inc。
可扩展 SDK 无条件使用此类。
构建可扩展 SDK 时,会构建 uninative-tarball 并将生成的压缩包包含在 SDK 中。
6.175 update-alternatives
多个来源提供同名命令时,update-alternatives 辅助 alternatives 系统。
例如 busybox、binutils 和 elfutils 都可提供 ar。
此类重命名各包中的冲突二进制文件,使多个软件包可以同时安装而不冲突,
并在安装或卸载时将符号链接指向优先级最高的程序。
无论安装或移除了哪些包,ar 命令都能继续使用。
需要定义以下变量:
这些变量列出软件包需要的替代命令,提供链接路径、目标的默认链接等。 详情见 update-alternatives.bbclass 中的注释。
备注
也可以在配方中直接使用 update-alternatives 命令,
不过此类在多数情况下更简单。
6.176 update-rc.d
update-rc.d 使用 update-rc.d 为软件包安全安装初始化脚本。
构建系统处理卸载前停止服务、安装时启动服务等细节。
由 INITSCRIPT_PACKAGES、INITSCRIPT_NAME 和 INITSCRIPT_PARAMS 三个变量控制,详情见各变量说明。
6.177 upstream-stable-release-point
upstream-stable-release-point 为使用点分隔版本号的配方
自动生成 UPSTREAM_STABLE_RELEASE_REGEX,
支持限制在同一稳定系列内的点版本升级,
例如从 1.4.2 到 1.4.3,但不能到 1.5.0。
通过 STABLE_VERSION_PARTS (默认为 "2")确定
PV 开头多少个点分隔部分构成稳定前缀。例如:
PV = "1.4.2"且STABLE_VERSION_PARTS = "2"时, 生成^1\.4(\.\d+)*$。PV = "259.5"且STABLE_VERSION_PARTS = "1"时, 例如 systemd,生成^259(\.\d+)*$。
如果稳定版本部分不以点分隔,例如 openssh 的 10.2p1,
应直接设置 UPSTREAM_STABLE_RELEASE_REGEX,而不继承此类。
6.178 useradd*
useradd* 支持为目标上的软件包添加用户或组。 例如,系统服务应以专用用户或组运行时,可用这些类创建相应账户。 OpenEmbedded-Core (OE-Core) 中的 meta-skeleton/recipes-skeleton/useradd/useradd-example.bb 展示如何向两个软件包添加三个用户和组。
useradd_base 提供用户和组设置的基础功能。
这些类支持 USERADD_PACKAGES、USERADD_PARAM、 GROUPADD_PARAM 和 USERMOD_PARAM。
useradd-staticids 支持使用静态 uid 和 gid
添加用户或组。
默认情况下,软件包安装时动态分配 uid 和 gid。
如果程序不关心具体值,这种方式正常工作,最终值取决于安装顺序。
若不确定的 uid/gid 会造成问题,可改用静态值覆盖默认动态行为。
设置静态值后,构建系统沿 BBPATH 查找 files/passwd
和 files/group 获取对应值。
使用静态值时需要设置相关变量,见 USERADDEXTENSION、 USERADD_UID_TABLES、USERADD_GID_TABLES 和 USERADD_ERROR_DYNAMIC。 另请参阅 useradd*。
备注
不直接继承 useradd-staticids,而是通过 USERADDEXTENSION 启用或禁用。 在已经配置好的系统中切换后,TMPDIR 可能残留错误 uid/gid。 删除 TMPDIR 可纠正这种情况。
6.179 utility-tasks
utility-tasks 支持适用于所有配方的各类辅助任务, 例如 do_clean 和 do_listtasks。
由于 base 继承此类,默认已启用。
6.180 utils
utils 提供实用 Python 函数,通常用于 ${@...}
等内联表达式,例如 bb.utils.contains()。
由于 base 继承此类,默认已启用。
6.181 vala
vala 支持构建 Vala 语言编写的软件。
6.182 vex
vex 生成外部工具检查 CVE 等漏洞所需的元数据。
在 build/conf/local.conf 或发行版 configuration file
中继承后,会为每个配方添加 generate_vex 任务:
INHERIT += "vex"
构建镜像时,它在 DEPLOY_DIR_IMAGE 为全部所用软件包生成报告, 也为构建所用的全部配方生成文件。
用法示例:
bitbake -c generate_vex openssl
6.183 waf
waf 支持使用 Waf 构建系统的软件配方。 可通过 EXTRA_OECONF 或 PACKAGECONFIG_CONFARGS 指定传给 Waf 命令行的额外配置选项。
6.184 yocto-check-layer
yocto-check-layer 由 yocto-check-layer 脚本使用,确保 Yocto Project Compatible 层的软件包不会跳过 insane 在 CHECKLAYER_REQUIRED_TESTS 中列出的必需检查。
它向全部配方添加一个执行额外处理的匿名 Python 函数,
不建议通过 INHERIT 全局继承。
应使用 yocto-check-layer 脚本,由脚本管理此类。
有关兼容层的更多信息,请参阅《Yocto Project 开发手册》的 确保层与 Yocto Project 兼容 一节。