如果有多个bb文件提供菜谱。bitbake是如何选择最合适的菜谱的呢?

add_provider_internal的时候,在dataCache.providers中已经保存了所有的bbfile的信息
dataCache.providers是一个类似于多map的
比如 [linux-raspberrypi]={linux-raspberrypi_3.1.bb linux-raspberrypi_3.5.bb linux-raspberrypi_4.1.bb}


也就是说有3个bb菜谱提供 linux-raspberrypy这个item
我们需要挑选其中一个最合适的。
调用
eligible, foundUnique = bb.providers.filterProviders(all_p, item, cfgData, dataCache)
得到最合适的eligible
确定函数就在 bb.providers.filterProviders
首先对于bb菜谱名字在磁盘上排序,比如 5.1.bb 4.2.bb 6.0.bb排序为4.2 5.1 6.0
第二就是根据PN来分组,为什么会有bb文件使用PN来分组?
因为存在这样的情况,大部分属于同一个组。比如 
PN= linux-raspberrypi  那么{linux-raspberrypi_3.1.bb linux-raspberrypi_3.5.bb linux-raspberrypi_4.1.bb}都属于同一组
但是此时我有一个rpi.bb文件PN是linux-test-rpi,但是他也是linux-raspberrypi的提供者。比如通过在bb文件内使用PROVIDERS+=linux-raspberrypi。
那么就有两个组了
linux-raspberrypi={linux-raspberrypi_3.1.bb linux-raspberrypi_3.5.bb linux-raspberrypi_4.1.bb}
linux-test-rpi={rpi.bb}
首先根据PN将bb分组完毕


对于每一组pn .比如 linux-raspberrypi和linux-test-rpi分别进行下列操作


1 根据 PREFERRED_VERSIONS排序
步骤1.1
sortPriorities 这里描述是根据文件优先级和preference来排序
def sortPriorities(pn, dataCache, pkg_pn = None):
    """
    Reorder pkg_pn by file priority and default preference
    """
这里假定第一操作后排序没有变化
linux-raspberrypi={linux-raspberrypi_3.1.bb linux-raspberrypi_3.5.bb linux-raspberrypi_4.1.bb}
linux-test-rpi={rpi.bb}
步骤1.2
findPreferredProvider(pn, cfgData, dataCache, sortpkg_pn[pn], item)
主要是从配置文件中提取 PREFERRED_VERSION_{packagename}=version
通过version来匹配最合适的bb文件。
比如在
meta-raspberrypi/conf/machine/include/rpi-default-versions.inc中就定义了
PREFERRED_VERSION_linux-raspberrypi ?= "4.1.%"
说明构建linux-raspberrypi的时候更倾向于4.1.x的版本。


findPreferredProvider的规则是寻找第一个满足的版本。后续的直接忽略掉。
比如磁盘上有4.1.1 4.1.2 4.1.3那么匹配4.1.%都是匹配的。但是由于已经匹配了4.1.1,那么就直接break了
就取4.1.1的这个bb文件




将每一组的第一个取出来放到eligable中。如果没有PREFERRED_VERSION_。那么eligable为NONE


步骤1.3
如果1.2的bb数据存在。那么步骤1.3不执行。
否则就通过findLatestProvider使用最新的版本的bb文件。也就是匹配PN的最新版本。


简而言之
如果有PREFERRED_VERSION_xxx就取PREFERRED_VERSION的第一个满足要求的版本
如果没有。那么就取版本最高的一个。




Logo

更多推荐