栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

【SemiDrive源码分析】【Yocto源码分析】02 - yocto/meta-openembedded目录源码分析

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【SemiDrive源码分析】【Yocto源码分析】02 - yocto/meta-openembedded目录源码分析

【SemiDrive源码分析】【Yocto源码分析】02 - yocto/meta-openembedded目录源码分析
  • 一、meta-openembedded 目录


本 SemiDrive源码分析 之 Yocto源码分析 系列文章汇总如下:

  1. 《【SemiDrive源码分析】【Yocto源码分析】01 - yocto/base目录源码分析(编译环境初始化流程)》
  2. 《【SemiDrive源码分析】【Yocto源码分析】02 - yocto/meta-openembedded目录源码分析》
  3. 《【SemiDrive源码分析】【Yocto源码分析】03 - yocto/semidrive目录源码分析》
  4. 《【SemiDrive源码分析】【Yocto源码分析】04 - yocto/poky目录源码分析》
  5. 《【SemiDrive源码分析】【Yocto源码分析】05 - yocto/prebuilt目录源码分析》
  6. 《【SemiDrive源码分析】【Yocto源码分析】06 - yocto/source目录源码分析》

Yocto里面有好多专业名字,要我来说这些名字,我估计都说不出来几个,并且我也没想过去记也没必要记这些死概念,理解Yocto思想就够了。
如果要我来概括Yocto思想的话,我觉得【模块化分类,可灵活增删】这几个字再合适不过了。

比如,Yocto 中的Layer,就可以看作一个大模块,它可独立按需增删,
大模块下面,再根据各功能,各需求进行分类成各个小模块 recieps,小模块下面就是各个功能的具体代码实现,
bb、conf、bbclass 这些,从功能上看跟Android 中的Android.mk或 bp 又有什么区别呢,只是语法不一样了罢了。
学习Yocto ,无非就是要学习那些语法,好知道哪些文件该怎么放,哪些内容该怎么加。

但整体来说,Yocto 思想大家做为程序员都能很好的理解,但别人就是真的做出来,这点还是非常令人敬佩的。
有了它,大大简化了开发者、设备产商、芯片产商的工作。

  • 对于开发者来说,如果要定制化裁剪是很麻烦,要处理各种依赖问题,Yocto 很好的实现了灵活增删。
  • 对于设备产商和芯片产商来说,这么多平台 ,维护起来太麻烦了,Yocto很好的解决了统一性的问题,各平台可共享同一套yocto layer 代码,依赖问题,产商都帮你解决好了,大大缩短了开发调试周期。

随便写了一些,好了,不多废话了,我们正式开始分析代码吧。^_^

一、meta-openembedded 目录

我们先来看看 meta-openembedded 的目录结构,可以看出openembedded 下面包含的是一系列工具,用于嵌入式Linux的构建框架。

meta-openembedded/
├── contrib
│   └── oe-stylize.py					## 格式化脚本,用于对写好的代码进行格式化
├── meta-filesystems					## 文件系统 层,其中包含当前支持的所有文件系统,按需配置
│   └── conf
│       └── layer.conf					## filesystems-layer
├── meta-gnome							## gnome 桌面模块
├── meta-initramfs						## Initramfs image,初始ram文件系统,基于 tmpfs
├── meta-multimedia						## 多媒体层,包含所有音视频
├── meta-networking						## 网络层,所含所有网络相关的 
├── meta-oe								## openembedded层,核心层,嵌入式Linux的构建框架,其中包含一系列需要用的工具
│   ├── conf
│   │   └── layer.conf
│   ├── recipes-benchmark				## 性能测试工具
│   ├── recipes-bsp						## 基础础动测试工具,如cpu、boot、flash、sensor、touchscreen 校准工具
│   ├── recipes-connectivity			## connectivity 连接相关的工具
│   ├── recipes-core					## dbus、xml等工具
│   ├── recipes-crypto					## 加密模块,如 dm-crypt,openssl
│   ├── recipes-dbs						## 数据库相关 
│   ├── recipes-devtools				## android tool,bootchart 等一系列测试工具
│   ├── recipes-extended				
│   ├── recipes-gnome					
│   ├── recipes-graphics				## 图形相关的工具及示例程序
│   ├── recipes-kernel
│   ├── recipes-multimedia				## 音视频相关的工具
│   ├── recipes-navigation
│   ├── recipes-security				## 密码校验工具
│   ├── recipes-shells
│   ├── recipes-support
│   └── recipes-test
├── meta-perl							## perl
├── meta-python							## python
├── meta-webserver						## 构建web服务器、基于web的应用程序
└── meta-xfce							## xfce 桌面工具相关

从上面可以看出 meta-openembedded 下主要是各种工具,主要是用于 构建、测验 Linux。

