summaryrefslogtreecommitdiffstats
path: root/bitbake
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2016-04-14 14:30:52 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2016-04-15 06:59:44 +0100
commit9f374c4e8523430ef2fc5cb492c3ece9786623d2 (patch)
tree325323dce354e1b5a0b0f82df56573752aac2938 /bitbake
parent4b8b1105a59f5d5849a9a40c190e45e882571995 (diff)
downloadpoky-9f374c4e8523430ef2fc5cb492c3ece9786623d2.tar.gz
bitbake: providers: Add PREFERRED_RPROVIDER support
Sometimes you can end up in a situation where you need to specify that a specific runtime entity should be provided by a specific entry. An example of this is bluez where you could end up in a situation where for example: NOTE: multiple providers are available for runtime libasound-module-bluez (bluez4, bluez5) NOTE: consider defining a PREFERRED_PROVIDER entry to match libasound-module-bluez NOTE: multiple providers are available for runtime bluez-hcidump (bluez-hcidump, bluez5) NOTE: consider defining a PREFERRED_PROVIDER entry to match bluez-hcidump The only option here is to set something like PREFERRED_PROVIDER_bluez4 = "bluez4" which is clearly not very informative. I've actually held off adding RPROVIDER support for a long while as this does have sigificant potential for misuse. It doesn't for example allow multiple runtime providers of the same name to coexist, that simply isn't supported. It therefore doesn't replace some of the name mappings such as busybox verses coreutils that OE-Core faces as that is a different problem with different constraints. This mechanism is simply to provide bitbake with a hint to decide what the dependency tree should look like. Also, this allows us to stop printing a confusing message telling the user to set PREFERRED_PROVIDER when the setting needed would be rather ambiguous. [YOCTO #5044] (Bitbake rev: 62eb39d1474d024b204634689071700605c6095c) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake')
-rw-r--r--bitbake/lib/bb/providers.py62
-rw-r--r--bitbake/lib/bb/ui/knotty.py5
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: