本文参考yocto官方手册,如有理解不当之处,欢迎留言指出。
项目概述和概念手册:https://docs.yoctoproject.org/overview-manual/index.html
项目参考手册:https://docs.yoctoproject.org/ref-manual/index.html
Yocto 项目是一个开源协作项目,能帮助开发者为不同硬件架构的嵌入式产品,制作基于Linux的定制系统。Yocto Project 提供了灵活的工具集和开发环境,使世界各地的嵌入式设备开发人员通过共享技术、软件堆栈、配置和用于创建这些定制 Linux 映像的最佳实践进行协作。
全球数以千计的开发人员发现 Yocto Project 在系统和应用程序开发、存档和管理优势以及用于速度、占用空间和内存利用率的定制方面都具有优势。该项目是交付嵌入式软件堆栈的标准。该项目允许为多个硬件平台以及可以维护和扩展的软件堆栈进行软件定制和构建交换。
假如用烹饪一桌酒席来形容yocto构建,则Yocto就是饭店,Poky就是厨房(以及提供作为参考的菜的搭配套餐),Metadata就是烹饪资源(.bb/.bbappend表示配方/配方上的补充贴签),Layers就是菜谱的分类(如川菜谱、粤菜谱),Bitbake就是厨师,构建的结果就是输出一桌酒席。
bitbake
bitbake工具目录。bitbake是metedate元数据解释器和执行器,读取metedate并执行定义的task,执行失败通常来自metedate元数据,而不是来自bitbake本身。执行bitbake命令(包含bitbake-*)时,其实执行的就是bitbake/bin/
下面的文件。执行环境设置脚本(即 . oe-init-build-env)时,会将scripts
和 bitbake/bin
目录(按该顺序)放入 shell 的PATH
环境变量中。
build
用户配置文件和工程构建输出目录。build目录在建立环境变量时进行创建并进行配置文件初始化(即执行 . oe-init-build-env时),构建的所有文件都在该目录下组织存放。
documentation
该目录包含 Yocto 项目说明文档以及允许您生成 PDF 和 HTML 版本手册的模板和工具,每个手册都包含在一个子文件夹中。
meta
此目录包含 OpenEmbedded-Core 元数据。该目录包含模拟目标(qemux86
、 qemuarm
等)的配方、通用类和机器(machine
)通用配置等。
meta-poky
poky发行版本的配置数据,包含了bitbake工具、编译工具链、BSP、诸多程序包或层,是yocto的核心目录,上面描述的bitbake目录其实就是软链接到poky目录下的bitbake目录。
meta-openembedded
openembedded推出的配方大全
meta-yocto-bsp
yocto工程包含的一些参考的BSP配置,通常厂商自己会增加自己的bsp目录。
meta-selftest
此目录添加了 OpenEmbedded 自测试使用的其他recipes
和appen
文件,以验证构建系统的行为。如果你想要运行自测,则将该层加入到你的bblayers.conf
文件中。
meta-skeleton
该目录包含用于 BSP 和内核开发的模板配方,里面有一些简单的示例,比如如何添加软件、添加内核模块、给内核源码打补丁等。
scripts
该目录包含在 Yocto 项目环境中实现额外功能的各种集成脚本(例如 QEMU 脚本)。在执行 . oe-init-build-env 后该路径会被添加到环境变量中。
oe-init-build-env
设置 OpenEmbedded 构建环境的脚本文件,每次新打开终端后都需要执行该脚本,它会将yocto一些核心目录加入到环境变量PATH中。
├── 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
等)。)
├── 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 (配方说明文件)
Yocto项目的核心组件OpenEmbedded构建系统采用工作流方式来完成映像(Image)和SDK的生成,以下简要概述整个工作流程:
简单来说yocto项目工作流程就是OpenEmbedded构建系统读取各类配置文件完成编译打包工作,所以学会配置yocto项目的配置文件就OK了,但似乎没有很好的切入点?那反过来通过了解OpenEmbedded构建系统的构建过程来学习如何配置yocto项目的配置文件?