openEuler Embedded 的 Yocto入门 : 5.基本变量与基本任务详解
任务是BitBake的执行单元,变量可能会对任务产生影响。本篇章介绍常用的变量与任务。
基本变量
系统配置变量
变量名 | 说明 | 典型配置位置 | 示例值 |
---|---|---|---|
MACHINE | 指定目标硬件平台配置 | local.conf | “qemux86-64” |
DISTRO | 指定发行版配置文件 | local.conf | “poky” |
TARGET_VENDOR | 目标供应商名称 | 层配置 | “-openeuler” |
TARGET_OS | 目标操作系统 | 层配置 | “linux” |
PACKAGE_CLASSES | 包管理器类型 | local.conf | “package_rpm” |
包标识变量
变量名 | 说明 | 自动生成规则 | 示例 |
---|---|---|---|
PN | 软件包名称 | 从配方文件名提取 | hello_1.0.bb → “hello” |
PV | 软件包版本 | 从配方文件名提取 | hello_1.0.bb → “1.0” |
PR | 配方修订版本 | 默认为"r0" | “r0”, “r1” |
BPN | 基础包名 | 去除前后缀(-native/-cross等) | gcc-cross → “gcc” |
BP | 完整基础包名 | BPN−{PV} | “hello-1.0” |
源码与许可管理
变量名 | 说明 | 必需性 | 示例 |
---|---|---|---|
SRC_URI | 源码获取路径 | 必需 | “http://example.com/src.tar.gz” |
LICENSE | 软件许可证类型 | 必需 | “MIT”, “GPL-2.0” |
LIC_FILES_CHKSUM | 许可证文件校验和 | 推荐 | “” |
构建路径变量
变量名 | 说明 | 默认指向 |
---|---|---|
WORKDIR | 配方工作目录 | TMPDIR/work/{TMPDIR}/work/TMPDIR/work/{MULTIMACH_TARGET_SYS}/PN/{PN}/PN/{EXTENDPE}PV−{PV}-PV−{PR} |
S | 源代码目录 | WORKDIR/{BPN}-${PV} |
B | 构建输出目录 | 同S一样 或${WORKDIR}/build |
D | 安装目标目录 | ${WORKDIR}/image |
PKGD | 打包文件目录 | ${WORKDIR}/package |
PKGDEST | 分包后文件目录 | ${WORKDIR}/packages-split |
系统标识变量
变量名 | 说明 | 计算公式 |
---|---|---|
MULTIMACH_TARGET_SYS | 目标系统唯一标识 | PACKAGEARCH{PACKAGE_ARCH}PACKAGEARCH{TARGET_VENDOR}-${TARGET_OS}; |
PACKAGE_ARCH | 包体系结构 | 根据MACHINE自动设置 |
依赖管理变量
变量名 | 说明 | 类型 |
---|---|---|
DEPENDS | 构建时依赖 | 配方间依赖 |
RDEPENDS | 运行时依赖 | 包间依赖 |
Sysroot相关变量
变量名 | 说明 | 默认指向 |
---|---|---|
RECIPE_SYSROOT | 目标系统sysroot | ${WORKDIR}/recipe-sysroot |
RECIPE_SYSROOT_NATIVE | 本地系统sysroot | ${WORKDIR}/recipe-sysroot-native |
SYSROOT_DESTDIR | Sysroot目标目录 | ${WORKDIR}/sysroot-destdir |
STAGING_DIR_HOST | 主机sysroot路径 | ${RECIPE_SYSROOT} |
STAGING_DIR_NATIVE | 本地sysroot路径 | ${RECIPE_SYSROOT_NATIVE} |
STAGING_KERNEL_DIR | 内核头文件目录 | 内核源码目录 |
STAGING_KERNEL_BUILDDIR | 内核构建工件目录 | 内核构建目录 |
镜像构建变量
变量名 | 说明 | 作用范围 |
---|---|---|
IMAGE_FEATURES | 镜像功能特性列表 | 全局/镜像级 |
EXTRA_IMAGE_FEATURES | 额外镜像功能 | 镜像级 |
IMAGE_INSTALL | 镜像中安装的包列表 | 镜像级 |
PACKAGE_EXCLUDE | 排除不安装的包 | 镜像级 |
PACKAGE_INSTALL | 要安装的包列表(只读) | 系统内部 |
部署目录变量
变量名 | 说明 | 默认指向 |
---|---|---|
DEPLOY_DIR | 部署文件根目录 | ${TMPDIR}/deploy |
DEPLOY_DIR_IMAGE | 镜像部署目录 | DEPLOYDIR/images/{MACHINE} |
DEPLOYDIR | 临时部署工作区 | WORKDIR/deploy−{PN} |
编译工具链变量
变量名 | 说明 | 用途 |
---|---|---|
CC | C编译器命令 | 编译C代码 |
CFLAGS | C编译器标志 | 优化/调试选项 |
CXXFLAGS | C++编译器标志 | C++编译选项 |
CPPFLAGS | C预处理器标志 | 预处理选项 |
LDFLAGS | 链接器标志 | 链接选项 |
高级控制变量
变量名 | 说明 | 用途 |
---|---|---|
OVERRIDES | 变量覆盖机制 | 条件变量设置 |
COMPATIBLE_MACHINE | 配方兼容的机器类型 | 配方过滤 |
SYSROOT_DIRS | Sysroot存储目录 | 系统配置 |
特殊变量说明
只读变量(不应修改)
IMAGE_ROOTFS
: 根文件系统位置(do_rootfs任务期间)PACKAGE_INSTALL
: 要安装到镜像中的程序包列表
目录结构变量
# 典型工作目录结构
WORKDIR/
├── ${BPN}-${PV}/ # S - 源代码目录
├── build/ # B - 构建目录(可选)
├── image/ # D - 安装目录
├── package/ # PKGD - 打包目录
└── packages-split/ # PKGDEST - 分包目录
多机器目标系统
MULTIMACH_TARGET_SYS
是构建系统中的关键标识符,用于区分不同目标系统的工件,确保交叉编译的正确性。
注意: 此参考手册基于Yocto Project 4.0+版本,部分变量行为可能在不同版本间有所差异。
基本任务
配方(.bb文件)使用任务来完成软件的配置、编译和打包等。本节提供了在OpenEmbedded(Yocto)构建系统中定义的任务的参考。
Yocto支持的主要任务如下:
任务执行顺序查看
每个包的实际任务执行顺序记录在工作目录下的文件中:
$WORKDIR/temp/log.task_order
核心任务解析
do_build - 默认任务
- 性质:配方的主任务,依赖于所有其他正常构建任务
- 特殊设置:在 meta/classes/base.bbclass中配置了 do_build[noexec] = “1”
- 实际作用:作为虚拟任务,用于协调和串联各个模块的任务流程
- 构建表现:temp目录下不会生成对应的执行脚本和日志文件
do_fetch / do_unpack - 源码处理阶段
执行流程
- 配置源文件:配方必须首先通过 SRC_URI变量定义源文件获取方式
- do_fetch任务:根据配置获取源文件
- do_unpack任务:将获取的源文件解压到工作目录 ${WORKDIR}
目录结构
- 工作目录采用统一的标准结构
- 支持两种主要层次结构:
- 基于包架构(PACKAGE_ARCH)
- 基于目标机器(MACHINE)
- 底层结构一致,区别仅在于构建目标类型:
- 通用架构构建
- 构建主机环境
- SDK开发工具包
- 特定机器目标
源文件获取机制
- SRC_URI变量:定义源码位置和获取方式
- file://前缀:本地文件
- http://、git://等前缀:从上游获取源文件
- 路径搜索规则:
- 使用 FILESPATH变量扫描本地文件路径
- 如需添加新路径,应通过 FILESEXTRAPATHS变量扩展,而非直接修改 FILESPATH
重要提示
成功解压源文件后,需确保 ${S}目录与源码结构匹配:
- 如果从标准tarball获取源码,且其内部结构符合 BPN−{BPN}-BPN−{PV}命名约定,则无需设置 S变量
- 如果使用非标准tarball或从Git/Subversion等SCM获取源码,则需要在配方中明确定义 S变量
详细配置请参考:meta/classes/base.bbclass
do_patch - 补丁应用任务
功能描述
do_patch任务在获取和解压源码后,将补丁文件应用到源码目录(${S})中。补丁应用顺序由 SRC_URI变量中文件的排列顺序决定。
补丁识别规则
- 文件扩展名:所有以 .patch或 .diff结尾的文件(包括压缩版本如 .diff.gz)
- 显式标记:任何添加了 ;apply=yes参数的文件也会被视为补丁
配置示例
SRC_URI += " \file://file1.patch \file://file;apply=yes \file://file2.patch;apply=no \"
注意:补丁的应用位置可以进行自定义设置。
详细实现参考:meta/classes/patch.bbclass
do_prepare_recipe_sysroot - Sysroot准备任务
功能描述
配方构建过程中需要访问其他配方提供的文件(如依赖库和头文件)。该任务通过填充sysroot来实现这种访问机制。
Sysroot类型
每个配方在工作目录中包含两个sysroot:
- 目标文件sysroot (recipe-sysroot):用于目标系统的文件
- 本地文件sysroot (recipe-sysroot-native):用于构建主机的本地工具
依赖处理机制
根据 DEPENDS变量指定的依赖关系,将依赖包执行 do_populate_sysroot任务后产生的文件安装到当前配方的特定sysroot目录中:
- ${RECIPE_SYSROOT}- 目标系统sysroot路径
- ${RECIPE_SYSROOT_NATIVE}- 本地工具sysroot路径
详细实现参考:meta/classes/staging.bbclass
do_configure - 源码配置任务
执行环境
该任务在当前工作目录设置为 ${B}(构建目录)的情况下运行。
默认行为
- 存在Makefile时:如果发现Makefile(Makefile、makefile或GNUmakefile)且 CLEANBROKEN未设置为"1",则默认执行 oe_runmake clean
- 无Makefile时:如果未找到相关文件或 CLEANBROKEN设置为"1",则该任务不执行任何操作
配置选项来源
- 配方自定义:在配方文件中直接定义的配置选项
- 继承类:通过继承的类(如autotools、cmake等)提供的配置选项
- 自适应配置:软件根据目标平台自动进行的自我配置
各类构建系统的特殊配置变量
构建系统 | 配置变量 | 说明 |
---|---|---|
Autotools | EXTRA_OECONF | 额外配置选项 |
PACKAGECONFIG_CONFARGS | 功能配置参数 | |
CMake | EXTRA_OECMAKE | 额外CMake选项 |
Meson | EXTRA_OEMESON | 额外Meson选项 |
详细实现参考:base.bbclass、autotools.bbclass、cmake.bbclass、meson.bbclass等
这种任务解析模式同样适用于后续的 do_compile和 do_install`任务。
do_compile - 源代码编译
- 执行环境:在当前工作目录
${B}
(构建目录)下运行 - 默认行为:
- 如果找到构建文件(Makefile、makefile或GNUmakefile),则执行
oe_runmake
函数 - 如果未找到相关文件,该任务不执行任何操作
- 如果找到构建文件(Makefile、makefile或GNUmakefile),则执行
do_install - 文件安装
- 执行环境:在当前工作目录
${B}
下运行,安装文件到保留区${D}
- 权限管理:该任务及相关任务(
do_package
、do_package_write_*
、do_rootfs
)都在fakeroot环境下运行
文件安装最佳实践
为避免主机用户污染问题,推荐使用以下安全方法:
- install程序:首选方法,自动处理权限设置
- cp命令:使用
--no-preserve=ownership
选项 - tar命令:使用
--no-same-owner
选项
参考示例:meta/classes/bin_package.bbclass
系统集成任务
do_populate_sysroot - Sysroot填充
- 功能:将
${D}
目录中的文件子集复制到 Sysroot - 处理流程:
- 复制文件到
SYSROOT_DESTDIR
目录 - 默认执行 strip 操作
- 拷贝到
${COMPONENTS_DIR}/${PACKAGE_ARCH}/${PN}
- 复制文件到
- 重要规则:配方不应直接写入
SYSROOT_DESTDIR
,而应通过do_install
安装到${D}
do_package - 包分析拆分
- 依据:根据
PACKAGES
和FILES_xxx
变量分析${D}
目录中的文件 - 分配规则:
- 使用每个包对应的
FILES
变量分配文件 - 文件匹配多个包时,分配给最先(最左)的包
- 空包不会生成(除非设置
ALLOW_EMPTY
)
- 使用每个包对应的
- 元数据管理:与
do_packagedata
共同保存包元数据
do_packagedata - 包元数据保存
- 功能:将包元数据保存在
PKGDATA_DIR
目录中,供全局使用
包生成任务
do_package_write_* - 包格式生成
任务名称 | 输出格式 | 输出目录 |
---|---|---|
do_package_write_rpm | RPM包 (.rpm) | ${DEPLOY_DIR_RPM} |
do_package_write_deb | Debian包 (.deb) | ${DEPLOY_DIR_DEB} |
do_package_write_ipk | IPK包 (.ipk) | ${DEPLOY_DIR_IPK} |
do_package_write_tar | tar.gz包 | ${DEPLOY_DIR_TAR} |
do_package_qa - 质量检查
- 功能:对打包文件运行QA检查,检测和报告常见问题
- 建议:应解决所有报告的QA问题,而非忽略或禁用检查
- 参考:
poky/documentation/ref-manual/qa-checks.rst
部署与镜像任务
do_deploy - 文件部署
- 输出位置:将文件写入
${DEPLOY_DIR_IMAGE}
- 最佳实践:
- 继承
deploy
类 - 输出写入
${DEPLOYDIR}
(非${DEPLOY_DIR}
) - 避免直接写入
${DEPLOY_DIR_IMAGE}
- 继承
do_rootfs - 根文件系统创建
- 功能:为镜像创建根文件系统结构
- 参考:
meta/classes/image.bbclass
do_image / do_image_complete - 镜像生成
- 处理流程:
do_image
:启动生成过程,执行预处理命令do_image_complete
:完成生成过程,执行后处理命令
- 参考:
meta/classes/image.bbclass
配置作用域详解
全局配置与局部配置
配置类型 | 定义位置 | 生效范围 | 解析影响 |
---|---|---|---|
全局配置 | bblayers.conf, layer.conf, bitbake.conf, .bbclass | 所有配方 | 修改后需重新解析(耗时) |
局部配置 | 单个 .bb文件 | 仅当前配方 | 快速生效 |
变量覆盖限制
- 局部可修改:在bb文件中可对全局配置进行适配(删减、附加、覆盖)
- 解析时机限制:
include
、require
、inherit
指令立即解析,必须在指令使用前确定变量值
示例说明
# bitbake.conf 中
include conf/local.conf
include ${MACHINE}.conf# local.conf 中
MACHINE = "qemux86-64"# test_directive.bb 中尝试覆盖
MACHINE = "test_machine" # 无效!解析时仍使用 qemux86-64.conf
关键理解:全局配置在解析初期就已确定,局部覆盖无法影响已经解析的指令
接下来将带您逐步实现:
👉 立即点击关注,解锁嵌入式开发新技能!
👍 一键三连获取完整代码模板与构建加速技巧!
✨ 感谢您的支持,我们即刻启程!