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

Yocto项目实战教程 · 第4章:4.2小节-菜谱

🔍

B站相应的视频教程
📌 Yocto项目实战教程-第4章-4.2小节-菜谱
记得三连,标为原始粉丝。




在 Yocto 项目中,**菜谱(Recipe)**承载了包的配置信息、源码获取方式、编译与安装步骤,是将上游软件集成进嵌入式镜像的核心。本文从概念、结构、语法、示例到调试与最佳实践,系统梳理菜谱的作用和使用方法,帮助读者在 Yocto 构建系统中精准、高效地编写与维护菜谱。


在这里插入图片描述

一、菜谱概念

  • 定义:菜谱是一个后缀为 .bb.bbappend 的文本文件,以 BitBake 为引擎,描述如何获取、编译、打包、安装某个软件。
  • 职责
    1. 指定源码位置(SRC_URI)及校验(SRC_URI[sha256sum]);
    2. 定义依赖关系(DEPENDSRDEPENDS_${PN});
    3. 描述构建和安装步骤(do_compiledo_install 等);
    4. 配置包名、版本号、许可证等元数据。
  • 存放位置:通常放在各层(Layer)的 recipes-xxx/xxx/ 目录下,如 meta-myapp/recipes-example/helloworld/helloworld_1.0.bb

二、菜谱文件结构

一个典型的 .bb 文件可分为以下几个部分:

DESCRIPTION = "示例 HelloWorld 程序"
LICENSE     = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE;md5=abcdef123456..."SRC_URI = "git://example.com/helloworld.git;branch=main \file://extra-config.patch"SRCREV = "${AUTOREV}"
PV     = "1.0+git${SRCPV}"DEPENDS = "glibc"
RDEPENDS_${PN} = "bash"inherit autotools pkgconfigdo_install_append() {install -d ${D}${bindir}install -m 0755 helloworld ${D}${bindir}
}
  1. 元数据段
    • DESCRIPTIONLICENSELIC_FILES_CHKSUM:描述包内容、许可证及校验;
    • PV(包版本)、PR(发行号)等;
  2. 源码定义段
    • SRC_URI:源码地址,可支持 git://http://file:// 等;
    • SRCREV / SRCPV:用于确定 Git 提交版本;
  3. 依赖声明段
    • DEPENDS:构建时依赖的菜谱列表;
    • RDEPENDS_${PN}:运行时依赖的包;
  4. 继承类声明
    • inherit autotools:自动调用 configure/make/make install
    • inherit pkgconfig:生成 pkg-config 文件支持;
  5. 任务定义与扩展
    • do_compiledo_install:默认构建与安装步骤;
    • do_install_append():在 do_install 后追加自定义命令;

三、常见菜谱类型

  1. 源代码菜谱 (.bb)
    • 集成第三方开源软件。如 curl_7.88.1.bb
  2. 追加菜谱 (.bbappend)
    • 对已有菜谱做补丁或覆盖。放入 meta-my-layer/recipes-xxx/foo/foo_%.bbappend
  3. 包组菜谱 (packagegroup-*.bb)
    • 一次性安装一组相关包,如 packagegroup-core-ssh-openssh.bb
  4. 镜像菜谱 (image.bb)
    • 定义最终镜像中要包含的包,如 core-image-minimal.bb

四、核心语法要点

语法元素作用
${S}, ${B}源码目录、构建目录变量
${D}, ${PKGDATA_DIR}安装目标根目录、数据目录
S = "${WORKDIR}/git"指定源码实际解压位置
BB_NO_NETWORK = "0"允许在构建时联网下载
PACKAGE_ARCH指定包目标架构
EXTRA_OEMAKE传递给 make 的额外参数
BBCLASSEXTEND = "native"生成两个变体:native(宿主)与目标体系结构

五、实例演示:HelloWorld 菜谱

SUMMARY = "HelloWorld Demo"
DESCRIPTION = "一个简单的 HelloWorld 应用示例"
SECTION = "examples"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE;md5=abcdef123456"SRC_URI = "git://github.com/example/helloworld.git;branch=main"
SRCREV = "abcdef1234567890abcdef1234567890abcdef12"inherit autotoolsdo_install() {install -d ${D}${bindir}install -m 0755 helloworld ${D}${bindir}
}
  1. 克隆源码
  2. 自动执行 ./configuremake
  3. 在安装阶段,将编译生成的可执行文件拷贝到镜像 /usr/bin 目录

Tips:在本地调试时,可通过 bitbake -c devshell helloworld 进入源代码目录,手动运行构建命令。


