构建空列表的两种法是_利用Yocto构建嵌入式Linux教程02基本概念介绍

本教程选用的Yocto版本为3.0.4,我使用的Linux发行版为Ubuntu 18.04 (LTS),图中所有示例为实际测试截图,有问题请给我留言。

在Yocto项目中,有一些专业的术语、比喻、专有名词等。这些基本概念是我们学习和使用Yocto构建自己的嵌入式Linux系统的前提。

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就是得到的一桌酒席。

构建空列表的两种法是_利用Yocto构建嵌入式Linux教程02基本概念介绍_第1张图片

2 Yocto项目的组成

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

2.1 BitBake

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用来处理数据文件的解析和执行。而数据本身也有多种类型,下面依次介绍。

2.2 配方文件

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

  • 有关软件包的描述性信息(作者,主页,许可证等)

  • 配方版本

  • 现有依赖关系(构建和运行时依赖关系)

  • 源代码所在的位置以及如何获取它

  • 源代码是否需要任何补丁,在哪里可以找到它们以及如何应用它们

  • 如何配置和编译源代码

  • 如何将生成的工件组装到一个或多个可安装的程序包中

  • 在目标计算机上的哪个位置安装软件包或创建的软件包

2.3 配置文件

.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)决定。越上级的配置是越笼统的,越下级的配置越细致。如果下级的配置项相对于上级有补充或者冲突,则以下级的内容为准,可以认为下级会对上级进行“重写”。一个简单的示例图如下:

构建空列表的两种法是_利用Yocto构建嵌入式Linux教程02基本概念介绍_第2张图片

有关构建的路线和流程:对于整个发行版构建,虽然每一级的配方由(.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.4 类

类文件(.bbclass)包含有助于在配方文件之间共享的信息。一个示例是 autotools类,其中包含Autotools使用的任何应用程序的通用设置。

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

2.5 层

层的可以将不同类型的自定义内容相互隔离。尽管您可能会发现在单个项目中将所有内容都保留在一层中很诱人,但是元数据的模块化程度越高,应对将来的更改就越容易。

用一句话概括层:层是组织文件和目录结构的元数据(配置文件、配方)集合。

创建层:

即使你只有一两个配方文件,还是建议你创建自己的层,而不是把配方添加到OE-Core或者Yocto项目层,随着你的配方越来越多,这种好处更能体现出来,且容易迁移到你的其它项目中去。你可以修改配置文件,使你的层添加到项目中。还可以用yocto-layer脚本来创建层。

$ yocto-layer create 

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

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

2.6 追加文件

追加文件是以.bbappend结尾的扩展名文件,用于扩展或覆盖现有配方文件中的信息。

每个追加文件都应有一个对应的配方文件,且二者具有相同的文件名,仅后缀不同(例如formfactor_0.0.bbformfactor_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。完全独立于版本的名称。

3 总结

本节主要介绍了一些Yocto的一些专业术语、BitBake、部分元数据。后续章节会对OpenEmbedded系统构建过程进行描述,然后使用bitbake构建一个Yocto版的“hello world”。

如果有问题,请通过公众号菜单栏“联系我”加我好友,谢谢。

你可能感兴趣的:(构建空列表的两种法是)