diff options
Diffstat (limited to 'bitbake/lib/bb/providers.py')
-rw-r--r-- | bitbake/lib/bb/providers.py | 94 |
1 files changed, 73 insertions, 21 deletions
diff --git a/bitbake/lib/bb/providers.py b/bitbake/lib/bb/providers.py index e6f08fb4b..da762d3d5 100644 --- a/bitbake/lib/bb/providers.py +++ b/bitbake/lib/bb/providers.py @@ -31,12 +31,12 @@ class NoProvider(Exception): class NoRProvider(Exception): """Exception raised when no provider of a runtime dependency can be found""" -def findBestProvider(pn, cfgData, dataCache, pkg_pn = None, item = None): + +def sortPriorities(pn, dataCache, pkg_pn = None): """ - If there is a PREFERRED_VERSION, find the highest-priority bbfile - providing that version. If not, find the latest version provided by - an bbfile in the highest-priority set. + Reorder pkg_pn by file priority and default preference """ + if not pkg_pn: pkg_pn = dataCache.pkg_pn @@ -44,14 +44,30 @@ def findBestProvider(pn, cfgData, dataCache, pkg_pn = None, item = None): priorities = {} for f in files: priority = dataCache.bbfile_priority[f] + preference = dataCache.pkg_dp[f] if priority not in priorities: - priorities[priority] = [] - priorities[priority].append(f) - p_list = priorities.keys() - p_list.sort(lambda a, b: a - b) + priorities[priority] = {} + if preference not in priorities[priority]: + priorities[priority][preference] = [] + priorities[priority][preference].append(f) + pri_list = priorities.keys() + pri_list.sort(lambda a, b: a - b) tmp_pn = [] - for p in p_list: - tmp_pn = [priorities[p]] + tmp_pn + for pri in pri_list: + pref_list = priorities[pri].keys() + pref_list.sort(lambda a, b: b - a) + tmp_pref = [] + for pref in pref_list: + tmp_pref.extend(priorities[pri][pref]) + tmp_pn = [tmp_pref] + tmp_pn + + return tmp_pn + + +def findPreferredProvider(pn, cfgData, dataCache, pkg_pn = None, item = None): + """ + Find the first provider in pkg_pn with a PREFERRED_VERSION set. + """ preferred_file = None @@ -76,7 +92,7 @@ def findBestProvider(pn, cfgData, dataCache, pkg_pn = None, item = None): preferred_e = None preferred_r = None - for file_set in tmp_pn: + for file_set in pkg_pn: for f in file_set: pe,pv,pr = dataCache.pkg_pepvpr[f] if preferred_v == pv and (preferred_r == pr or preferred_r == None) and (preferred_e == pe or preferred_e == None): @@ -99,14 +115,18 @@ def findBestProvider(pn, cfgData, dataCache, pkg_pn = None, item = None): else: bb.msg.debug(1, bb.msg.domain.Provider, "selecting %s as PREFERRED_VERSION %s of package %s%s" % (preferred_file, pv_str, pn, itemstr)) - del localdata + return (preferred_v, preferred_file) + - # get highest priority file set - files = tmp_pn[0] +def findLatestProvider(pn, cfgData, dataCache, file_set): + """ + Return the highest version of the providers in file_set. + Take default preferences into account. + """ latest = None latest_p = 0 latest_f = None - for file_name in files: + for file_name in file_set: pe,pv,pr = dataCache.pkg_pepvpr[file_name] dp = dataCache.pkg_dp[file_name] @@ -114,11 +134,29 @@ def findBestProvider(pn, cfgData, dataCache, pkg_pn = None, item = None): latest = (pe, pv, pr) latest_f = file_name latest_p = dp + + return (latest, latest_f) + + +def findBestProvider(pn, cfgData, dataCache, pkg_pn = None, item = None): + """ + If there is a PREFERRED_VERSION, find the highest-priority bbfile + providing that version. If not, find the latest version provided by + an bbfile in the highest-priority set. + """ + + sortpkg_pn = sortPriorities(pn, dataCache, pkg_pn) + # Find the highest priority provider with a PREFERRED_VERSION set + (preferred_ver, preferred_file) = findPreferredProvider(pn, cfgData, dataCache, sortpkg_pn, item) + # Find the latest version of the highest priority provider + (latest, latest_f) = findLatestProvider(pn, cfgData, dataCache, sortpkg_pn[0]) + if preferred_file is None: preferred_file = latest_f preferred_ver = latest - return (latest,latest_f,preferred_ver, preferred_file) + return (latest, latest_f, preferred_ver, preferred_file) + def _filterProviders(providers, item, cfgData, dataCache): """ @@ -127,6 +165,7 @@ def _filterProviders(providers, item, cfgData, dataCache): """ eligible = [] preferred_versions = {} + sortpkg_pn = {} # The order of providers depends on the order of the files on the disk # up to here. Sort pkg_pn to make dependency issues reproducible rather @@ -143,15 +182,24 @@ def _filterProviders(providers, item, cfgData, dataCache): bb.msg.debug(1, bb.msg.domain.Provider, "providers for %s are: %s" % (item, pkg_pn.keys())) + # First add PREFERRED_VERSIONS + for pn in pkg_pn.keys(): + sortpkg_pn[pn] = sortPriorities(pn, dataCache, pkg_pn) + preferred_versions[pn] = findPreferredProvider(pn, cfgData, dataCache, sortpkg_pn[pn], item) + if preferred_versions[pn][1]: + eligible.append(preferred_versions[pn][1]) + + # Now add latest verisons for pn in pkg_pn.keys(): - preferred_versions[pn] = bb.providers.findBestProvider(pn, cfgData, dataCache, pkg_pn, item)[2:4] + if pn in preferred_versions and preferred_versions[pn][1]: + continue + preferred_versions[pn] = findLatestProvider(pn, cfgData, dataCache, sortpkg_pn[pn][0]) eligible.append(preferred_versions[pn][1]) if len(eligible) == 0: bb.msg.error(bb.msg.domain.Provider, "no eligible providers for %s" % item) return 0 - # If pn == item, give it a slight default preference # This means PREFERRED_PROVIDER_foobar defaults to foobar if available for p in providers: @@ -192,7 +240,7 @@ def _filterProviders(providers, item, cfgData, dataCache): eligible = [fn] + eligible break - return eligible, preferred_versions + return eligible def filterProviders(providers, item, cfgData, dataCache): @@ -202,7 +250,7 @@ def filterProviders(providers, item, cfgData, dataCache): Takes a "normal" target item """ - eligible, pref_vers = _filterProviders(providers, item, cfgData, dataCache) + eligible = _filterProviders(providers, item, cfgData, dataCache) prefervar = bb.data.getVar('PREFERRED_PROVIDER_%s' % item, cfgData, 1) if prefervar: @@ -219,6 +267,8 @@ def filterProviders(providers, item, cfgData, dataCache): foundUnique = True break + bb.msg.debug(1, bb.msg.domain.Provider, "sorted providers for %s are: %s" % (item, eligible)) + return eligible, foundUnique def filterProvidersRunTime(providers, item, cfgData, dataCache): @@ -228,7 +278,7 @@ def filterProvidersRunTime(providers, item, cfgData, dataCache): Takes a "runtime" target item """ - eligible, pref_vers = _filterProviders(providers, item, cfgData, dataCache) + eligible = _filterProviders(providers, item, cfgData, dataCache) # Should use dataCache.preferred here? preferred = [] @@ -246,6 +296,8 @@ def filterProvidersRunTime(providers, item, cfgData, dataCache): numberPreferred = len(preferred) + bb.msg.debug(1, bb.msg.domain.Provider, "sorted providers for %s are: %s" % (item, eligible)) + return eligible, numberPreferred def getRuntimeProviders(dataCache, rdepend): |