文章目录
一、概念
1、Poky
Poky有两个含义:
第一个含义,是用来构建Linux的构建系统(OpenEmbedded),值得注意的该Poky仅仅是一个概念,而非一个实体,它包含了 BitBake工具、编译工具链、BSP、诸多程序包或层,可以认为Poky即是Yocto的本质。
第二个含义,使用Poky系统得到的默认参考 Linux 发行版也叫Poky(当然,我们可以对此发行版随意命名)。
2、Metadata
元数据集,所谓元数据集就是发行版内各基本元素的描述与来源,OE构建系统会解析metadata文件来构建linux。
大致上,metadata包括了配方(recipes)、共享的class类、配置文件和构建指令相关的信息,以及用来控制构建内容和构建效果的数据。
metadata也包括了一些命令和数据来指定软件的版本,从哪里获取软件,补丁等用来修复bug或者自定义软件的文件。
(1)recipes:
.bb/.bbappend文件,配方文件,描述了从哪获取软件源码,如何配置,如何编译。
bbappend和bb的区别主要在于bbappend是基于bb的,功能是对相应的bb文件作补充和覆盖,有点类似于“重写”的概念。
(2)classes:
.bbclass文件,包含在配方文件之间共享的有用信息。
比如autotools该类,其中包含Autotools使用的任何应用程序的常用设置。这个概念有点像C++中的基类。
(3)configuration:
.conf文件,即配置文件,我们可以用它来改变构建方式,比如conf/local.conf可以配置机器配置选项、分发配置选项、编译器调整选项、常规通用配置选项、用户配置选项以及自定义变量等。
conf/bblayers.conf中可以添加用到的layer层路径,从而在编译时将他们添加进去。
3、Layers:
这个layers层是包含相关指令和配置集合的仓库(或者说是目录),这些指令和配置用于告诉Yocto该做什么。
将相关metadata元数据分开到特定功能的layers层中有助于模块开发,降低耦合度,以便以后可以重复使用meta layer,这个有点像软件分层(功能层/板级层)的意思。
4、Bitbake:
是OpenEmbedded构建系统的核心工具,负责解析元数据(Metadata)。
在解析完成后,bitbake会创建一个依赖树(dependency tree)来决定任务执行顺序,然后去执行这些任务。
二、目录结构
1、poky目录
(1)bitbake——bitbake工具目录。
bitbake是metedate元数据解释器和执行器,读取metedate并执行定义的task,执行失败通常来自metedate元数据,而不是来自bitbake本身。
执行bitbake命令(包含bitbake-*)时,其实执行的就是bitbake/bin/下面的文件。
执行环境设置脚本(即 . oe-init-build-env)时,会将scripts和 bitbake/bin目录(按该顺序)放入 shell 的PATH环境变量中。
(2)build——用户配置文件和工程构建输出目录
build目录在建立环境变量时进行创建并进行配置文件初始化(即执行 . oe-init-build-env时),构建的所有文件都在该目录下组织存放。
该目录不一定在poky工程中,取决于执行 . oe-init-build-env时设置的路径。
详见?:2、构建目录build
(3)documentation
该目录包含 Yocto 项目说明文档以及允许您生成 PDF 和 HTML 版本手册的模板和工具,每个手册都包含在一个子文件夹中。
(4)meta
此目录包含 OpenEmbedded-Core 元数据。包含模拟目标(qemux86、 qemuarm等)的配方、通用类和机器(machine)通用配置等。
详见:3、/poky/meta目录
(5)meta-poky
poky发行版本的配置数据,包含了bitbake工具、编译工具链、BSP、诸多程序包或层,是yocto的核心目录,上面描述的bitbake目录其实就是软链接到poky目录下的bitbake目录。
(6)meta-openembedded
openembedded推出的配方大全。
该目录不一定在poky工程中,详见:
(7)meta-yocto-bsp
yocto工程包含的一些参考的BSP配置,通常厂商自己会增加自己的bsp目录。
(8)meta-selftest
此目录添加了 OpenEmbedded 自测试使用的其他recipes和appen文件,以验证构建系统的行为。如果你想要运行自测,则将该层加入到你的bblayers.conf文件中。
(9)meta-skeleton
该目录包含用于 BSP 和内核开发的模板配方,里面有一些简单的示例,比如如何添加软件、添加内核模块、给内核源码打补丁等。
(10)scripts
该目录包含在 Yocto 项目环境中实现额外功能的各种集成脚本(例如 QEMU 脚本)。
在执行 . oe-init-build-env 后该路径会被添加到环境变量中。
(11)oe-init-build-env
设置 OpenEmbedded 构建环境的脚本文件。
每次新打开终端后都需要执行该脚本,它会将yocto一些核心目录加入到环境变量PATH中。
2、构建目录build
具体的目录名及路径取决于执行 . oe-init-build-env时的设置。
├── build
│ ├── bitbake.lock(构建锁,构建过程中存在;当前只允许一个终端构建,如果意外停止构建,需要删除该文件才能运行下次构建)
│ ├── buildhistory (构建的历史信息,当启用构建历史功能时,OpenEmbedded 构建系统会创建此目录)
│ ├── cache (编译缓存)
│ ├── conf (配置文件目录,该目录下配置文件在执行export TEMPLATECONF=meta-XXX/meta-YYY/conf(需要编译的目标层)和. oe-init-build-env命令后解析生成,整个构建都是依据此目录下配置来完成的)
│ │ ├── bblayers.conf (该文件用来定义BBLAYERS,BBLAYERS是决定哪些路径下的模块需要构建,哪些不需要构建,并将这些信息提供给bitbake)
│ │ ├── local.conf (用户的配置文件,包含所有定制化的配置,该文件配置的所有变量都会覆盖其他文件相应变量的软赋值 )
│ │ ├── sanity_info (此文件指示健全性检查的状态并在构建期间创建,不用关注)
│ │ ├── site.conf(可以使用conf/site.conf配置文件配置多个构建目录,不用关注)
│ │ └── templateconf.cfg(用来保存当前TEMPLATECONF变量的值)
│ ├── downloads (默认情况下,构建过程中下载的所有源码包将放置于此目录,若需要更改保存目录,需修改DL_DIR变量)
│ ├── sstate-cache (保存状态,如果没有改变下次不再重新编译包,第一次编译时间长就是需要完整生成该目录,后续编译将快很多)
│ └── tmp (构建时所有的输出都存放在该目录下,由TMPDIR变量指定)
│ │ ├── deploy (编译输出, 部署文件目录,最终需要的文件(sdk boot rootfs image等)都在该目录中,由DEPLOY_DIR变量指定)
│ │ ├── buildstats (编译时状态记录,如果中断可以续编,构建统计信息,每次构建,都会在该目录下生成一个日期目录)
│ │ ├── cache (BitBake解析metedata(包括recipes和config文件)后,将解析的结果缓存在该目录,以提高后续效率,编译过程中的缓存)
│ │ ├── log (日志信息,进程编译过程中的log信息)
│ │ ├── work (包含和CPU架构相关的工作目录,所有代码都在这里,编译工作也将在此目录下进行)
│ │ └── work-shared (为了提高效率,OpenEmbedded 构建系统创建并使用此目录来保存与其他配方共享工作目录的配方。实际上,这仅用于gcc 及其变体(例如gcc-cross、 libgcc、gcc-runtime等)。)
3、/poky/meta目录
├── meta
│ ├── classes(包含所有的 *.bbclass。class文件是抽象的公共代码,给各个package使用)
│ ├── conf( 配置文件(.conf)的核心集合,比如所有的bblayers的配置文件都是从该目录下的bitbake.conf文件中衍生的。)
│ │ ├── machine(machine的配置文件 ,如果设置MACHINE = "qemux86",OpenEmbedded 构建系统会在此目录中查找qemux86.conf文件)
│ │ ├── distro (发行信息的配置文件)
│ │ └── machine-sdk(制定sdk是32位还是64位)
│ ├── files(该目录包含常见的许可文件和构建系统使用的几个文本文件,文本文件包含最少的设备信息以及具有已知权限的文件和目录列表)
│ ├── lib(此目录包含在构建过程中使用的 OpenEmbedded Python 库代码)
│ ├── recipes-bsp(此目录包含在构建过程中使用的 OpenEmbedded Python 库代码)
│ ├── recipes-connectivity (此目录包含与与其他设备通信相关的库和应用程序)
│ ├── recipes-core(此目录包含构建基本工作 Linux image所需的内容,包括常用的依赖项)
│ ├── recipes-devtools(主机构建时需要的tools,这些工具在目标板上同样能够使用)
│ ├── recipes-gnome(该目录包含与 GTK+ 应用程序框架相关的所有内容)
│ ├── recipes-graphics(绘图相关的库)
│ ├── recipes-kernel (此目录包含内核和具有强内核依赖性的通用应用程序和库)
│ ├── recipes-lsb4(支持Linux Standard Base (LSB) version 4.x所需要的)
│ ├── recipes-multimedia(此目录包含用于音频、图像和视频的编解码器和支持实用程序)
│ └── recipes.txt (配方说明文件)
参考
https://blog.youkuaiyun.com/zz2633105/article/details/122336684