当有多个菜谱提供同一个项目时,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”
除非开发人员另有选择,否则请确保始终首选带编号的稳定版本。