diff options
author | Alexander Kanavin <alex.kanavin@gmail.com> | 2022-02-06 22:53:11 +0100 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2022-02-08 14:19:33 +0000 |
commit | fac984b99fdb46949879516cb87153860f402c75 (patch) | |
tree | ad087dc5a0664eebdefcbe5f2c7d5d76f2dcff52 /meta/classes | |
parent | 0b00410161e3a0d3c9a9631ae3544f42e36cc1b7 (diff) | |
download | openembedded-core-contrib-fac984b99fdb46949879516cb87153860f402c75.tar.gz |
insane.bbclass: use multiprocessing for collecting 'objdump -p' output
This was prompted by ltp's unreasonably long package_qa times; it has
a massive amount of executables and insane runs objdump for all of
them, serially.
This reduces the time from 4 minutes to 1m20s on my machine.
Signed-off-by: Alexander Kanavin <alex@linutronix.de>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/classes')
-rw-r--r-- | meta/classes/insane.bbclass | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/meta/classes/insane.bbclass b/meta/classes/insane.bbclass index 11532ecd08..a13a947bcf 100644 --- a/meta/classes/insane.bbclass +++ b/meta/classes/insane.bbclass @@ -684,6 +684,10 @@ def package_qa_recipe(warnfuncs, errorfuncs, pn, d): return len(errors) == 0 +def prepopulate_objdump_p(elf, d): + output = elf.run_objdump("-p", d) + return (elf.name, output) + # Walk over all files in a directory and call func def package_qa_walk(warnfuncs, errorfuncs, package, d): #if this will throw an exception, then fix the dict above @@ -692,18 +696,32 @@ def package_qa_walk(warnfuncs, errorfuncs, package, d): warnings = {} errors = {} + elves = {} for path in pkgfiles[package]: elf = None if os.path.isfile(path): elf = oe.qa.ELFFile(path) try: elf.open() + elf.close() except oe.qa.NotELFFileError: elf = None + if elf: + elves[path] = elf + + results = oe.utils.multiprocess_launch(prepopulate_objdump_p, elves.values(), d, extraargs=(d,)) + for item in results: + elves[item[0]].set_objdump("-p", item[1]) + + for path in pkgfiles[package]: + if path in elves: + elves[path].open() for func in warnfuncs: - func(path, package, d, elf, warnings) + func(path, package, d, elves.get(path), warnings) for func in errorfuncs: - func(path, package, d, elf, errors) + func(path, package, d, elves.get(path), errors) + if path in elves: + elves[path].close() for w in warnings: oe.qa.handle_error(w, warnings[w], d) |