By: fu linux
E-mail: fulinux@sina.com
Blog: https://blog.csdn.net/fulinus
喜欢的盆友欢迎点赞和订阅!
你的喜欢就是我写作的动力!
beaglebone-yocto.conf
首先我们是在 build/conf/local.conf文件中定义了MACHINE的值,如下:
MACHINE ?= "beaglebone-yocto"
- 1
因此我们可以在所有包含的layers中找找相应的${MACHINE}.conf文件,所说的layers就是BBLAYERS变量定义的:
cat build/conf/bblayers.conf
...
BBLAYERS ?= " \
/home/peeta/beaglebone/meta \
/home/peeta/beaglebone/meta-poky \
/home/peeta/beaglebone/meta-yocto-bsp \
"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
变量${MACHINE}.conf对应的配置文件回到如下的路径中查找:
meta*/conf/machine/
#上面3个layer中,meta-poky/conf目录下没有machine目录,因此不用在这个layer中查找${MACHINE}.conf
- 1
- 2
这里机器配置文件${MACHINE}.conf构建时解析出来的并能找到的文件是:
meta-yocto-bsp/conf/machine/beaglebone-yocto.conf
- 1
meta-yocto-bsp/conf/machine/目录下一共有3个典型体系架构的代表实例,beaglebone-yocto.conf文件代表的是arm体系架构的beaglebone机器实例。
beaglebone-yocto.conf文件用于配置特定机器的属性,例如包括依赖于机器的软件包、机器体系架构tune(这里是cortexa8hf-neon)、要构建的linux kernel的类型以及u-boot的配置等。
在beaglebone-yocto.conf配置文件出现了类似这样的定义:
PREFERRED_PROVIDER_virtual/xserver ?= "xserver-xorg"
PREFERRED_PROVIDER_virtual/kernel ?= "linux-yocto"
- 1
- 2
xserver是显示服务,相当于是一个桌面系统环境、我们不深入研究了哈~
linux-yocto是linux内核的recipe,对应的bb文件就是某个meta-*/recipes-kernel/linux/linux-yocto_x.x.bb
有下面的定义规定了linux内核的版本:
PREFERRED_VERSION_linux-yocto ?= "5.4%"
- 1
其中%是通配符。
于是可以知道linux对应的bb文件名类似这样:
meta-*/recipes-kernel/linux/linux-yocto_5.4X.bb
- 1
于是在几个layers找那个找到这个:
meta/recipes-kernel/linux/linux-yocto_5.4.bb
- 1
tips:有没有疑惑,为啥是在meta目录下,而不是meta-yocto-bsp目录下,实际上在build/conf/bblayers.conf声明了BBLAYERS变量包含了meta和meta-yocto-bsp等layers,在这两个layers里面的recipe bb文件都是平级的关系。
meta-yocto-bsp/目录下只有linux-yocto_5.4.bbappend 文件, append文件中的设置会overwrite同名的bb文件中的相同变量或者补充。
PREFERRED_PROVIDER_virtual/xxxx
再说下这个变量,这么长的变量是干啥的呢?字面也是就是virtual/xxxx优先选择的提供者。
在构建之前,如果知道几个不同的recipe提供相同的功能(比如上面提及的linux、xserver),则可以使用虚拟提供者(即virtual/*)作为实际提供者的别名。实际提供程序在构建时确定。
使用虚拟提供者的常见场景是内核配方。假设有三个内核recipe,其PN值映射到kernel-big、kernel-mid和kernel-small(这3个都是可以选择的内核recipe,至于那个优先选择还没有指定,也就是上面说的变量指定)。此外,这些recipe中的每一个都以某种方式使用了一个PROVIDES语句,该语句本质上标识自己能够提供virtual/kernel。下面是kernel class的一种方法:
#meta/classes/kernel.bbclass 类文件中有PROVIDES定义:
PROVIDES += "${@ "virtual/kernel" if (d.getVar("KERNEL_PACKAGE_NAME") == "kernel") else "" }"
- 1
- 2
任何继承内核类的recipe都将继承使用了一个PROVIDES语句,该语句将recipe标识为能够提供virtual/kernel项。
例如上面的语句成功的条件是相应的软件包中KERNEL_PACKAGE_NAME值要有kernel字符串,我们知道beaglebone-yocto机器使用了linux-yocto,因此可以这么看下这个变量是否有kernel字符串:
build]$ bitbake -e linux-yocto | grep -i ^KERNEL_PACKAGE_NAME=
KERNEL_PACKAGE_NAME="kernel"
- 1
- 2
是有的,因此PROVIDES语句生效。对比一下其他项目,比如learnyocto项目:
build]$ bitbake -e learnyocto | grep -i KERNEL_PACKAGE_NAME
# $KERNEL_PACKAGE_NAME
# $RDEPENDS_${KERNEL_PACKAGE_NAME}-base
RDEPENDS_${KERNEL_PACKAGE_NAME}-base=""
- 1
- 2
- 3
- 4
显然就没有这个变量。
结合实例讲解下这个继承关系:
首先在meta-yocto-bsp/conf/machine/beaglebone-yocto.conf文件中有这样一个定义:
PREFERRED_PROVIDER_virtual/kernel ?= "linux-yocto"
- 1
上文说了能使用virtual/kernel的recipe的bb文件中应该有PROVIDES或者继承了meta/classes/kernel.bbclass类,因此我们看下linux-yocto_5.4.bb文件中是否有二者中的一种。
如下文件meta/recipes-kernel/linux/linux-yocto_5.4.bb文件中我们可以看到这个定义:
require recipes-kernel/linux/linux-yocto.inc
- 1
而在linux-yocto.inc又有这个定义:
inherit kernel #继承了kernel.bbclass
- 1
综上,linux-yocto_5.4.bb文件中集成了kernel.bbclass文件的中的PROVIDES语句,
拥有了PROVIDES变量的bb文件,就可以在配置文件中指定优先选择的linux kernel recipe,即
#meta-yocto-bsp/conf/machine/beaglebone-yocto.conf文件中
PREFERRED_PROVIDER_virtual/kernel ?= "linux-yocto"
- 1
- 2
盆友们在做lyocto的inux开发时在使用bitbake编译linux kernel的时候可以这样编译:
bitbake virtual/kernel
- 1
实质就是:
bitbake linux-yocto
- 1
当然推荐使用:
bitbake virtual/kernel
- 1