https://blog.csdn.net/qq_28992301/article/details/52872209
https://www.jianshu.com/p/2b5df45e614f
recipe:后缀为.bb的文件,是bitbake最基本的元数据文件,定义了如何构建一个target的全过程,该target的输出为一个或多个package。即当使用bitbake target命令时,会输出一个或多个可安装的package。因此分析一个package的产生应该从其对应的recipe为起始,target的名称即为recipe的名称。
configuration:后缀为.conf的文件,定义指示构建过程的各种变量值。其中包括:machine配置选项、distribution配置选项、compiler优化选项、通用配置选项和用户配置选项,该类文件只对变量进行赋值,主配置文件为conf/bitbake.conf文件。
classes:后缀为.bbclass的文件,包含元数据文件之间的共享数据。通常bitbake/class/目录下面包含一个base.bbclass,会自动被工程中所有的recipe和class所包含(include、require、inherit)。
base.bbclass包含了基本任务的定义,如代码获取、解包、配置(默认为空)、编译(基于任何当前支持的makefile)、安装和打包(两项默认为空)。这些基本任务可以被继承的class或recipe所重写/扩展。
layer:将不同的目标实现隔离,实现功能模块化。例如构建适用于两种不同machine的img,可以将两种machine的配置分别置于不同的layer,使得在构建过程中不会相互影响。再比如,一个基本功能的实现也可以设定为单独一个layer,如GUI layer,可以被当作模块被任何其他layer使用。
append:后缀为.bbappend的文件,实现对recipe文件的重写/扩展。.bbappend文件总是与一个现存的.bb文件(同名)相对应。如:当不同的machine layer对GUI layer进行引用时,可以
使用与GUI layer中同名的.bbappend文件对GUI layer的功能进行不同的定制,而不需要去修改原GUI layer中的内容。
yocto各种元数据的组织结构如下图所示:
以bitbake执行流对yocto的组织架构进行解析如下:
解析基本配置元数据
基本配置元数据包括bblayers.conf、bitbake.conf、local.conf以及layer.conf(layer.conf每个layer包含一个)。
其中,bblayers.conf通过BBLAYERS变量指定当前project中需要使能的layer;bitbake.conf定义主要的环境变量;local.conf指定MACHINE和DISTRO变量(这两个变量值也可以直接在oe-init-build-env中指定);layer.conf指示当前layer的元数据文件位置。
每一个layer都包含一个layer.conf,其内容包括如下几个变量的定义:
BBPATH:通常指向当前layer的根目录,将当前layer加入bitbake的搜索路径,bitbake可通过该路径对recipe、configuration以及class文件进行查找。
BBFILES:通常指向该layer的recipe文件(.bb和.bbappend)。
BBFILE_COLLECTIONS:当前layer在OpenEmbedded build system中的标识名。
BBFILE_PATTERN:layer的路径。
BBFILE_PRIORITY:当前layer的查找优先级,build system按优先级顺序从layer中查找匹配的recipe文件,查找成功即返回,即当多个layer包含同一名称的recipe时,使用优先级高的layer中的recipe。
LAYERVERSION:当前layer的版本号,供LAYERDEPENDS变量使用,用于标识layer的继承关系。
查找并解析recipe
基本配置元数据是全局的,会影响所有的recipe和task,主要是为所有的构建recipe时提供查找路径,bitbake首先查找使能的layer,然后根据layer的优先级顺序从各layer中的layer.conf获取l元数据位置并对元数据名称进行匹配。除recipe本身以外,bitbake还需要查找被该recipe所包含的其他class文件,其中base.bbclass文件被隐式的包含在所有的class和recipe文件中,是一个全局的文件。
查找到指定的recipe之后,bitbake开始对recipe进行逐行解析,recipe的文件内容包括:
通过解析recipe文件,bitbake可以获取在recipe文件(包括被include的base.bbclass文件)中定义的task、task执行过程中需要的数据和依赖等关键信息。
执行task
recipe定义的了多个task,当执行bitbake target(recipe的名称时),bitbake根据task之间的顺序和依赖关系对target进行构建,一般流程如下:
当project需要对upstream下载的部分元数据进行修改时,通过将源upstream的元数据进行复制并修改到local,然后形成另一个元数据集合,在应用时将local设置为较高的优先级,bitbake将会首先从local中查找对应的元数据。如下设置:
BBFILES = “/stuff/openembedded//.bb /stuff/openembedded.modified//.bb”
BBFILE_COLLECTIONS = “upstream local”
BBFILE_PATTERN_upstream = " /stuff/openembedded/"
BBFILE_PATTERN_local = " /stuff/openembedded.modified/"
BBFILE_PRIORITY_upstream = “5”
BBFILE_PRIORITY_local = “10”
不过,目前更多的是将定制化的修改单独设置为一个layer,并利用.bbappend文件对源文件进行重写,并不直接对源元数据进行复制再修改。
此外,再对源数据进行引用时,为防止对class文件的重复多次包含,一般需指定class文件的相对路径(类似于C中的include),如使用require recipes-core/package/file.inc替代require file.inc。这种情况发生在A.bb require B.inc 和C.inc,而B.inc和C.inc同时require D.inc 此时就会发生重复包含。
1、确保当前没有现存的layer已实现所需功能
2、建立一个已meta-开头的目录
3、在meta-目录下创建conf/layer.conf,并根据情况对layer.conf中的变量进行设置
4、根据layer的目标实现添加内容:当需要提供对多个machine的支持时,创建conf/machine/目录,并在其下创建machinename.conf文件;
如果需要提供对多个distro的支持,创建conf/distro/目录,并在其下创建distroname.conf文件。
5、使能新的layer,利用bblayers.conf中的BBLAYERS使能新的layer
6、测试layer与现有layer的兼容性
PROVIDES:在构建target时,bitbake通过PROVIDES名称列表查找每一个recipe文件,recipe文件默认以其PN作为名称出现在PROVIDES列表中,也可以在recipe中利用PROVIDES变量指定其在PROVIDES中的名称。
PREFERRED_PROVIDER:当在PROVIDES列表中存在多个provider实现同一功能时,需要指定包含其中的一个provider来构建target,如“virtual/kernel”,machine layer可以通过如下声明选择最适合的kernel recipe:
PREFERRED_PROVIDER_virtual/kernel = “linux-yocto”
DEPENDS:指定构建时recipe的依赖项。
RDEPENDS:指定运行时recipe的依赖项,比如其他的package,在目标machine运行时,需要先安装其他的package才能运行当前recipe输出的package。
SRC_URI:向build system指示文件的路径,以file开头的路径为本地路径:在recipe的父目录中首先查找与recipe的PN相同的目录,其次查找file目录,最后找其他目录。
TOPDIR:指向build目录。
PN = “${@bb.parse.BBHandler.vars_from_file(d.getVar(‘FILE’, False),d)[0] or ‘defaultpkgname’}”
PV = “${@bb.parse.BBHandler.vars_from_file(d.getVar(‘FILE’, False),d)[1] or ‘1.0’}”
PN可以理解为PackageName,recipe的名称
PV可以理解为PackageVersion,recipe的版本