Yocto边玩边学:BitBake中的优先选择变量PREFERRED_PROVIDER

当有多个菜谱提供同一个项目时,BitBake会使用PREFERRED_PROVIDER来优先选择其中一个菜谱。你需要在变量后缀指定被提供项目的名称,并将其设置为你想优先使用的配方的PN。这里是一些例子:

     PREFERRED_PROVIDER_virtual/kernel ?= "linux-yocto"
     PREFERRED_PROVIDER_virtual/xserver = "xserver-xf86"
     PREFERRED_PROVIDER_virtual/libgl ?= "mesa"

这个变量起作用的逻辑基于提供者Providers和首选项Preferences,下面分别简单介绍它们的原理。

提供者Providers

假定BitBake被指定执行目标,并且已解析所有配方文件,那么BitBake需要弄清楚如何构建这个目标。BitBake会在PROVIDES列表中查找每个菜谱,一个PROVIDES表单是由已知菜谱名称组成的列表。每个菜谱的PROVIDES列表既可以通过菜谱的PN变量隐式创建,也可以通过菜谱的PROVIDES变量(可选的)显式创建。

当一个菜谱使用PROVIDES变量时,我们就可以用一个不是隐式PN名字的替换名称来找到该菜谱的所有功能。例如,假设一个名为keyboard_1.0.bb的菜谱包含以下内容:

     PROVIDES += "fullkeyboard"

该菜谱的PROVIDES列表将成为“keyboard”(隐式的)和“fullkeyboard”(显式的)。因此,keyboard_1.0.bb的所有功能可以在这两个不同的名称下找到。

首选项Preferences

PROVIDES列表只是确定目标菜谱的解决方案的一部分。由于目标可能有多个提供者,因此BitBake需要通过指定提供者首选项来对提供者进行优先级排序。

目标具有多个提供者的常见示例是“virtual/kernel”,它在每个内核菜谱的PROVIDES列表中。每一个machine通常使用配置文件中类似的行来选择最佳内核提供者:

     PREFERRED_PROVIDER_virtual/kernel = "linux-yocto"

缺省 PREFERRED_PROVIDER 值是与目标名称相同的提供者。BitBake遍历需要构建的每个目标,并使用此过程解决它们之间的依赖性。

由于给定提供者可能存在多个版本,因此了解如何选择提供者变得很复杂。BitBake默认选择提供者的最高版本。你可以使用 PREFERRED_VERSION 变量来指定特定版本。你也可以通过使用DEFAULT_PREFERENCE 变量来影响选择顺序 。

默认情况下,文件的首选项为“0”。DEFAULT_PREFERENCE变量除非被明确引用,否则会被设置为“ -1”,这样该菜谱就不太可能使用了。设置DEFAULT_PREFERENCE为“1”的话,就很很可能会使用该菜谱。 PREFERRED_VERSION变量值会覆盖任何 DEFAULT_PREFERENCE设置。 DEFAULT_PREFERENCE通常用于标记较新的和实验性的菜谱版本,直到它们经过足够的测试才能认为是稳定的。

当给定菜谱有多个“版本”时,除非另有说明,否则BitBake默认选择最新版本。如果所讨论的菜谱的 DEFAULT_PREFERENCE 设置低于其他菜谱(默认值为0),则不会选择该菜谱。这使维护菜谱文件存储库的人员可以指定其所偏好的默认版本。另外,用户也可以指定他们的首选版本。

如果第一个菜谱名为a_1.1.bb,则PN变量将设置为“a”, PV 变量将设置为1.1。

因此,如果存在一个名为a_1.2.bb的食谱,则默认情况下BitBake将选择1.2。但是,如果在BitBake解析的.conf文件中定义以下变量 ,则可以更改该首选项:

     PREFERRED_VERSION_a = "1.1"
注意
菜谱通常会提供两个版本-一个稳定的,有编号的(首选的)版本,以及从源代码存储库自动检出的版本,该版本被认为是“出血边缘”(不稳定版本),所以只能显式选择。

例如,在OpenEmbedded代码库中,有一个适用于BusyBox的标准版本菜谱文件 busybox_1.22.1.bb,但也有一个基于Git的版本 busybox_git.bb,该文件显式包含以下行:

    DEFAULT_PREFERENCE =“ -1”
                
除非开发人员另有选择,否则请确保始终首选带编号的稳定版本。

你可能感兴趣的:(Yocto)