diff options
-rw-r--r-- | bitbake/lib/bb/cache.py | 3 | ||||
-rw-r--r-- | bitbake/lib/bb/cooker.py | 6 | ||||
-rw-r--r-- | bitbake/lib/bb/event.py | 3 | ||||
-rw-r--r-- | bitbake/lib/bb/taskdata.py | 28 | ||||
-rw-r--r-- | bitbake/lib/bb/ui/knotty.py | 3 |
5 files changed, 34 insertions, 9 deletions
diff --git a/bitbake/lib/bb/cache.py b/bitbake/lib/bb/cache.py index 58d5847f15..d805d46d07 100644 --- a/bitbake/lib/bb/cache.py +++ b/bitbake/lib/bb/cache.py | |||
@@ -43,7 +43,7 @@ except ImportError: | |||
43 | logger.info("Importing cPickle failed. " | 43 | logger.info("Importing cPickle failed. " |
44 | "Falling back to a very slow implementation.") | 44 | "Falling back to a very slow implementation.") |
45 | 45 | ||
46 | __cache_version__ = "141" | 46 | __cache_version__ = "142" |
47 | 47 | ||
48 | def getCacheFile(path, filename): | 48 | def getCacheFile(path, filename): |
49 | return os.path.join(path, filename) | 49 | return os.path.join(path, filename) |
@@ -99,6 +99,7 @@ class CoreRecipeInfo(RecipeInfoCommon): | |||
99 | 99 | ||
100 | self.skipreason = self.getvar('__SKIPPED', metadata) | 100 | self.skipreason = self.getvar('__SKIPPED', metadata) |
101 | if self.skipreason: | 101 | if self.skipreason: |
102 | self.pn = self.getvar('PN', metadata) or bb.parse.BBHandler.vars_from_file(filename,metadata)[0] | ||
102 | self.skipped = True | 103 | self.skipped = True |
103 | self.provides = self.depvar('PROVIDES', metadata) | 104 | self.provides = self.depvar('PROVIDES', metadata) |
104 | self.rprovides = self.depvar('RPROVIDES', metadata) | 105 | self.rprovides = self.depvar('RPROVIDES', metadata) |
diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py index 9d0a6d49b5..33b684fbd8 100644 --- a/bitbake/lib/bb/cooker.py +++ b/bitbake/lib/bb/cooker.py | |||
@@ -59,11 +59,13 @@ class state: | |||
59 | 59 | ||
60 | class SkippedPackage: | 60 | class SkippedPackage: |
61 | def __init__(self, info = None, reason = None): | 61 | def __init__(self, info = None, reason = None): |
62 | self.pn = None | ||
62 | self.skipreason = None | 63 | self.skipreason = None |
63 | self.provides = None | 64 | self.provides = None |
64 | self.rprovides = None | 65 | self.rprovides = None |
65 | 66 | ||
66 | if info: | 67 | if info: |
68 | self.pn = info.pn | ||
67 | self.skipreason = info.skipreason | 69 | self.skipreason = info.skipreason |
68 | self.provides = info.provides | 70 | self.provides = info.provides |
69 | self.rprovides = info.rprovides | 71 | self.rprovides = info.rprovides |
@@ -328,7 +330,7 @@ class BBCooker: | |||
328 | bb.data.expandKeys(localdata) | 330 | bb.data.expandKeys(localdata) |
329 | # We set abort to False here to prevent unbuildable targets raising | 331 | # We set abort to False here to prevent unbuildable targets raising |
330 | # an exception when we're just generating data | 332 | # an exception when we're just generating data |
331 | taskdata = bb.taskdata.TaskData(False) | 333 | taskdata = bb.taskdata.TaskData(False, skiplist=self.skiplist) |
332 | 334 | ||
333 | runlist = [] | 335 | runlist = [] |
334 | for k in pkgs_to_build: | 336 | for k in pkgs_to_build: |
@@ -1060,7 +1062,7 @@ class BBCooker: | |||
1060 | bb.data.update_data(localdata) | 1062 | bb.data.update_data(localdata) |
1061 | bb.data.expandKeys(localdata) | 1063 | bb.data.expandKeys(localdata) |
1062 | 1064 | ||
1063 | taskdata = bb.taskdata.TaskData(self.configuration.abort) | 1065 | taskdata = bb.taskdata.TaskData(self.configuration.abort, skiplist=self.skiplist) |
1064 | 1066 | ||
1065 | runlist = [] | 1067 | runlist = [] |
1066 | for k in targets: | 1068 | for k in targets: |
diff --git a/bitbake/lib/bb/event.py b/bitbake/lib/bb/event.py index 93c04ba21a..9dd7b663ee 100644 --- a/bitbake/lib/bb/event.py +++ b/bitbake/lib/bb/event.py | |||
@@ -287,11 +287,12 @@ class BuildCompleted(BuildBase): | |||
287 | class NoProvider(Event): | 287 | class NoProvider(Event): |
288 | """No Provider for an Event""" | 288 | """No Provider for an Event""" |
289 | 289 | ||
290 | def __init__(self, item, runtime=False, dependees=None): | 290 | def __init__(self, item, runtime=False, dependees=None, reasons=[]): |
291 | Event.__init__(self) | 291 | Event.__init__(self) |
292 | self._item = item | 292 | self._item = item |
293 | self._runtime = runtime | 293 | self._runtime = runtime |
294 | self._dependees = dependees | 294 | self._dependees = dependees |
295 | self._reasons = reasons | ||
295 | 296 | ||
296 | def getItem(self): | 297 | def getItem(self): |
297 | return self._item | 298 | return self._item |
diff --git a/bitbake/lib/bb/taskdata.py b/bitbake/lib/bb/taskdata.py index 81a42b7b53..e857f9afcb 100644 --- a/bitbake/lib/bb/taskdata.py +++ b/bitbake/lib/bb/taskdata.py | |||
@@ -41,7 +41,7 @@ class TaskData: | |||
41 | """ | 41 | """ |
42 | BitBake Task Data implementation | 42 | BitBake Task Data implementation |
43 | """ | 43 | """ |
44 | def __init__(self, abort = True, tryaltconfigs = False): | 44 | def __init__(self, abort = True, tryaltconfigs = False, skiplist = None): |
45 | self.build_names_index = [] | 45 | self.build_names_index = [] |
46 | self.run_names_index = [] | 46 | self.run_names_index = [] |
47 | self.fn_index = [] | 47 | self.fn_index = [] |
@@ -70,6 +70,8 @@ class TaskData: | |||
70 | self.abort = abort | 70 | self.abort = abort |
71 | self.tryaltconfigs = tryaltconfigs | 71 | self.tryaltconfigs = tryaltconfigs |
72 | 72 | ||
73 | self.skiplist = skiplist | ||
74 | |||
73 | def getbuild_id(self, name): | 75 | def getbuild_id(self, name): |
74 | """ | 76 | """ |
75 | Return an ID number for the build target name. | 77 | Return an ID number for the build target name. |
@@ -348,6 +350,22 @@ class TaskData: | |||
348 | dependees.append(self.fn_index[fnid]) | 350 | dependees.append(self.fn_index[fnid]) |
349 | return dependees | 351 | return dependees |
350 | 352 | ||
353 | def get_reasons(self, item, runtime=False): | ||
354 | """ | ||
355 | Get the reason(s) for an item not being provided, if any | ||
356 | """ | ||
357 | reasons = [] | ||
358 | if self.skiplist: | ||
359 | for fn in self.skiplist: | ||
360 | skipitem = self.skiplist[fn] | ||
361 | if skipitem.pn == item: | ||
362 | reasons.append("%s was skipped: %s" % (skipitem.pn, skipitem.skipreason)) | ||
363 | elif runtime and item in skipitem.rprovides: | ||
364 | reasons.append("%s RPROVIDES %s but was skipped: %s" % (skipitem.pn, item, skipitem.skipreason)) | ||
365 | elif not runtime and item in skipitem.provides: | ||
366 | reasons.append("%s PROVIDES %s but was skipped: %s" % (skipitem.pn, item, skipitem.skipreason)) | ||
367 | return reasons | ||
368 | |||
351 | def add_provider(self, cfgData, dataCache, item): | 369 | def add_provider(self, cfgData, dataCache, item): |
352 | try: | 370 | try: |
353 | self.add_provider_internal(cfgData, dataCache, item) | 371 | self.add_provider_internal(cfgData, dataCache, item) |
@@ -369,7 +387,7 @@ class TaskData: | |||
369 | return | 387 | return |
370 | 388 | ||
371 | if not item in dataCache.providers: | 389 | if not item in dataCache.providers: |
372 | bb.event.fire(bb.event.NoProvider(item, dependees=self.get_rdependees_str(item)), cfgData) | 390 | bb.event.fire(bb.event.NoProvider(item, dependees=self.get_rdependees_str(item), reasons=self.get_reasons(item)), cfgData) |
373 | raise bb.providers.NoProvider(item) | 391 | raise bb.providers.NoProvider(item) |
374 | 392 | ||
375 | if self.have_build_target(item): | 393 | if self.have_build_target(item): |
@@ -381,7 +399,7 @@ class TaskData: | |||
381 | eligible = [p for p in eligible if not self.getfn_id(p) in self.failed_fnids] | 399 | eligible = [p for p in eligible if not self.getfn_id(p) in self.failed_fnids] |
382 | 400 | ||
383 | if not eligible: | 401 | if not eligible: |
384 | bb.event.fire(bb.event.NoProvider(item, dependees=self.get_dependees_str(item)), cfgData) | 402 | bb.event.fire(bb.event.NoProvider(item, dependees=self.get_dependees_str(item), reasons=["No eligible PROVIDERs exist for '%s'" % item]), cfgData) |
385 | raise bb.providers.NoProvider(item) | 403 | raise bb.providers.NoProvider(item) |
386 | 404 | ||
387 | if len(eligible) > 1 and foundUnique == False: | 405 | if len(eligible) > 1 and foundUnique == False: |
@@ -418,14 +436,14 @@ class TaskData: | |||
418 | all_p = bb.providers.getRuntimeProviders(dataCache, item) | 436 | all_p = bb.providers.getRuntimeProviders(dataCache, item) |
419 | 437 | ||
420 | if not all_p: | 438 | if not all_p: |
421 | bb.event.fire(bb.event.NoProvider(item, runtime=True, dependees=self.get_rdependees_str(item)), cfgData) | 439 | bb.event.fire(bb.event.NoProvider(item, runtime=True, dependees=self.get_rdependees_str(item), reasons=self.get_reasons(item, True)), cfgData) |
422 | raise bb.providers.NoRProvider(item) | 440 | raise bb.providers.NoRProvider(item) |
423 | 441 | ||
424 | eligible, numberPreferred = bb.providers.filterProvidersRunTime(all_p, item, cfgData, dataCache) | 442 | eligible, numberPreferred = bb.providers.filterProvidersRunTime(all_p, item, cfgData, dataCache) |
425 | eligible = [p for p in eligible if not self.getfn_id(p) in self.failed_fnids] | 443 | eligible = [p for p in eligible if not self.getfn_id(p) in self.failed_fnids] |
426 | 444 | ||
427 | if not eligible: | 445 | if not eligible: |
428 | bb.event.fire(bb.event.NoProvider(item, runtime=True, dependees=self.get_rdependees_str(item)), cfgData) | 446 | bb.event.fire(bb.event.NoProvider(item, runtime=True, dependees=self.get_rdependees_str(item), reasons=["No eligible RPROVIDERs exist for '%s'" % item]), cfgData) |
429 | raise bb.providers.NoRProvider(item) | 447 | raise bb.providers.NoRProvider(item) |
430 | 448 | ||
431 | if len(eligible) > 1 and numberPreferred == 0: | 449 | if len(eligible) > 1 and numberPreferred == 0: |
diff --git a/bitbake/lib/bb/ui/knotty.py b/bitbake/lib/bb/ui/knotty.py index a4deb468bb..b7abdf8943 100644 --- a/bitbake/lib/bb/ui/knotty.py +++ b/bitbake/lib/bb/ui/knotty.py | |||
@@ -208,6 +208,9 @@ def main(server, eventHandler): | |||
208 | logger.error("Nothing %sPROVIDES '%s' (but %s %sDEPENDS on or otherwise requires it)", r, event._item, ", ".join(event._dependees), r) | 208 | logger.error("Nothing %sPROVIDES '%s' (but %s %sDEPENDS on or otherwise requires it)", r, event._item, ", ".join(event._dependees), r) |
209 | else: | 209 | else: |
210 | logger.error("Nothing %sPROVIDES '%s'", r, event._item) | 210 | logger.error("Nothing %sPROVIDES '%s'", r, event._item) |
211 | if event._reasons: | ||
212 | for reason in event._reasons: | ||
213 | logger.error("%s", reason) | ||
211 | continue | 214 | continue |
212 | 215 | ||
213 | if isinstance(event, bb.runqueue.runQueueTaskStarted): | 216 | if isinstance(event, bb.runqueue.runQueueTaskStarted): |