当前位置: 首页 > 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小节-菜谱
记得三连,标为原始粉丝。


http://www.xdnf.cn/news/9631.html

相关文章:

  • AWS Elastic Beanstalk的部署Python Flask后端服务(Hello,World)
  • JavaScript 性能优化实战
  • 决战浏览器渲染:减少重绘(Repaint)与重排(Reflow)的性能优化策略
  • 基于springBoot+vue的PC 端学习系统(源码+lw+部署文档+讲解),源码可白嫖!
  • C++ AVL树
  • HAL库通过FATFS和SDIO+DMA写入SD卡数据错误
  • 2025MathorcupD题 短途运输货量预测及车辆调度问题 保姆级教程讲解|模型讲解
  • L2-006 树的遍历
  • DHTMLX宣布推出支持 Redux、TypeScript 和 MUI 的 React Gantt甘特图控件
  • redis利用备忘录
  • Jsp技术入门指南【五】详细讲解jsp结构页面
  • 【含文档+PPT+源码】基于Python爬虫二手房价格预测与可视化系统的设计与实现
  • 论文阅读:2024 arxiv AI Safety in Generative AI Large Language Models: A Survey
  • 自然语言处理入门7——注意力机制
  • 数据结构——顺序表(C语言实现)
  • [250418] 智谱 AI 发布新一代模型,同时推出新域名 Z.ai
  • yocto编译使用共享缓存
  • IntelliSense 已完成初始化,但在尝试加载文档时出错
  • 前端单元测试实战:如何开始?
  • Vue2+Vue3 130~180集学习笔记
  • Google Colab测试部署Qwen大模型,实现PDF转MD场景OCR 识别(支持单机环境)
  • 迭代器模式:统一不同数据结构的遍历方式
  • ctf.show—Web(1-10)详细通关教程
  • 2025年行业AI Agent选型专业指南
  • RT-Thread RTThread studio 初使用
  • 零基础玩转AI数学建模:从理论到实战
  • LINUX学习——守护进程的含义及编程实现
  • Function Calling的机制 (含示例)
  • Sqlite3交叉编译全过程
  • 2025妈妈杯数学建模B题完整分析论文