ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

yocto: 14-product

yocto: 14-product 第4课如果前面你已经完成了 meta-myhello那么下一步学习 创建自己的产品 Layermeta-myproduct 就是 Yocto 开发真正的开始。建议这一课的目标不要只是会创建 Layer而是理解为什么要把 Board(BSP)、Application、Product 分开。第4课创建 meta-myproduct掌握 Layer学习目标完成本课后你应该能够回答- 什么是 Layer - 为什么需要多个 Layer - 如何创建自己的 Layer - 如何让 BitBake 找到它 - Layer 里面一般放什么一、为什么需要 Layer假设没有 Layer。你的工程可能长这样poky ├── recipes-core ├── recipes-kernel ├── recipes-devtools ├── recipes-myapp ├── recipes-network ├── recipes-image ├── recipes-product...几年以后…… 几千个 recipe没人知道哪个是谁写的。所以 Yocto 提出了把不同职责放到不同 Layer。例如meta-openembedded例如第三方软件-vim- python - nginx例如meta-raspberrypi 树莓派 BSP包括kernel bootloader firmware machine例如meta-myhello负责学习实验hello.bb network-config.bb而真正公司开发会有meta-myproduct里面放产品配置 产品 image 产品 package 产品service产品配置文件一个典型项目poky/|├── meta|├── meta-poky|├── meta-openembedded|├── meta-raspberrypi ├── meta-myhello └── meta-myproduct职责非常清楚官方 第三方 BSP 自己的产品二、创建Layer进入工程目录cd~/yocto/pokysourceoe-embedded-init../build-rpi2执行bitbake-layers create-layer …/meta-myproductbitbake-layers add-layer …/meta-myproduct得到meta-myproduct/ ├── conf │ └── layer.conf ├── COPYING.MIT └── README|__ recopes-examples|_example|_example_0.1.bb看一下 layer.confmeta-myproduct └── conf └── layer.conf内容类似BBPATH .:${LAYERDIR}BBFILES${LAYERDIR}/recipes-*/*/*.bb \${LAYERDIR}/recipes-*/*/*.bbappendBBFILE_COLLECTIONSmyproductBBFILE_PATTERN_myproduct^${LAYERDIR}/BBFILE_PRIORITY_myproduct6LAYERDEPENDS_meta-myproductcoreLAYERSERIES_COMPAT_meta-myproductscarthgap这里最重要的是BBFILES告诉 BitBake去哪里找 recipe。例如recipes-//*.bb就是recipes-core/foo/foo.bbrecipes-app/bar/bar.bbrecipes-network/test/test.bb都会被找到。BBFILE_PRIORITYLayer 优先级。例如Layer priority meta5meta-myproduct6如果两个 Layer 都有busybox.bbappend优先使用priority 更高三、加入 bblayers.conf创建 Layer 不代表 BitBake 会使用。还需要build/conf/bblayers.conf加入BBLAYERS \ /home/user/yocto/poky/meta-myproduct \ 或者bitbake-layers add-layer …/meta-myproduct推荐第二种。执行bitbake-layers add-layer …/meta-myproduct查看bitbake-layers show-layers例如layer priority meta5meta-poky5meta-oe6meta-raspberrypi9meta-myhello6meta-myproduct6说明Layer 已经成功加入。四、Layer 一般放什么一个产品 Layer 常见结构meta-myproduct ├── conf ├── recipes-core ├── recipes-app ├── recipes-images ├── recipes-connectivity ├── recipes-kernel └── recipes-support例如recipes-app/放自己的程序例如camera webserver logger upgraderecipes-images放自己的 image例如myproduct-image.bbrecipes-core放配置文件service启动脚本五、做一个实验在 meta-myproduct 下创建一个新的 recipemeta-myproduct/ └── recipes-test └── product-test ├── product-test.bb └── product-test.shproduct-test.sh#!/bin/shechoHello from meta-myproduct!product-test.bbSUMMARYProduct test scriptLICENSEMITLIC_FILES_CHKSUMfile://LICENSE;md5f4fa7fd56aac72279ad21a112915ca87SRC_URIfile://product-test.sh \ file://LICENSES${WORKDIR}do_install(){install-d ${D}${bindir}install-m0755${WORKDIR}/product-test.sh ${D}${bindir}/product-test}FILES:${PN}${bindir}/product-test编译bitbake product-test如果没有报错就说明- Layer 创建成功 - layer.conf 配置正确 - BBFILES 能找到 recipe - BitBake 已经识别 meta-myproduct六、验证 Layer 是否生效可以使用以下命令检查bitbake-layers show-layers查看当前启用的所有 Layer。查看某个 recipe 来自哪个 Layerbitbake-layers show-recipes product-test应该能看到类似输出product-test: meta-myproduct1.0还可以列出某个 Layer 提供的所有 recipesbitbake-layers show-recipes | grepmeta-myproduct**本课建议掌握的知识点Product与Layer对应关系答案是通常是一对一关系但不是绝对。更准确地说Layer 是一种组织代码的方式而不是 Product 的强制对应关系。下面分别介绍几种常见情况。情况一一个 Product 一个 Layer最常见推荐例如公司有两个产品智能门锁 工业网关目录可能是poky meta-openembedded meta-company meta-raspberrypi meta-doorlock meta-gateway# 通常保证poky独立性其中meta-doorlock只放门锁相关- image -service- 配置 - package - systemd - logo而meta-gateway放工业网关自己的内容。这种方式维护最简单。情况二多个 Product 共用一个 Layer例如Camera A Camera B Camera C它们只有一点区别- logo 不同 - 默认 IP 不同 - 多一个软件那么完全可以meta-camera里面放recipes-app recipes-images recipes-config再通过不同的 image 或配置区分camera-a-image.bb camera-b-image.bb camera-c-image.bb这样不用复制大量代码。情况三一个 Product 使用多个 Layer大型公司常见例如一个车载系统meta-company-common meta-company-ui meta-company-network meta-company-security meta-company-product每个 Layer 都负责一个领域meta-company-common公共软件meta-company-uiQt、QML、界面meta-company-networkWiFi、Bluetooth、VPNmeta-company-securitySELinux、加密、证书meta-company-product最终产品配置最终生成myproduct-image.bb为什么要这样拆假设产品 AWeb Server SSH WiFi产品 BWeb Server SSH 4G如果每个产品一个 Layer而且把所有 recipe 都复制进去meta-productA meta-productB那么webserver.bb就要维护两份。以后升级nginx需要改两遍。所以大型项目通常会把公共内容提取出来meta-company-common所有产品共享。一个比较合理的项目结构如果你现在学习 Yocto我建议按下面这种方式组织poky/ ├── meta ├── meta-poky ├── meta-openembedded ├── meta-raspberrypi │ ├── meta-mycommon ← 公共 package、class、config │ ├── meta-myproduct ← 产品 A │ └── meta-myproduct2 ← 产品 B以后新增职责如下这样既避免重复又便于扩展多个产品。对于你目前的学习阶段你的目标是先掌握 Yocto 的基本开发流程因此建议先采用“一产品一 Layer”meta-myproduct/ ├── conf/ ├── recipes-app/ ├── recipes-core/ ├── recipes-images/ └── recipes-support/后面当你学习到多个产品共享代码时再把公共内容拆分到 meta-mycommon 中。这也是很多实际项目逐步演进的过程。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进