利用Yocto构建嵌入式Linux教程02--Yocto的一些基本概念介绍

本教程选用的Yocto版本为3.0.4,使用的Linux发行版为Ubuntu 18.04 (LTS),图中所有示例为实际测试截图,有问题请给我留言。微信公众号:嵌入式Linux那些事儿

在Yocto项目中,有一些专业的术语、比喻、专有名词等。了解这些对于后续的Yocto掌握奠定基础。

1 Yocto术语

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就是得到的一桌酒席。
在这里插入图片描述

2 Yocto项目组成

所述BitBake与各种类型的配置文件、任务、执行器一起形成 OpenEmbedded-Core(OE-Core)。本节通过描述它们的用法,以及它们如何相互作用来概述他们的组成关系。

2.1 BitBake

BitBake是OpenEmbedded构建系统的核心工具, 负责解析元数据,从中生成任务列表,然后执行这些任务。
1.要查看BitBake支持的选项列表,请使用以下命令之一:

 $ bitbake -h
 $ bitbake --help

2.仅对某组配方文件执行任务
如您要构建的配方的名称为matchbox-desktop_1.2.3.bb:

 $ bitbake matchbox-desktop

3.完成某项特定任务清除该任务:

$ bitbake  matchbox-desktop -c clean

执行某个任务的编译:

 $ bitbake optee_example -c compile

在构建系统时,先下载不构建:

 $ bitbake -c fetchall core-image-stao

4.使用“-k”忽略错误,继续执行其它任务:最常用场景,在您构建系统时,使用 -k 选项,可忽略某个出错任务,继续执行其它构建任务。

 $ bitbake -k core-image-staoBitBake

用来处理数据文件的解析和执行。数据本身有多种类型:

2.1 配方文件

带.bb后缀的文件是“配方”文件。这些配方文件为BitBake提供以下内容:

  • 有关软件包的描述性信息(作者,主页,许可证等)
  • 配方版本
  • 现有依赖关系(构建和运行时依赖关系)源代码
  • 所在的位置以及如何获取它
  • 源代码是否需要任何补丁,在哪里可以找到它们以及如何应用它们
  • 如何配置和编译源代码
  • 如何将生成的工件组装到一个或多个可安装的程序包中
  • 在目标计算机上的哪个位置安装软件包或创建的软件包

在BitBake或任何使用BitBake作为其构建系统的项目的上下文中,带有.bb扩展名的文件称为配方。

2.2 配置文件

以.conf结尾的文件是配置文件。在中的配置文件 conf/local.conf,用户的定义变量影响着每个构建过程。 local.conf文件提供了许多定义构建环境的基本变量。对部分常用变量进行描述:

#目标机器的选择
 MACHINE ??= "qemux86-64"
 #构建过程,同时启用几个线程。如果您的内容空间较小,且编译的是支持qt的版本(该编译过程对内容要求较大超过6G),这里有一个快速构建的小技巧,第一次构建的时候 ,设置BB_NUMBER_THREADS 为内核数的2倍,使用bitbake -k 忽略错误,先快速完成第一遍的编译。然后保持内存在8G以上,任务数在2个或者2个以内,可顺利完成编译。
 #请根据情况适当配置线程数量
 BB_NUMBER_THREADS = "2"######################
 #DL_DIR、SSTATE_DIR、TMP_DIR这三个目录请存放在和构建项目Build同级别的目录,因为您后期新建的其它工程可共享这些目录。请去掉三个变量前的#,或者在配置文件结尾处添加三个变量的信息。
 #######################
 #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指令实现。

2.3 类

类文件(.bbclass)包含有助于在配方文件之间共享的信息。一个示例是 autotools类,其中包含Autotools使用的任何应用程序的通用设置。
BitBake构建系统过程中必须要包含的一个类是 base.bbclass ,您可以在classes目录中找到此文件。base.bbclass类文件是特殊的,因为它总是被所有的配方和类自动包含。此类包含用于标准基本任务的定义,例如获取,解压缩,配置(默认情况下为空),编译(运行存在的任何Makefile),安装(默认情况下为空)和打包(默认情况下为空)。这些任务通常被在项目构建过程中被其它类进行覆盖或者扩展。

2.4 层

层的可以将不同类型的自定义内容相互隔离。尽管您可能会发现在单个项目中将所有内容都保留在一层中很诱人,但是元数据的模块化程度越高,应对将来的更改就越容易。
用一句话概括层:层是组织文件和目录结构的元数据(配置文件、配方)集合。
创建层
即使你只有一两个配方文件,还是建议你创建自己的层,而不是把配方添加到OE-Core或者Yocto项目层,随着你的配方越来越多,这种好处更能体现出来,且容易迁移到你的其它项目中去。你可以修改配置文件,使你的层添加到项目中。还可以用yocto-layer脚本来创建层。

$ yocto-layer create <layername>

然后根据脚本提示,然后创建配方和配置文件。

├── conf
 │   └── layer.conf
 └── xxx.bb

2.5 追加文件

追加文件是以.bbappend结尾的扩展名文件,用于扩展或覆盖现有配方文件中的信息。
每个追加文件都应有一个对应的配方文件,且二者具有相同的文件名,仅后缀不同(例如formfactor_0.0.bb和 formfactor_0.0.bbappend)。
追加文件中的信息扩展或覆盖了文件名相同的配方文件中的信息。
为追加文件命名时,可以使用“ %”通配符来匹配配方名称。例如,假设您有一个名为如下的追加文件:

 busybox_1.21.%.bbappend

该追加文件将与配方的任何busybox_1.21.x.bb版本匹配。因此,追加文件将与以下配方名称匹配:

 busybox_1.21.1.bb
 busybox_1.21.2.bb
 busybox_1.21.3.bb

注意

  • “%”字符的使用受到限制,因为它只能直接在附加文件名的.bbappend部分前面使用。您不能在名称的其他位置使用通配符。
  • 如果busybox配方更新为busybox_1.3.0.bb,则追加名称将不匹配。但是,如果您将追加文件命名为 busybox_1.%.bbappend,则会匹配。
  • 在一般情况下,您可以将追加文件命名为busybox_%.bbappend。完全独立于版本的名称。

3 总结

2004年12月7日,OpenEmbedded项目团队成员Chris Larson将项目分为两个不同的部分:

  • BitBake,通用任务执行器
  • OpenEmbedded,BitBake使用的元数据集

本节主要介绍了一些Yocto的一些专业术语、BitBake、部分元数据。后续章节会对OpenEmbedded系统构建过程进行描述,然后使用bitbake构建一个Yocto版的“hello world”。
更多Linux系统构建精彩内容请关注微信公众号(嵌入式Linux那些事儿)。

猜你喜欢

转载自blog.csdn.net/u013921164/article/details/112952438