本教程选用的Yocto版本为3.0.4,我使用的Linux发行版为Ubuntu 18.04 (LTS),图中所有示例为实际测试截图,有问题请给我留言。
在Yocto项目中,有一些专业的术语、比喻、专有名词等。这些基本概念是我们学习和使用Yocto构建自己的嵌入式Linux系统的前提。
Yocto项目:是一个开源协作项目。
Yocto项目使用基于OpenEmbedded(OE)构建主机,该项目使用 BitBake 工具构建完整的Linux镜像。将BitBake和OE组件组合在一起形成参考构建主机,该主机以前称为 Poky。
Poky两层含义:
含义一:OpenedHand(公司名)最初开发的开源项目。该项目可以从现有的OpenEmbedded构建系统中开发出poky,从而成为对嵌入式Linux商业支持的构建系统。公司被英特尔收购后,该项目便成为Yocto Project构建系统的基础。
含义二:在Yocto Project源存储库中, poky
作为一个单独的Git存储库存在,您可以克隆它之后在主机系统上生成本地副本。
Metadata:元数据集,所谓元数据集就是发行版内各基本元素的描述与来源 。百科中对元数据的描述是:中间数据,中继数据,描述数据、数据属性的数据。
Layers:即各种meta-xxx目录,将Metadata按层进行分类,有助于项目的维护。
Bitbake:一个任务执行引擎,用来解析并执行Metadata。
Output:即各种输出image。
总结:假如用烹饪一桌酒席来形容构建发行版,则Yocto就是餐厅名,Poky就是厨房(以及提供作为参考搭配套餐),Metadata就是烹饪资源(.bb表示配方,.bbappend就是配方上的贴士,.conf表示厨房里的管事的小组长),Layers就是菜谱的分类(如川菜谱、粤菜谱),Bitbake就是厨师,Output就是得到的一桌酒席。
所述BitBake与各种类型的配置文件、任务、执行器一起形成 OpenEmbedded-Core(OE-Core)。本节描述它们的用法、相互作用以及组成关系。
BitBake是OpenEmbedded构建系统的核心工具, 负责解析元数据,从中生成任务列表,然后执行这些任务。
要查看BitBake支持的选项列表,请使用以下命令之一:
$ bitbake -h$ bitbake --help
仅对某组配方文件执行任务
如您要构建的配方的名称为matchbox-desktop_1.2.3.bb:
$ bitbake matchbox-desktop
完成某项特定任务,清除该任务:
$ bitbake matchbox-desktop -c clean
执行某个任务的编译:
$ bitbake optee_example -c compile
在构建系统时,先下载不构建:
$ bitbake -c fetchall core-image-stao
使用“-k”忽略错误,继续执行其它任务:
最常用场景,在您构建系统时,使用 -k 选项,可忽略某个出错任务,继续执行其它构建任务。
$ bitbake -k core-image-stao
BitBake用来处理数据文件的解析和执行。而数据本身也有多种类型,下面依次介绍。
带.bb
后缀的文件是“配方”文件。这些配方文件为BitBake提供以下内容:
有关软件包的描述性信息(作者,主页,许可证等)
配方版本
现有依赖关系(构建和运行时依赖关系)
源代码所在的位置以及如何获取它
源代码是否需要任何补丁,在哪里可以找到它们以及如何应用它们
如何配置和编译源代码
如何将生成的工件组装到一个或多个可安装的程序包中
在目标计算机上的哪个位置安装软件包或创建的软件包
以.conf
结尾的文件是配置文件。在中的配置文件 conf/local.conf
,用户的定义变量影响着每个构建过程。
local.conf文件提供了许多定义构建环境的基本变量。对部分常用变量进行描述:
#目标机器的选择
MACHINE ??= "qemux86-64"
#构建过程,同时启用线程的数量
BB_NUMBER_THREADS = "2"
#下载存放目录
DL_DIR ?= "${TOPDIR}/downloads"
#构建缓存目录
SSTATE_DIR ?= "${TOPDIR}/sstate-cache"
#构建过程目录
TMPDIR = "${TOPDIR}/tmp"
#发行版
DISTRO ?= "poky"
#指定OpenEmbedded构建系统在打包数据时使用的程序包管理器PACKAGE_CLASSES ?= "package_rpm"EXTRA_IMAGE_FEATURES ?= "debug-tweaks"USER_CLASSES ?= "buildstats image-mklibs image-prelink"PATCHRESOLVE = "noop"BB_DISKMON_DIRS ??= "\ STOPTASKS,${TMPDIR},1G,100K \ STOPTASKS,${DL_DIR},1G,100K \ STOPTASKS,${SSTATE_DIR},1G,100K \ STOPTASKS,/tmp,100M,100K \ ABORT,${TMPDIR},100M,1K \ ABORT,${DL_DIR},100M,1K \ ABORT,${SSTATE_DIR},100M,1K \ ABORT,/tmp,10M,1K"CONF_VERSION = "1"
机器配置文件位于中 ,它们定义特定硬件的变量,并且仅在为该目标构建时使用。
bblayers.conf文件告诉BitBake在构建过程中要使用哪些层。默认情况下,此文件中列出的层仅包括构建系统所必需的层。因此,您必须手动添加已创建的所有自定义层。
如何理解Yocto的配置方法?这要从发行版的定制流程说起。我们的目的很简单,是要得到uboot、kernel、rootfs这三个image;Yocto的目的也很简单,它要经过一级一级配置,逐步缩小配方,直至得到uboot、kernel、rootfs这三个image。每一级需要哪些配方,由该级对应的配置文件(.conf/.bb)决定。越上级的配置是越笼统的,越下级的配置越细致。如果下级的配置项相对于上级有补充或者冲突,则以下级的内容为准,可以认为下级会对上级进行“重写”。一个简单的示例图如下:
有关构建的路线和流程:对于整个发行版构建,虽然每一级的配方由(.conf/.bb)决定,但是每一级路线和方向的选择,是由我们最终bitbake的对象决定的,比如bitbake avi-image-core
,我们想要获得rootfs.img,那么:
第一步Poky就会从local.conf开始,一路向下,一级一级配置,直到配置到和rootfs有关的那一堆.bb配方文件,最终形成完整完全的配方;
然后获取配方需要的资源,比如各种软件包,比如kernel的源码;
最后把所有的资源编译出我们需要的镜像。
最后说一下bitbake,比如我们要选择编译rootfs.img,那么使用bitbake avi-image-core
即可,有时候并不直接采用这种做法。我们也可以在项目目录下写一个Makefile,里面包含各种各样的功能,内部以bitbake指令实现。
类文件(.bbclass
)包含有助于在配方文件之间共享的信息。一个示例是 autotools类,其中包含Autotools使用的任何应用程序的通用设置。
BitBake构建系统过程中必须要包含的一个类是 base.bbclass
,您可以在classes
目录中找到此文件。base.bbclass
类文件是特殊的,因为它总是被所有的配方和类自动包含。此类包含用于标准基本任务的定义,例如获取,解压缩,配置(默认情况下为空),编译(运行存在的任何Makefile),安装(默认情况下为空)和打包(默认情况下为空)。这些任务通常被在项目构建过程中被其它类进行覆盖或者扩展。
层的可以将不同类型的自定义内容相互隔离。尽管您可能会发现在单个项目中将所有内容都保留在一层中很诱人,但是元数据的模块化程度越高,应对将来的更改就越容易。
用一句话概括层:层是组织文件和目录结构的元数据(配置文件、配方)集合。
创建层:
即使你只有一两个配方文件,还是建议你创建自己的层,而不是把配方添加到OE-Core或者Yocto项目层,随着你的配方越来越多,这种好处更能体现出来,且容易迁移到你的其它项目中去。你可以修改配置文件,使你的层添加到项目中。还可以用yocto-layer脚本来创建层。
$ yocto-layer create
然后根据脚本提示,然后创建配方和配置文件。
├── conf│ └── layer.conf└── xxx.bb
追加文件是以.bbappend
结尾的扩展名文件,用于扩展或覆盖现有配方文件中的信息。
每个追加文件都应有一个对应的配方文件,且二者具有相同的文件名,仅后缀不同(例如formfactor_0.0.bb
和 formfactor_0.0.bbappend
)。
追加文件中的信息扩展或覆盖了文件名相同的配方文件中的信息。
为追加文件命名时,可以使用“ %
”通配符来匹配配方名称。例如,假设您有一个名为如下的追加文件:
busybox_1.21.%.bbappend
该追加文件将与配方的任何busybox_1.21.
x.bb
版本匹配。因此,追加文件将与以下配方名称匹配:
busybox_1.21.1.bbbusybox_1.21.2.bbbusybox_1.21.3.bb
注意
“%”字符的使用受到限制,因为它只能直接在附加文件名的.bbappend部分前面使用。您不能在名称的其他位置使用通配符。
如果
busybox
配方更新为busybox_1.3.0.bb
,则追加名称将不匹配。但是,如果您将追加文件命名为busybox_1.%.bbappend
,则会匹配。在一般情况下,您可以将追加文件命名为
busybox_%.bbappend
。完全独立于版本的名称。
本节主要介绍了一些Yocto的一些专业术语、BitBake、部分元数据。后续章节会对OpenEmbedded系统构建过程进行描述,然后使用bitbake构建一个Yocto版的“hello world”。
如果有问题,请通过公众号菜单栏“联系我”加我好友,谢谢。