这上面的工具,需要啥就加啥,见 /build/conf/bblayer.conf
如下 ,增加了meta-oe、meta-multimedia、meta-networking、meta-python、meta-filesystems 这几个layer的进来,等同于 Android 下面,这几个目录放置了Android.mk,
但不同的是,它只是会扫描解析这下面的所有.bbclass和.bb 等文件,但并不会编译,只是张入场券而已。
需要编译哪些,根据具体定制系统时的需求 ,灵活配置IMAGE_INSTALL_append,根据 conf文件中的 IMAGE_INSTALL_append 字段来决定是否需要编译进来。

# /build/conf/bblayer.conf
LCONF_VERSION = "6"

BBPATH = "${TOPDIR}"
BSPDIR := "${@os.path.abspath(os.path.dirname(d.getVar('FILE', True)) + '/../..')}"

BBFILES ?= ""
BBLAYERS = " 
  ${BSPDIR}/poky/meta 
  ${BSPDIR}/poky/meta-poky 
  ${BSPDIR}/meta-openembedded/meta-oe 
  ${BSPDIR}/meta-openembedded/meta-multimedia 
  ${BSPDIR}/meta-semidrive 
"

# Semidrive Yocto Project Release layers
BBLAYERS += " ${BSPDIR}/meta-openembedded/meta-networking "
BBLAYERS += " ${BSPDIR}/meta-openembedded/meta-python "
BBLAYERS += " ${BSPDIR}/meta-openembedded/meta-filesystems "
BBLAYERS += " ${BSPDIR}/meta-qt5 "

BBFILE_COLLECTIONS

好了,截止目前 yocto/meta-openembedded目录 的大概作用我们已经清楚了,
简单来说,它只是Openembedded 这个环境的一些工具合集,它下面包含了一系列在构建linux 过程中可能会需要用的工具,
开发者可 以根据自已的需求灵活增删。
所有需要编译且添加进打包的子功能,都需要通过 IMAGE_INSTALL_append 增加conf 中。

本文到此结束。





从这开始,都是题外话,主要是学习如何看 bitbake 编译的log,从而加深整个编译过程的理解。

进一步,我们来看看yocto/meta-openembedded/meta-networking/recipes-support/dnsmasq 编译后的情况:
我们来单编看看:
DISTRO=cluster-qt MACHINE=x9h_ref_serdes source sd_setup.sh -b build-x9ref
bitbake dnsmasq
刚刚编译时发现一个报错:

pyinotify.WatchManagerError: add_watch: cannot watch /home/ciellee/work/code/x9_ptg_3.9.1/buildsystem/yocto/build-x9ref/conf WD=-1, Errno=No space left on device (ENOSPC)
NOTE: Your conf/bblayers.conf has been automatically updated.
ERROR: No space left on device or exceeds fs.inotify.max_user_watches?
ERROR: To check max_user_watches: sysctl -n fs.inotify.max_user_watches.
ERROR: To modify max_user_watches: sysctl -n -w fs.inotify.max_user_watches=.
ERROR: Root privilege is required to modify max_user_watches.

原因为我开了 VScode 在监控 build下的文件 ,把vscode 关闭就好了


继续编译,编译完后,我们发现,dnsmasq 编译相关 的源文件全放在这里了:build-x9ref/tmp/work/aarch64-sdrv-linux/

ciellee@ubuntu:~/work/code/x9_ptg_3.9.1/buildsystem/yocto/build-x9ref$ find ./ -name dnsmasq
./tmp/pkgdata/x9h_ref_serdes/runtime-reverse/dnsmasq
./tmp/pkgdata/x9h_ref_serdes/runtime-rprovides/dnsmasq-systemd/dnsmasq
./tmp/pkgdata/x9h_ref_serdes/runtime/dnsmasq
./tmp/pkgdata/x9h_ref_serdes/dnsmasq
./tmp/sysroots-components/aarch64/dnsmasq
./tmp/sysroots-components/aarch64/dnsmasq/sysroot-providers/dnsmasq
./tmp/stamps/aarch64-sdrv-linux/dnsmasq
./tmp/deploy/licenses/dnsmasq
./tmp/work/aarch64-sdrv-linux/dnsmasq
./tmp/work/aarch64-sdrv-linux/dnsmasq/2.78-r0/pkgdata/runtime-reverse/dnsmasq
./tmp/work/aarch64-sdrv-linux/dnsmasq/2.78-r0/pkgdata/runtime-rprovides/dnsmasq-systemd/dnsmasq
./tmp/work/aarch64-sdrv-linux/dnsmasq/2.78-r0/pkgdata/runtime/dnsmasq
./tmp/work/aarch64-sdrv-linux/dnsmasq/2.78-r0/pkgdata/dnsmasq
./tmp/work/aarch64-sdrv-linux/dnsmasq/2.78-r0/packages-split/dnsmasq-dbg/usr/bin/.debug/dnsmasq
./tmp/work/aarch64-sdrv-linux/dnsmasq/2.78-r0/packages-split/dnsmasq-dbg/usr/src/debug/dnsmasq
./tmp/work/aarch64-sdrv-linux/dnsmasq/2.78-r0/packages-split/dnsmasq
./tmp/work/aarch64-sdrv-linux/dnsmasq/2.78-r0/packages-split/dnsmasq/usr/bin/dnsmasq
./tmp/work/aarch64-sdrv-linux/dnsmasq/2.78-r0/packages-split/dnsmasq/etc/init.d/dnsmasq
./tmp/work/aarch64-sdrv-linux/dnsmasq/2.78-r0/license-destdir/dnsmasq
./tmp/work/aarch64-sdrv-linux/dnsmasq/2.78-r0/package/usr/bin/.debug/dnsmasq
./tmp/work/aarch64-sdrv-linux/dnsmasq/2.78-r0/package/usr/bin/dnsmasq
./tmp/work/aarch64-sdrv-linux/dnsmasq/2.78-r0/package/usr/src/debug/dnsmasq
./tmp/work/aarch64-sdrv-linux/dnsmasq/2.78-r0/package/etc/init.d/dnsmasq
./tmp/work/aarch64-sdrv-linux/dnsmasq/2.78-r0/image/usr/bin/dnsmasq
./tmp/work/aarch64-sdrv-linux/dnsmasq/2.78-r0/image/etc/init.d/dnsmasq
./tmp/work/aarch64-sdrv-linux/dnsmasq/2.78-r0/dnsmasq-2.78/src/dnsmasq
./tmp/work/aarch64-sdrv-linux/dnsmasq/2.78-r0/sysroot-destdir/sysroot-providers/dnsmasq
./buildhistory/packages/aarch64-sdrv-linux/dnsmasq
./buildhistory/packages/aarch64-sdrv-linux/dnsmasq/dnsmasq


