summaryrefslogtreecommitdiffstats
path: root/lib/bb/taskdata.py
diff options
context:
space:
mode:
authorPaul Eggleton <paul.eggleton@linux.intel.com>2011-07-25 14:54:41 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2011-07-27 16:53:03 +0100
commit6765218430e31c165888f26fbc75023c89a6eab2 (patch)
treef6d07a6260bd87c040a71b6e1355f641be5c991d /lib/bb/taskdata.py
parentfb47c7452455f3f8d943b21dd61300ec55eea141 (diff)
downloadbitbake-6765218430e31c165888f26fbc75023c89a6eab2.tar.gz
bitbake: show more information for NoProvider errors
"Nothing PROVIDES" errors often come up when a recipe has been skipped for some reason, and therefore it is useful to print out that reason information when showing the error so that the user understands why the error has occurred. Given that we already feed the reason information into the skiplist for various situations (COMMERCIAL_LICENSE, COMPATIBLE_MACHINE etc.) this should now output a useful error message for skipped recipes. Fixes [YOCTO #846], [YOCTO #1127] Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'lib/bb/taskdata.py')
-rw-r--r--lib/bb/taskdata.py28
1 files changed, 23 insertions, 5 deletions
diff --git a/lib/bb/taskdata.py b/lib/bb/taskdata.py
index 81a42b7b5..e857f9afc 100644
--- a/lib/bb/taskdata.py
+++ b/lib/bb/taskdata.py
@@ -41,7 +41,7 @@ class TaskData:
"""
BitBake Task Data implementation
"""
- def __init__(self, abort = True, tryaltconfigs = False):
+ def __init__(self, abort = True, tryaltconfigs = False, skiplist = None):
self.build_names_index = []
self.run_names_index = []
self.fn_index = []
@@ -70,6 +70,8 @@ class TaskData:
self.abort = abort
self.tryaltconfigs = tryaltconfigs
+ self.skiplist = skiplist
+
def getbuild_id(self, name):
"""
Return an ID number for the build target name.
@@ -348,6 +350,22 @@ class TaskData:
dependees.append(self.fn_index[fnid])
return dependees
+ def get_reasons(self, item, runtime=False):
+ """
+ Get the reason(s) for an item not being provided, if any
+ """
+ reasons = []
+ if self.skiplist:
+ for fn in self.skiplist:
+ skipitem = self.skiplist[fn]
+ if skipitem.pn == item:
+ reasons.append("%s was skipped: %s" % (skipitem.pn, skipitem.skipreason))
+ elif runtime and item in skipitem.rprovides:
+ reasons.append("%s RPROVIDES %s but was skipped: %s" % (skipitem.pn, item, skipitem.skipreason))
+ elif not runtime and item in skipitem.provides:
+ reasons.append("%s PROVIDES %s but was skipped: %s" % (skipitem.pn, item, skipitem.skipreason))
+ return reasons
+
def add_provider(self, cfgData, dataCache, item):
try:
self.add_provider_internal(cfgData, dataCache, item)
@@ -369,7 +387,7 @@ class TaskData:
return
if not item in dataCache.providers:
- bb.event.fire(bb.event.NoProvider(item, dependees=self.get_rdependees_str(item)), cfgData)
+ bb.event.fire(bb.event.NoProvider(item, dependees=self.get_rdependees_str(item), reasons=self.get_reasons(item)), cfgData)
raise bb.providers.NoProvider(item)
if self.have_build_target(item):
@@ -381,7 +399,7 @@ class TaskData:
eligible = [p for p in eligible if not self.getfn_id(p) in self.failed_fnids]
if not eligible:
- bb.event.fire(bb.event.NoProvider(item, dependees=self.get_dependees_str(item)), cfgData)
+ bb.event.fire(bb.event.NoProvider(item, dependees=self.get_dependees_str(item), reasons=["No eligible PROVIDERs exist for '%s'" % item]), cfgData)
raise bb.providers.NoProvider(item)
if len(eligible) > 1 and foundUnique == False:
@@ -418,14 +436,14 @@ class TaskData:
all_p = bb.providers.getRuntimeProviders(dataCache, item)
if not all_p:
- bb.event.fire(bb.event.NoProvider(item, runtime=True, dependees=self.get_rdependees_str(item)), cfgData)
+ bb.event.fire(bb.event.NoProvider(item, runtime=True, dependees=self.get_rdependees_str(item), reasons=self.get_reasons(item, True)), cfgData)
raise bb.providers.NoRProvider(item)
eligible, numberPreferred = bb.providers.filterProvidersRunTime(all_p, item, cfgData, dataCache)
eligible = [p for p in eligible if not self.getfn_id(p) in self.failed_fnids]
if not eligible:
- bb.event.fire(bb.event.NoProvider(item, runtime=True, dependees=self.get_rdependees_str(item)), cfgData)
+ bb.event.fire(bb.event.NoProvider(item, runtime=True, dependees=self.get_rdependees_str(item), reasons=["No eligible RPROVIDERs exist for '%s'" % item]), cfgData)
raise bb.providers.NoRProvider(item)
if len(eligible) > 1 and numberPreferred == 0: