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.mzph.cn/diannao/79947.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【pytorch】torch.nn.Unfold操作

说明 一个代码里涉及到了unfold的操作,看了半天官网都没整明白维度怎么变化的,参考这个链接搞明白了: https://blog.csdn.net/ViatorSun/article/details/119940759 https://zhuanlan.zhihu.com/p/361140988 维度计算 输入( N,…

Linux 固定IP地址

一.查看网口状态: $ ip a 二.配置静态IP文件: $ sudo vi /etc/network/interface auto eth0 iface eth0 inet static address 192.168.0.252 gateway 192.168.0.1 netmask 255.255.255.0 #network 192.168.0.0 #broadcast 192.168.0.255 三.重启网卡让新…

android的 framework 有哪些知识点和应用场景

Android Framework 知识点 1. 四大组件 Activity(活动) 是 Android 应用中最基本的组件,用于实现用户界面。一个 Activity 通常对应一个屏幕的内容。有自己的生命周期,包括 onCreate、onStart、onResume、onPause、onStop、onDe…

如何在PDF.js中改造viewer.html以实现PDF的动态加载

在PDF.js中改造viewer.html实现PDF动态加载,需结合参数传递、文件流处理及跨域配置等技术。以下是综合多个技术方案的核心实现步骤: ​一、基础参数传递法​ 1. ​URL参数动态加载​ 通过修改viewer.html的URL参数传递PDF路径,适用于静态文…

组件之间的数据通信方式

Vue 的传值方式(即组件之间的数据通信方式)根据组件关系不同(父子、兄弟、跨层级)有所区别。下面是常见的传值方式,按使用场景来分类: 一、父子组件传值 1. props(父 -> 子) 父…

组件是怎样写的(1):虚拟列表-VirtualList

本篇文章是《组件是怎样写的》系列文章的第一篇,该系列文章主要说一下各组件实现的具体逻辑,组件种类取自 element-plus 和 antd 组件库。 每个组件都会有 vue 和 react 两种实现方式,可以点击 https://hhk-png.github.io/components-show/ …

个性化的配置AndroidStudio

Android Studio 提供诸多向导和模板,可用于验证 Java 开发套件 (JDK) 和可用 RAM 等系统要求,以及配置默认设置,例如经过优化的默认 Android 虚拟设备 (AVD) 模拟和更新的系统映像。本文档介绍了可用于自定义 Android Studio 使用方式的其他配…

人类行为的原动力是自我保存-来自ChatGPT

自我保存(Self-Preservation)确实可以说是人类行为最原始、最底层的驱动力。 简单来说: 无论我们做什么,表面看动机五花八门,实际上归根到底都绕不开活下去、保护自己。 💡 从不同层面理解这个观点&#…

SystemVerilog语法之内建数据类型

简介:SystemVerilog引进了一些新的数据类型,具有以下的优点:(1)双状态数据类型,更好的性能,更低的内存消耗;(2)队列、动态和关联数组,减少内存消耗…

蓝光三维扫描技术:高效精密测量相机镜头底座注塑件

如今越来越多的摄影爱好者、vlog拍摄者使用数码相机以及无人机,随时随地记录生活中的每一刻美好瞬间,对相机设备的要求也不断提高。 — 案例背景 — 相机镜头底座涉及镜头装置可靠、螺丝位置度连接以及壳体组装,镜头底座注塑件生产厂商&…

【前端】【面试】【业务场景】前端如何获取并生成设备唯一标识

✅ 总结 问题:前端如何获取并生成设备唯一标识? 核心要点:浏览器原生信息有限,但通过组合多个维度可生成设备指纹(Device Fingerprint),用于唯一标识设备。 常见方式: 浏览器信息&…

极刻AI搜v1.0 问一次问题 AI工具一起答

软件名:极刻AI搜 版本:v1.0 功能:囊括了互联网上比较好用的一些支持”搜索“的网站或者工具 开发平台:nodepythonweb 分类有: AI搜索(支持智能问答的AI搜索引擎) 常规搜索:&#xff…

《2025最新Java面试题全解析:从基础到高并发架构设计》

25年Java开发者面试中最常考察的100道面试题,涵盖Java基础、JVM、多线程、Spring框架、分布式系统等核心知识点,并结合大厂真实面试案例进行深度解析,助你顺利通过技术面试。 一、Java基础篇(高频15问) 1. HashMap底层…

[c语言日寄]免费文档生成器——Doxygen在c语言程序中的使用

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还是…

51c嵌入式~单片机~合集5~DMA

我自己的原文哦~ https://blog.51cto.com/whaosoft/12940885 一、DMA DMA,全称Direct Memory Access,即直接存储器访问。 DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输…

Linux随记(十七)

一、综合报错:fork: Cannot allocatte memory 和 modues is unknwon 和 pam_limits(crond:session) : unknwon limit item ‘noproc’ 1.1 fork: Cannot allocatte memory 处理 - 随记 排查时间2025年4月。 环境描述: 2014年左右的服务器,…

支持mingw g++14.2 的c++23 功能print的vscode tasks.json生成调试

在mingw14.2版本中, print库的功能默认没有开启, 生成可执行文件的tasks.json里要显式加-lstdcexp, 注意放置顺序. tasks.json (支持mingw g14.2 c23的print ) {"version": "2.0.0","tasks": [{"type": "cppbuild","…

赋能能源 | 智慧数据,构建更高效智能的储能管理系统

行业背景 随着新能源产业的快速发展,大规模储能系统在电力调峰、调频及可再生能源消纳等领域的重要性日益凸显。 储能电站作为核心基础设施,其能量管理系统(EMS)需要处理海量实时数据,包括电池状态、功率变化、环境监…

使用 Flutter 遇坑小计

前言 首先, 谷哥很贴心地为国内用户准备了一份使用手册 不过很遗憾 就算你照着它的手册来了, 还是会在后续使用中遇到其它的坑 今天我踩了, 保不齐明天就是其他人(lol) running gradle task ‘assembledebug’ stuck 首先去确定下当下Android Studio(或者说你目前的Flutter项…

链表与文件

链表 单链表 1.链表的初始化 typedef struct node {char name[100];int number;struct node *next; }Node,*LinkList;}Node;2.链表的初始化函数(Initlist) LinkList InitList() {LinkList head;head(Node*)malloc(sizeof(Node));head->nextNULL;return head; }3.建立链…