diff options
| -rw-r--r-- | bitbake/lib/bb/command.py | 21 | ||||
| -rw-r--r-- | bitbake/lib/bb/cooker.py | 11 | ||||
| -rw-r--r-- | bitbake/lib/bb/tinfoil.py | 16 | ||||
| -rw-r--r-- | bitbake/lib/bblayers/query.py | 14 |
4 files changed, 43 insertions, 19 deletions
diff --git a/bitbake/lib/bb/command.py b/bitbake/lib/bb/command.py index 7944faf981..baa7cbade1 100644 --- a/bitbake/lib/bb/command.py +++ b/bitbake/lib/bb/command.py | |||
| @@ -421,15 +421,30 @@ class CommandsSync: | |||
| 421 | return command.cooker.recipecaches[mc].pkg_dp | 421 | return command.cooker.recipecaches[mc].pkg_dp |
| 422 | getDefaultPreference.readonly = True | 422 | getDefaultPreference.readonly = True |
| 423 | 423 | ||
| 424 | |||
| 424 | def getSkippedRecipes(self, command, params): | 425 | def getSkippedRecipes(self, command, params): |
| 426 | """ | ||
| 427 | Get the map of skipped recipes for the specified multiconfig/mc name (`params[0]`). | ||
| 428 | |||
| 429 | Invoked by `bb.tinfoil.Tinfoil.get_skipped_recipes` | ||
| 430 | |||
| 431 | :param command: Internally used parameter. | ||
| 432 | :param params: Parameter array. params[0] is multiconfig/mc name. If not given, then default mc '' is assumed. | ||
| 433 | :return: Dict whose keys are virtualfns and values are `bb.cooker.SkippedPackage` | ||
| 434 | """ | ||
| 435 | try: | ||
| 436 | mc = params[0] | ||
| 437 | except IndexError: | ||
| 438 | mc = '' | ||
| 439 | |||
| 425 | # Return list sorted by reverse priority order | 440 | # Return list sorted by reverse priority order |
| 426 | import bb.cache | 441 | import bb.cache |
| 427 | def sortkey(x): | 442 | def sortkey(x): |
| 428 | vfn, _ = x | 443 | vfn, _ = x |
| 429 | realfn, _, mc = bb.cache.virtualfn2realfn(vfn) | 444 | realfn, _, item_mc = bb.cache.virtualfn2realfn(vfn) |
| 430 | return (-command.cooker.collections[mc].calc_bbfile_priority(realfn)[0], vfn) | 445 | return -command.cooker.collections[item_mc].calc_bbfile_priority(realfn)[0], vfn |
| 431 | 446 | ||
| 432 | skipdict = OrderedDict(sorted(command.cooker.skiplist.items(), key=sortkey)) | 447 | skipdict = OrderedDict(sorted(command.cooker.skiplist_by_mc[mc].items(), key=sortkey)) |
| 433 | return list(skipdict.items()) | 448 | return list(skipdict.items()) |
| 434 | getSkippedRecipes.readonly = True | 449 | getSkippedRecipes.readonly = True |
| 435 | 450 | ||
diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py index ceaaac11ee..5b885cddd7 100644 --- a/bitbake/lib/bb/cooker.py +++ b/bitbake/lib/bb/cooker.py | |||
| @@ -133,7 +133,8 @@ class BBCooker: | |||
| 133 | self.baseconfig_valid = False | 133 | self.baseconfig_valid = False |
| 134 | self.parsecache_valid = False | 134 | self.parsecache_valid = False |
| 135 | self.eventlog = None | 135 | self.eventlog = None |
| 136 | self.skiplist = {} | 136 | # The skiplists, one per multiconfig |
| 137 | self.skiplist_by_mc = defaultdict(dict) | ||
| 137 | self.featureset = CookerFeatures() | 138 | self.featureset = CookerFeatures() |
| 138 | if featureSet: | 139 | if featureSet: |
| 139 | for f in featureSet: | 140 | for f in featureSet: |
| @@ -614,8 +615,8 @@ class BBCooker: | |||
| 614 | localdata = {} | 615 | localdata = {} |
| 615 | 616 | ||
| 616 | for mc in self.multiconfigs: | 617 | for mc in self.multiconfigs: |
| 617 | taskdata[mc] = bb.taskdata.TaskData(halt, skiplist=self.skiplist, allowincomplete=allowincomplete) | 618 | taskdata[mc] = bb.taskdata.TaskData(halt, skiplist=self.skiplist_by_mc[mc], allowincomplete=allowincomplete) |
| 618 | localdata[mc] = data.createCopy(self.databuilder.mcdata[mc]) | 619 | localdata[mc] = bb.data.createCopy(self.databuilder.mcdata[mc]) |
| 619 | bb.data.expandKeys(localdata[mc]) | 620 | bb.data.expandKeys(localdata[mc]) |
| 620 | 621 | ||
| 621 | current = 0 | 622 | current = 0 |
| @@ -936,7 +937,7 @@ class BBCooker: | |||
| 936 | for mc in self.multiconfigs: | 937 | for mc in self.multiconfigs: |
| 937 | # First get list of recipes, including skipped | 938 | # First get list of recipes, including skipped |
| 938 | recipefns = list(self.recipecaches[mc].pkg_fn.keys()) | 939 | recipefns = list(self.recipecaches[mc].pkg_fn.keys()) |
| 939 | recipefns.extend(self.skiplist.keys()) | 940 | recipefns.extend(self.skiplist_by_mc[mc].keys()) |
| 940 | 941 | ||
| 941 | # Work out list of bbappends that have been applied | 942 | # Work out list of bbappends that have been applied |
| 942 | applied_appends = [] | 943 | applied_appends = [] |
| @@ -2355,7 +2356,7 @@ class CookerParser(object): | |||
| 2355 | for virtualfn, info_array in result: | 2356 | for virtualfn, info_array in result: |
| 2356 | if info_array[0].skipped: | 2357 | if info_array[0].skipped: |
| 2357 | self.skipped += 1 | 2358 | self.skipped += 1 |
| 2358 | self.cooker.skiplist[virtualfn] = SkippedPackage(info_array[0]) | 2359 | self.cooker.skiplist_by_mc[mc][virtualfn] = SkippedPackage(info_array[0]) |
| 2359 | self.bb_caches[mc].add_info(virtualfn, info_array, self.cooker.recipecaches[mc], | 2360 | self.bb_caches[mc].add_info(virtualfn, info_array, self.cooker.recipecaches[mc], |
| 2360 | parsed=parsed, watcher = self.cooker.add_filewatch) | 2361 | parsed=parsed, watcher = self.cooker.add_filewatch) |
| 2361 | return True | 2362 | return True |
diff --git a/bitbake/lib/bb/tinfoil.py b/bitbake/lib/bb/tinfoil.py index 0e937fba36..13b05cec2d 100644 --- a/bitbake/lib/bb/tinfoil.py +++ b/bitbake/lib/bb/tinfoil.py | |||
| @@ -188,11 +188,19 @@ class TinfoilCookerAdapter: | |||
| 188 | self._cache[name] = attrvalue | 188 | self._cache[name] = attrvalue |
| 189 | return attrvalue | 189 | return attrvalue |
| 190 | 190 | ||
| 191 | class TinfoilSkiplistByMcAdapter: | ||
| 192 | def __init__(self, tinfoil): | ||
| 193 | self.tinfoil = tinfoil | ||
| 194 | |||
| 195 | def __getitem__(self, mc): | ||
| 196 | return self.tinfoil.get_skipped_recipes(mc) | ||
| 197 | |||
| 191 | def __init__(self, tinfoil): | 198 | def __init__(self, tinfoil): |
| 192 | self.tinfoil = tinfoil | 199 | self.tinfoil = tinfoil |
| 193 | self.multiconfigs = [''] + (tinfoil.config_data.getVar('BBMULTICONFIG') or '').split() | 200 | self.multiconfigs = [''] + (tinfoil.config_data.getVar('BBMULTICONFIG') or '').split() |
| 194 | self.collections = {} | 201 | self.collections = {} |
| 195 | self.recipecaches = {} | 202 | self.recipecaches = {} |
| 203 | self.skiplist_by_mc = self.TinfoilSkiplistByMcAdapter(tinfoil) | ||
| 196 | for mc in self.multiconfigs: | 204 | for mc in self.multiconfigs: |
| 197 | self.collections[mc] = self.TinfoilCookerCollectionAdapter(tinfoil, mc) | 205 | self.collections[mc] = self.TinfoilCookerCollectionAdapter(tinfoil, mc) |
| 198 | self.recipecaches[mc] = self.TinfoilRecipeCacheAdapter(tinfoil, mc) | 206 | self.recipecaches[mc] = self.TinfoilRecipeCacheAdapter(tinfoil, mc) |
| @@ -201,8 +209,6 @@ class TinfoilCookerAdapter: | |||
| 201 | # Grab these only when they are requested since they aren't always used | 209 | # Grab these only when they are requested since they aren't always used |
| 202 | if name in self._cache: | 210 | if name in self._cache: |
| 203 | return self._cache[name] | 211 | return self._cache[name] |
| 204 | elif name == 'skiplist': | ||
| 205 | attrvalue = self.tinfoil.get_skipped_recipes() | ||
| 206 | elif name == 'bbfile_config_priorities': | 212 | elif name == 'bbfile_config_priorities': |
| 207 | ret = self.tinfoil.run_command('getLayerPriorities') | 213 | ret = self.tinfoil.run_command('getLayerPriorities') |
| 208 | bbfile_config_priorities = [] | 214 | bbfile_config_priorities = [] |
| @@ -514,12 +520,12 @@ class Tinfoil: | |||
| 514 | """ | 520 | """ |
| 515 | return defaultdict(list, self.run_command('getOverlayedRecipes', mc)) | 521 | return defaultdict(list, self.run_command('getOverlayedRecipes', mc)) |
| 516 | 522 | ||
| 517 | def get_skipped_recipes(self): | 523 | def get_skipped_recipes(self, mc=''): |
| 518 | """ | 524 | """ |
| 519 | Find recipes which were skipped (i.e. SkipRecipe was raised | 525 | Find recipes which were skipped (i.e. SkipRecipe was raised |
| 520 | during parsing). | 526 | during parsing). |
| 521 | """ | 527 | """ |
| 522 | return OrderedDict(self.run_command('getSkippedRecipes')) | 528 | return OrderedDict(self.run_command('getSkippedRecipes', mc)) |
| 523 | 529 | ||
| 524 | def get_all_providers(self, mc=''): | 530 | def get_all_providers(self, mc=''): |
| 525 | return defaultdict(list, self.run_command('allProviders', mc)) | 531 | return defaultdict(list, self.run_command('allProviders', mc)) |
| @@ -533,6 +539,7 @@ class Tinfoil: | |||
| 533 | def get_runtime_providers(self, rdep): | 539 | def get_runtime_providers(self, rdep): |
| 534 | return self.run_command('getRuntimeProviders', rdep) | 540 | return self.run_command('getRuntimeProviders', rdep) |
| 535 | 541 | ||
| 542 | # TODO: teach this method about mc | ||
| 536 | def get_recipe_file(self, pn): | 543 | def get_recipe_file(self, pn): |
| 537 | """ | 544 | """ |
| 538 | Get the file name for the specified recipe/target. Raises | 545 | Get the file name for the specified recipe/target. Raises |
| @@ -541,6 +548,7 @@ class Tinfoil: | |||
| 541 | """ | 548 | """ |
| 542 | best = self.find_best_provider(pn) | 549 | best = self.find_best_provider(pn) |
| 543 | if not best or (len(best) > 3 and not best[3]): | 550 | if not best or (len(best) > 3 and not best[3]): |
| 551 | # TODO: pass down mc | ||
| 544 | skiplist = self.get_skipped_recipes() | 552 | skiplist = self.get_skipped_recipes() |
| 545 | taskdata = bb.taskdata.TaskData(None, skiplist=skiplist) | 553 | taskdata = bb.taskdata.TaskData(None, skiplist=skiplist) |
| 546 | skipreasons = taskdata.get_reasons(pn) | 554 | skipreasons = taskdata.get_reasons(pn) |
diff --git a/bitbake/lib/bblayers/query.py b/bitbake/lib/bblayers/query.py index bfc18a7593..eb7cb465b4 100644 --- a/bitbake/lib/bblayers/query.py +++ b/bitbake/lib/bblayers/query.py | |||
| @@ -142,10 +142,10 @@ skipped recipes will also be listed, with a " (skipped)" suffix. | |||
| 142 | # Ensure we list skipped recipes | 142 | # Ensure we list skipped recipes |
| 143 | # We are largely guessing about PN, PV and the preferred version here, | 143 | # We are largely guessing about PN, PV and the preferred version here, |
| 144 | # but we have no choice since skipped recipes are not fully parsed | 144 | # but we have no choice since skipped recipes are not fully parsed |
| 145 | skiplist = list(self.tinfoil.cooker.skiplist.keys()) | 145 | skiplist = list(self.tinfoil.cooker.skiplist_by_mc[mc].keys()) |
| 146 | mcspec = 'mc:%s:' % mc | 146 | |
| 147 | if mc: | 147 | if mc: |
| 148 | skiplist = [s[len(mcspec):] for s in skiplist if s.startswith(mcspec)] | 148 | skiplist = [s.removeprefix(f'mc:{mc}:') for s in skiplist] |
| 149 | 149 | ||
| 150 | for fn in skiplist: | 150 | for fn in skiplist: |
| 151 | recipe_parts = os.path.splitext(os.path.basename(fn))[0].split('_') | 151 | recipe_parts = os.path.splitext(os.path.basename(fn))[0].split('_') |
| @@ -162,7 +162,7 @@ skipped recipes will also be listed, with a " (skipped)" suffix. | |||
| 162 | def print_item(f, pn, ver, layer, ispref): | 162 | def print_item(f, pn, ver, layer, ispref): |
| 163 | if not selected_layer or layer == selected_layer: | 163 | if not selected_layer or layer == selected_layer: |
| 164 | if not bare and f in skiplist: | 164 | if not bare and f in skiplist: |
| 165 | skipped = ' (skipped: %s)' % self.tinfoil.cooker.skiplist[f].skipreason | 165 | skipped = ' (skipped: %s)' % self.tinfoil.cooker.skiplist_by_mc[mc][f].skipreason |
| 166 | else: | 166 | else: |
| 167 | skipped = '' | 167 | skipped = '' |
| 168 | if show_filenames: | 168 | if show_filenames: |
| @@ -301,7 +301,7 @@ Lists recipes with the bbappends that apply to them as subitems. | |||
| 301 | if self.show_appends_for_pn(pn, cooker_data, args.mc): | 301 | if self.show_appends_for_pn(pn, cooker_data, args.mc): |
| 302 | appends = True | 302 | appends = True |
| 303 | 303 | ||
| 304 | if not args.pnspec and self.show_appends_for_skipped(): | 304 | if not args.pnspec and self.show_appends_for_skipped(args.mc): |
| 305 | appends = True | 305 | appends = True |
| 306 | 306 | ||
| 307 | if not appends: | 307 | if not appends: |
| @@ -317,9 +317,9 @@ Lists recipes with the bbappends that apply to them as subitems. | |||
| 317 | 317 | ||
| 318 | return self.show_appends_output(filenames, best_filename) | 318 | return self.show_appends_output(filenames, best_filename) |
| 319 | 319 | ||
| 320 | def show_appends_for_skipped(self): | 320 | def show_appends_for_skipped(self, mc): |
| 321 | filenames = [os.path.basename(f) | 321 | filenames = [os.path.basename(f) |
| 322 | for f in self.tinfoil.cooker.skiplist.keys()] | 322 | for f in self.tinfoil.cooker.skiplist_by_mc[mc].keys()] |
| 323 | return self.show_appends_output(filenames, None, " (skipped)") | 323 | return self.show_appends_output(filenames, None, " (skipped)") |
| 324 | 324 | ||
| 325 | def show_appends_output(self, filenames, best_filename, name_suffix = ''): | 325 | def show_appends_output(self, filenames, best_filename, name_suffix = ''): |
