diff options
| -rw-r--r-- | bitbake/lib/bb/providers.py | 62 | ||||
| -rw-r--r-- | bitbake/lib/bb/ui/knotty.py | 5 |
2 files changed, 44 insertions, 23 deletions
diff --git a/bitbake/lib/bb/providers.py b/bitbake/lib/bb/providers.py index 8195d62a11..563a091fda 100644 --- a/bitbake/lib/bb/providers.py +++ b/bitbake/lib/bb/providers.py | |||
| @@ -317,32 +317,50 @@ def filterProvidersRunTime(providers, item, cfgData, dataCache): | |||
| 317 | 317 | ||
| 318 | eligible = _filterProviders(providers, item, cfgData, dataCache) | 318 | eligible = _filterProviders(providers, item, cfgData, dataCache) |
| 319 | 319 | ||
| 320 | # Should use dataCache.preferred here? | 320 | # First try and match any PREFERRED_RPROVIDER entry |
| 321 | preferred = [] | 321 | prefervar = cfgData.getVar('PREFERRED_RPROVIDER_%s' % item, True) |
| 322 | preferred_vars = [] | 322 | foundUnique = False |
| 323 | pns = {} | 323 | if prefervar: |
| 324 | for p in eligible: | 324 | for p in eligible: |
| 325 | pns[dataCache.pkg_fn[p]] = p | 325 | pn = dataCache.pkg_fn[p] |
| 326 | for p in eligible: | 326 | if prefervar == pn: |
| 327 | pn = dataCache.pkg_fn[p] | 327 | logger.verbose("selecting %s to satisfy %s due to PREFERRED_RPROVIDER", pn, item) |
| 328 | provides = dataCache.pn_provides[pn] | 328 | eligible.remove(p) |
| 329 | for provide in provides: | 329 | eligible = [p] + eligible |
| 330 | prefervar = cfgData.getVar('PREFERRED_PROVIDER_%s' % provide, True) | 330 | foundUnique = True |
| 331 | #logger.debug(1, "checking PREFERRED_PROVIDER_%s (value %s) against %s", provide, prefervar, pns.keys()) | 331 | numberPreferred = 1 |
| 332 | if prefervar in pns and pns[prefervar] not in preferred: | ||
| 333 | var = "PREFERRED_PROVIDER_%s = %s" % (provide, prefervar) | ||
| 334 | logger.verbose("selecting %s to satisfy runtime %s due to %s", prefervar, item, var) | ||
| 335 | preferred_vars.append(var) | ||
| 336 | pref = pns[prefervar] | ||
| 337 | eligible.remove(pref) | ||
| 338 | eligible = [pref] + eligible | ||
| 339 | preferred.append(pref) | ||
| 340 | break | 332 | break |
| 341 | 333 | ||
| 342 | numberPreferred = len(preferred) | 334 | # If we didn't find an RPROVIDER entry, try and infer the provider from PREFERRED_PROVIDER entries |
| 335 | # by looking through the provides of each eligible recipe and seeing if a PREFERRED_PROVIDER was set. | ||
| 336 | # This is most useful for virtual/ entries rather than having a RPROVIDER per entry. | ||
| 337 | if not foundUnique: | ||
| 338 | # Should use dataCache.preferred here? | ||
| 339 | preferred = [] | ||
| 340 | preferred_vars = [] | ||
| 341 | pns = {} | ||
| 342 | for p in eligible: | ||
| 343 | pns[dataCache.pkg_fn[p]] = p | ||
| 344 | for p in eligible: | ||
| 345 | pn = dataCache.pkg_fn[p] | ||
| 346 | provides = dataCache.pn_provides[pn] | ||
| 347 | for provide in provides: | ||
| 348 | prefervar = cfgData.getVar('PREFERRED_PROVIDER_%s' % provide, True) | ||
| 349 | #logger.debug(1, "checking PREFERRED_PROVIDER_%s (value %s) against %s", provide, prefervar, pns.keys()) | ||
| 350 | if prefervar in pns and pns[prefervar] not in preferred: | ||
| 351 | var = "PREFERRED_PROVIDER_%s = %s" % (provide, prefervar) | ||
| 352 | logger.verbose("selecting %s to satisfy runtime %s due to %s", prefervar, item, var) | ||
| 353 | preferred_vars.append(var) | ||
| 354 | pref = pns[prefervar] | ||
| 355 | eligible.remove(pref) | ||
| 356 | eligible = [pref] + eligible | ||
| 357 | preferred.append(pref) | ||
| 358 | break | ||
| 359 | |||
| 360 | numberPreferred = len(preferred) | ||
| 343 | 361 | ||
| 344 | if numberPreferred > 1: | 362 | if numberPreferred > 1: |
| 345 | logger.error("Trying to resolve runtime dependency %s resulted in conflicting PREFERRED_PROVIDER entries being found.\nThe providers found were: %s\nThe PREFERRED_PROVIDER entries resulting in this conflict were: %s", item, preferred, preferred_vars) | 363 | logger.error("Trying to resolve runtime dependency %s resulted in conflicting PREFERRED_PROVIDER entries being found.\nThe providers found were: %s\nThe PREFERRED_PROVIDER entries resulting in this conflict were: %s. You could set PREFERRED_RPROVIDER_%s" % (item, preferred, preferred_vars, item)) |
| 346 | 364 | ||
| 347 | logger.debug(1, "sorted runtime providers for %s are: %s", item, eligible) | 365 | logger.debug(1, "sorted runtime providers for %s are: %s", item, eligible) |
| 348 | 366 | ||
diff --git a/bitbake/lib/bb/ui/knotty.py b/bitbake/lib/bb/ui/knotty.py index 2fc20cfb53..268562770a 100644 --- a/bitbake/lib/bb/ui/knotty.py +++ b/bitbake/lib/bb/ui/knotty.py | |||
| @@ -453,7 +453,10 @@ def main(server, eventHandler, params, tf = TerminalFilter): | |||
| 453 | logger.info("multiple providers are available for %s%s (%s)", event._is_runtime and "runtime " or "", | 453 | logger.info("multiple providers are available for %s%s (%s)", event._is_runtime and "runtime " or "", |
| 454 | event._item, | 454 | event._item, |
| 455 | ", ".join(event._candidates)) | 455 | ", ".join(event._candidates)) |
| 456 | logger.info("consider defining a PREFERRED_PROVIDER entry to match %s", event._item) | 456 | rtime = "" |
| 457 | if event._is_runtime: | ||
| 458 | rtime = "R" | ||
| 459 | logger.info("consider defining a PREFERRED_%sPROVIDER entry to match %s" % (rtime, event._item)) | ||
| 457 | continue | 460 | continue |
| 458 | if isinstance(event, bb.event.NoProvider): | 461 | if isinstance(event, bb.event.NoProvider): |
| 459 | if event._runtime: | 462 | if event._runtime: |
