summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bitbake/lib/bb/command.py21
-rw-r--r--bitbake/lib/bb/cooker.py11
-rw-r--r--bitbake/lib/bb/tinfoil.py16
-rw-r--r--bitbake/lib/bblayers/query.py14
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 = ''):