六、高级特性

  1. 继承自定义类
    • 自定义 myclass.bbclass,将通用函数、变量抽象出来;
    • 在菜谱中 inherit myclass,复用逻辑。
  2. .bbappend 补丁机制
    • 对不上游菜谱进行行为定制或 BUG 修复;
    • 文件命名需保持和原菜谱相同的版本表达式。
  3. 多架构支持
    • 使用 COMPATIBLE_MACHINE 限定机器;
    • 使用条件语句 python __anonymous() 在特定机器上调整参数。
  4. 动态依赖与变量
    • DEPENDS += "libfoo-native":在运行时再追加依赖;
    • python __anonymous() / BB_ENV_EXTRAWHITE:动态生成变量。

七、BitBake 解析流程

  1. 元数据加载:扫描所有层中 .bb.bbappend
  2. 任务依赖分析:根据 DEPENDSRDEPENDS 构建 DAG;
  3. 任务执行:按顺序执行 do_fetchdo_unpackdo_patchdo_configuredo_compiledo_install
  4. 包打包:生成 .ipk/.deb/.rpm
  5. 镜像组装:将所选包放入根文件系统,生成最终镜像。

八、菜谱编写与调试工作流

  1. 创建菜谱
    • 执行 bitbake-layers create-layer meta-myapp
    • recipes-myapp/myapp/ 新建 myapp_1.0.bb
  2. 本地测试
    • bitbake -c fetch myappbitbake -c devshell myapp → 手动调试;
    • bitbake myapp 完整构建并查看日志 (tmp/work/.../temp/log.*);
  3. 增量修改
    • 修改 .bb 后执行 bitbake -c cleanall myapp && bitbake myapp
  4. 日志分析
    • 查看 temp/log.do_compiletemp/log.do_install,定位错误;
  5. 优化与重用
    • 抽象公共逻辑进 .bbclass
    • 将常用补丁与配置整理到 meta-myapp/recipes-support/

九、最佳实践

  • 统一版本表达PV = "1.0+git${SRCPV}",确保每次桥接最新提交;
  • 最小依赖原则:仅在 DEPENDS 中声明编译时必需的库;
  • 补丁管理:将补丁按功能命名,如 fix-crash.patch,并维护 series 文件记录;
  • 变量注释:对自定义变量要添加注释,提升可读性;
  • 遵循 Yocto 社区规范:变量命名、层结构与官方保持一致,便于后期合并官方更新。

十、总结

菜谱是 Yocto 项目中最关键的元数据单元,通过对菜谱结构和语法的深入理解,结合实例调试与最佳实践,能够快速集成、定制上游软件,实现高效、可维护的嵌入式 Linux 镜像构建流程。希望本文所述内容,有助于你在实际项目中编写更精准、清晰、健壮的菜谱。


🔍

B站相应的视频教程
📌 Yocto项目实战教程-第4章-4.2小节-菜谱
记得三连,标为原始粉丝。


相关文章:

  • 「GitHub热榜」AIGC系统源码:AI问答+绘画+PPT+音乐生成一站式
  • GreatSQL启动崩溃:jemalloc依赖缺失问题排查
  • ReAct、CoT 和 ToT:大模型提示词推理架构的对比分析
  • windwos脚本 | 基于scrcpy,只投声音、只投画面
  • DNS解析失败怎么解决?
  • 基于 S2SH 架构的企业车辆管理系统:设计、实现与应用
  • 深入理解synchronized
  • Linux和Ubuntu的驱动适配情况
  • Python 程序打包为可执行应用程序:从单文件到工程项目
  • Linux 系统编程 day4 进程管道
  • 【ubuntu】在Linux Yocto的基础上去适配Ubuntu的wifi模块
  • 环境搭建与入门:Flutter SDK安装与配置
  • Flutter 自定义插件基础
  • 微信小程序的全局变量(quanjubianliang)
  • ESORICS 2025截稿延期
  • 悟空CRM系统部署+迁移
  • Android device PCO (protocol configuration options) intro
  • 学习型组织与系统思考
  • QT调用ffmpeg库实现视频录制
  • Spring Boot配置文件优先级全解析:如何优雅覆盖默认配置?
  • 上海汽车贸易有限公司原总经理王璟接受监察调查
  • 云南昭通黄吉庆寻子29年终团聚:儿子在同事鼓励下回乡认亲
  • 特斯拉一季度净利下滑七成,马斯克表态将继续倡导关税下调
  • 宫崎骏电影《幽灵公主》4K修复版定档五一
  • 港澳航天员最早2026年飞天
  • 对话|四代中国缘的麦肯锡前高管:在混乱中制定规则,而不是复制旧秩序