summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2022-12-09 15:56:19 +0000
committerRichard Purdie <richard.purdie@linuxfoundation.org>2022-12-17 08:52:28 +0000
commit2946c56b233370ac4b151558079f2fc676157bad (patch)
tree231e573d1a8a9edd3327c3ea8c533f28df8234b9
parent4754b1021ebdc8272b324bb8f2ffff03c8719233 (diff)
downloadpoky-2946c56b233370ac4b151558079f2fc676157bad.tar.gz
bitbake: bitbake: siggen/runqueue: Switch to using RECIPE_SIGGEN_INFO feature for signature dumping
Now that we have cache support for the taskdep/gendep/lookupcache data, we can switch to use that cooker feature and skip the secondary reparse to write the sig files. This does make the initial parse longer but means the secondary one isn't needed. At present parsing with the larger cache isn't optimal but we have plans in place which will make this faster than the current reparse code being removed here. (Bitbake rev: 5951b5b56449855bc2a30146af65eb287a35fcef) (Bitbake rev: 1252e5bce51ae912ecff9dcc354a371786ff2c72) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rwxr-xr-xbitbake/lib/bb/main.py5
-rw-r--r--bitbake/lib/bb/runqueue.py26
-rw-r--r--bitbake/lib/bb/siggen.py39
3 files changed, 37 insertions, 33 deletions
diff --git a/bitbake/lib/bb/main.py b/bitbake/lib/bb/main.py
index f1ea7859da..ed3e1ede61 100755
--- a/bitbake/lib/bb/main.py
+++ b/bitbake/lib/bb/main.py
@@ -395,6 +395,11 @@ def setup_bitbake(configParams, extrafeatures=None):
395 # In status only mode there are no logs and no UI 395 # In status only mode there are no logs and no UI
396 logger.addHandler(handler) 396 logger.addHandler(handler)
397 397
398 if configParams.dump_signatures:
399 if extrafeatures is None:
400 extrafeatures = []
401 extrafeatures.append(bb.cooker.CookerFeatures.RECIPE_SIGGEN_INFO)
402
398 if configParams.server_only: 403 if configParams.server_only:
399 featureset = [] 404 featureset = []
400 ui_module = None 405 ui_module = None
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py
index 991aa94f67..61cb9f4c95 100644
--- a/bitbake/lib/bb/runqueue.py
+++ b/bitbake/lib/bb/runqueue.py
@@ -1608,28 +1608,28 @@ class RunQueue:
1608 else: 1608 else:
1609 self.rqexe.finish() 1609 self.rqexe.finish()
1610 1610
1611 def rq_dump_sigfn(self, fn, options): 1611 def _rq_dump_sigtid(self, tids):
1612 mc = bb.runqueue.mc_from_tid(fn) 1612 for tid in tids:
1613 the_data = self.cooker.databuilder.parseRecipe(fn, self.cooker.collections[mc].get_file_appends(fn)) 1613 (mc, fn, taskname, taskfn) = split_tid_mcfn(tid)
1614 siggen = bb.parse.siggen 1614 dataCaches = self.rqdata.dataCaches
1615 dataCaches = self.rqdata.dataCaches 1615 bb.parse.siggen.dump_sigtask(taskfn, taskname, dataCaches[mc].stamp[taskfn], True)
1616 siggen.dump_sigfn(fn, dataCaches, options)
1617 1616
1618 def dump_signatures(self, options): 1617 def dump_signatures(self, options):
1619 fns = set() 1618 if bb.cooker.CookerFeatures.RECIPE_SIGGEN_INFO not in self.cooker.featureset:
1620 bb.note("Reparsing files to collect dependency data") 1619 bb.fatal("The dump signatures functionality needs the RECIPE_SIGGEN_INFO feature enabled")
1621 1620
1622 for tid in self.rqdata.runtaskentries: 1621 bb.note("Writing task signature files")
1623 fn = fn_from_tid(tid)
1624 fns.add(fn)
1625 1622
1626 max_process = int(self.cfgData.getVar("BB_NUMBER_PARSE_THREADS") or os.cpu_count() or 1) 1623 max_process = int(self.cfgData.getVar("BB_NUMBER_PARSE_THREADS") or os.cpu_count() or 1)
1624 def chunkify(l, n):
1625 return [l[i::n] for i in range(n)]
1626 tids = chunkify(list(self.rqdata.runtaskentries), max_process)
1627 # We cannot use the real multiprocessing.Pool easily due to some local data 1627 # We cannot use the real multiprocessing.Pool easily due to some local data
1628 # that can't be pickled. This is a cheap multi-process solution. 1628 # that can't be pickled. This is a cheap multi-process solution.
1629 launched = [] 1629 launched = []
1630 while fns: 1630 while tids:
1631 if len(launched) < max_process: 1631 if len(launched) < max_process:
1632 p = Process(target=self.rq_dump_sigfn, args=(fns.pop(), options)) 1632 p = Process(target=self._rq_dump_sigtid, args=(tids.pop(), ))
1633 p.start() 1633 p.start()
1634 launched.append(p) 1634 launched.append(p)
1635 for q in launched: 1635 for q in launched:
diff --git a/bitbake/lib/bb/siggen.py b/bitbake/lib/bb/siggen.py
index e57f1ffe69..6b73843c67 100644
--- a/bitbake/lib/bb/siggen.py
+++ b/bitbake/lib/bb/siggen.py
@@ -335,8 +335,8 @@ class SignatureGeneratorBasic(SignatureGenerator):
335 self.unihash_cache.copyfile(targetdir) 335 self.unihash_cache.copyfile(targetdir)
336 336
337 def dump_sigtask(self, fn, task, stampbase, runtime): 337 def dump_sigtask(self, fn, task, stampbase, runtime):
338
339 tid = fn + ":" + task 338 tid = fn + ":" + task
339 mc = bb.runqueue.mc_from_tid(fn)
340 referencestamp = stampbase 340 referencestamp = stampbase
341 if isinstance(runtime, str) and runtime.startswith("customfile"): 341 if isinstance(runtime, str) and runtime.startswith("customfile"):
342 sigfile = stampbase 342 sigfile = stampbase
@@ -353,16 +353,27 @@ class SignatureGeneratorBasic(SignatureGenerator):
353 data['task'] = task 353 data['task'] = task
354 data['basehash_ignore_vars'] = self.basehash_ignore_vars 354 data['basehash_ignore_vars'] = self.basehash_ignore_vars
355 data['taskhash_ignore_tasks'] = self.taskhash_ignore_tasks 355 data['taskhash_ignore_tasks'] = self.taskhash_ignore_tasks
356 data['taskdeps'] = self.taskdeps[fn][task] 356 if hasattr(self, "datacaches"):
357 data['taskdeps'] = self.datacaches[mc].siggen_taskdeps[fn][task]
358 else:
359 data['taskdeps'] = self.taskdeps[fn][task]
357 data['basehash'] = self.basehash[tid] 360 data['basehash'] = self.basehash[tid]
358 data['gendeps'] = {} 361 data['gendeps'] = {}
359 data['varvals'] = {} 362 data['varvals'] = {}
360 data['varvals'][task] = self.lookupcache[fn][task] 363 if hasattr(self, "datacaches"):
361 for dep in self.taskdeps[fn][task]: 364 data['varvals'][task] = self.datacaches[mc].siggen_varvals[fn][task]
362 if dep in self.basehash_ignore_vars: 365 for dep in self.datacaches[mc].siggen_taskdeps[fn][task]:
363 continue 366 if dep in self.basehash_ignore_vars:
364 data['gendeps'][dep] = self.gendeps[fn][dep] 367 continue
365 data['varvals'][dep] = self.lookupcache[fn][dep] 368 data['gendeps'][dep] = self.datacaches[mc].siggen_gendeps[fn][dep]
369 data['varvals'][dep] = self.datacaches[mc].siggen_varvals[fn][dep]
370 else:
371 data['varvals'][task] = self.lookupcache[fn][task]
372 for dep in self.taskdeps[fn][task]:
373 if dep in self.basehash_ignore_vars:
374 continue
375 data['gendeps'][dep] = self.gendeps[fn][dep]
376 data['varvals'][dep] = self.lookupcache[fn][dep]
366 377
367 if runtime and tid in self.taskhash: 378 if runtime and tid in self.taskhash:
368 data['runtaskdeps'] = self.runtaskdeps[tid] 379 data['runtaskdeps'] = self.runtaskdeps[tid]
@@ -409,18 +420,6 @@ class SignatureGeneratorBasic(SignatureGenerator):
409 pass 420 pass
410 raise err 421 raise err
411 422
412 def dump_sigfn(self, fn, dataCaches, options):
413 if fn in self.taskdeps:
414 for task in self.taskdeps[fn]:
415 tid = fn + ":" + task
416 mc = bb.runqueue.mc_from_tid(tid)
417 if tid not in self.taskhash:
418 continue
419 if dataCaches[mc].basetaskhash[tid] != self.basehash[tid]:
420 bb.error("Bitbake's cached basehash does not match the one we just generated (%s)!" % tid)
421 bb.error("The mismatched hashes were %s and %s" % (dataCaches[mc].basetaskhash[tid], self.basehash[tid]))
422 self.dump_sigtask(fn, task, dataCaches[mc].stamp[fn], True)
423
424class SignatureGeneratorBasicHash(SignatureGeneratorBasic): 423class SignatureGeneratorBasicHash(SignatureGeneratorBasic):
425 name = "basichash" 424 name = "basichash"
426 425