yocto-第38篇-beaglebone-yocto.conf配置分析之PREFERRED_PROVIDER变量

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