如果要查看完整的 bitbake 信息,可以输入: bitbake -c listtasks -D dnsmasq 或 bitbake -v -D dnsmasq

可以看到 bitbake 完整 的解析 .bb 及 .bbclass 的过程:
如下,我这只 截取了一部分,想要了解的话,自行运行 bitbake -c listtasks -D xxxx保存看看吧 。

DEBUG: Inheriting /home/ciellee/work/code/x9_ptg_3.9.1/buildsystem/yocto/poky/meta/classes/base.bbclass (from configuration INHERITs:0)
DEBUG: Inheriting /home/ciellee/work/code/x9_ptg_3.9.1/buildsystem/yocto/poky/meta/classes/patch.bbclass (from /home/ciellee/work/code/x9_ptg_3.9.1/buildsystem/yocto/poky/meta/classes/base.bbclass:4)
DEBUG: Inheriting /home/ciellee/work/code/x9_ptg_3.9.1/buildsystem/yocto/poky/meta/classes/terminal.bbclass (from /home/ciellee/work/code/x9_ptg_3.9.1/buildsystem/yocto/poky/meta/classes/patch.bbclass:11)
DEBUG: /home/ciellee/work/code/x9_ptg_3.9.1/buildsystem/yocto/meta-semidrive/recipes-multimedia/vpu/libvpu.bb: Parsing /home/ciellee/work/code/x9_ptg_3.9.1/buildsystem/yocto/meta-semidrive/recipes-multimedia/vpu/libvpu.bb
DEBUG: /home/ciellee/work/code/x9_ptg_3.9.1/buildsystem/yocto/meta-semidrive/recipes-multimedia/vpu/vputest.bb: Inheriting /home/ciellee/work/code/x9_ptg_3.9.1/buildsystem/yocto/poky/meta/classes/externalsrc.bbclass (from /home/ciellee/work/code/x9_ptg_3.9.1/buildsystem/yocto/meta-semidrive/recipes-multimedia/vpu/vputest.bb:4)
DEBUG: /home/ciellee/work/code/x9_ptg_3.9.1/buildsystem/yocto/meta-semidrive/recipes-multimedia/vpu/libomxvpu.bb: Parsing /home/ciellee/work/code/x9_ptg_3.9.1/buildsystem/yocto/meta-semidrive/recipes-multimedia/vpu/libomxvpu.bb
DEBUG: /home/ciellee/work/code/x9_ptg_3.9.1/buildsystem/yocto/meta-semidrive/recipes-multimedia/vpu/libvpu.bb: Inheriting /home/ciellee/work/code/x9_ptg_3.9.1/buildsystem/yocto/poky/meta/classes/externalsrc.bbclass (from /home/ciellee/work/code/x9_ptg_3.9.1/buildsystem/yocto/meta-semidrive/recipes-multimedia/vpu/libvpu.bb:4)
DEBUG: /home/ciellee/work/code/x9_ptg_3.9.1/buildsystem/yocto/meta-semidrive/recipes-multimedia/vpu/libomxvpu.bb: Inheriting /home/ciellee/work/code/x9_ptg_3.9.1/buildsystem/yocto/poky/meta/classes/externalsrc.bbclass (from /home/ciellee/work/code/x9_ptg_3.9.1/buildsystem/yocto/meta-semidrive/recipes-multimedia/vpu/libomxvpu.bb:4)




待深入研究:

  1. initramfs 和 kexec
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/860411.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号