- 一、meta-openembedded 目录
本 SemiDrive源码分析 之 Yocto源码分析 系列文章汇总如下:
- 《【SemiDrive源码分析】【Yocto源码分析】01 - yocto/base目录源码分析(编译环境初始化流程)》
- 《【SemiDrive源码分析】【Yocto源码分析】02 - yocto/meta-openembedded目录源码分析》
- 《【SemiDrive源码分析】【Yocto源码分析】03 - yocto/semidrive目录源码分析》
- 《【SemiDrive源码分析】【Yocto源码分析】04 - yocto/poky目录源码分析》
- 《【SemiDrive源码分析】【Yocto源码分析】05 - yocto/prebuilt目录源码分析》
- 《【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 的目录结构,可以看出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)
待深入研究:
- initramfs 和 kexec



