当前位置: 首页 > news >正文

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_DESTDIRSysroot目标目录${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}

编译工具链变量

变量名说明用途
CCC编译器命令编译C代码
CFLAGSC编译器标志优化/调试选项
CXXFLAGSC++编译器标志C++编译选项
CPPFLAGSC预处理器标志预处理选项
LDFLAGS链接器标志链接选项

高级控制变量

变量名说明用途
OVERRIDES变量覆盖机制条件变量设置
COMPATIBLE_MACHINE配方兼容的机器类型配方过滤
SYSROOT_DIRSSysroot存储目录系统配置

特殊变量说明

只读变量(不应修改)
  • 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 - 源码处理阶段

执行流程

  1. 配置源文件:配方必须首先通过 SRC_URI变量定义源文件获取方式
  2. do_fetch任务:根据配置获取源文件
  3. 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",则该任务不执行任何操作

配置选项来源

  1. 配方自定义:在配方文件中直接定义的配置选项
  2. 继承类:通过继承的类(如autotools、cmake等)提供的配置选项
  3. 自适应配置:软件根据目标平台自动进行的自我配置

各类构建系统的特殊配置变量

构建系统配置变量说明
AutotoolsEXTRA_OECONF额外配置选项
PACKAGECONFIG_CONFARGS功能配置参数
CMakeEXTRA_OECMAKE额外CMake选项
MesonEXTRA_OEMESON额外Meson选项

详细实现参考:base.bbclass、autotools.bbclass、cmake.bbclass、meson.bbclass等

这种任务解析模式同样适用于后续的 do_compile和 do_install`任务。

do_compile - 源代码编译

  • 执行环境:在当前工作目录 ${B}(构建目录)下运行
  • 默认行为
    • 如果找到构建文件(Makefile、makefile或GNUmakefile),则执行 oe_runmake函数
    • 如果未找到相关文件,该任务不执行任何操作

do_install - 文件安装

  • 执行环境:在当前工作目录 ${B}下运行,安装文件到保留区 ${D}
  • 权限管理:该任务及相关任务(do_packagedo_package_write_*do_rootfs)都在fakeroot环境下运行

文件安装最佳实践

为避免主机用户污染问题,推荐使用以下安全方法:

  1. install程序:首选方法,自动处理权限设置
  2. cp命令:使用 --no-preserve=ownership选项
  3. tar命令:使用 --no-same-owner选项

参考示例:meta/classes/bin_package.bbclass

系统集成任务

do_populate_sysroot - Sysroot填充

  • 功能:将 ${D}目录中的文件子集复制到 Sysroot
  • 处理流程
    1. 复制文件到 SYSROOT_DESTDIR目录
    2. 默认执行 strip 操作
    3. 拷贝到 ${COMPONENTS_DIR}/${PACKAGE_ARCH}/${PN}
  • 重要规则:配方不应直接写入 SYSROOT_DESTDIR,而应通过 do_install安装到 ${D}

do_package - 包分析拆分

  • 依据:根据 PACKAGESFILES_xxx变量分析 ${D}目录中的文件
  • 分配规则
    • 使用每个包对应的 FILES变量分配文件
    • 文件匹配多个包时,分配给最先(最左)的包
    • 空包不会生成(除非设置 ALLOW_EMPTY
  • 元数据管理:与 do_packagedata共同保存包元数据

do_packagedata - 包元数据保存

  • 功能:将包元数据保存在 PKGDATA_DIR目录中,供全局使用

包生成任务

do_package_write_* - 包格式生成

任务名称输出格式输出目录
do_package_write_rpmRPM包 (.rpm)${DEPLOY_DIR_RPM}
do_package_write_debDebian包 (.deb)${DEPLOY_DIR_DEB}
do_package_write_ipkIPK包 (.ipk)${DEPLOY_DIR_IPK}
do_package_write_tartar.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文件中可对全局配置进行适配(删减、附加、覆盖)
  • 解析时机限制includerequireinherit指令立即解析,必须在指令使用前确定变量值
示例说明
# bitbake.conf 中
include conf/local.conf
include ${MACHINE}.conf# local.conf 中
MACHINE = "qemux86-64"# test_directive.bb 中尝试覆盖
MACHINE = "test_machine"  # 无效!解析时仍使用 qemux86-64.conf

关键理解:全局配置在解析初期就已确定,局部覆盖无法影响已经解析的指令


接下来将带您逐步实现:

👉 立即点击关注,解锁嵌入式开发新技能!
👍 一键三连获取完整代码模板与构建加速技巧!
✨ 感谢您的支持,我们即刻启程!

http://www.dtcms.com/a/355657.html

相关文章:

  • Linux 系统 poll 与 epoll 机制1:实现原理与应用实践
  • DINOv2 vs DINOv3 vs CLIP:自监督视觉模型的演进与可视化对比
  • 传统set+new写法与Builder写法的区别
  • LightRAG
  • 客户案例 | 柳钢集团×甄知科技,燕千云ITSM打造智能服务新生态
  • 第1.9节:神经网络与深度学习基础
  • 基于matplotlib库的python可视化:以北京市各区降雨量为例
  • “今年业务是去年5倍以上”,工业智能体掀热潮
  • 拉普拉斯变换求解线性常系数微分方程
  • 数字接龙(dfs)(蓝桥杯)
  • npm install 安装离线包的方法
  • 【论文阅读】健全个体无辅助运动期间可穿戴传感器双侧下肢神经机械信号的基准数据集
  • 如何打造品牌信任护城河?
  • Spark入门:从零到能跑的实战教程
  • 腾讯云重保流程详解:从预案到复盘的全周期安全防护
  • ♻️旧衣回收小程序|线上模式新升级
  • 网页爬虫的实现
  • 苹果ImageIO零日漏洞分析:攻击背景与iOS零点击漏洞历史对比
  • 2025 深度洞察!晶圆背面保护膜市场全景调研与投资机遇解析
  • 推荐一款JTools插件Crypto
  • 基于Spring Session + Redis + JWT的单点登录实现
  • Redis使用简明教程
  • SQL 查询优化全指南:从语句到架构的系统性优化策略
  • 初识分布式事务
  • week5-[一维数组]归并
  • 数据结构与算法-算法-42. 接雨水
  • AI 如何 “看见” 世界?计算机视觉(CV)的核心技术:图像识别、目标检测与语义分割
  • Scrapy 框架实战:构建高效的快看漫画分布式爬虫
  • 试验铁地板在现代工业中的应用与特性
  • AI医疗影像诊断新突破:从肺部CT结节识别到眼底病变筛查,提升疾病早诊效率