From 674b49a7f7d28d84eeb7545e567bb4da6b9dcff9 Mon Sep 17 00:00:00 2001 From: Richard Purdie Date: Wed, 28 Aug 2024 12:58:30 +0100 Subject: lib/oe: Use new visitorcode functionality for qa.handle_error() Early functions like do_recipe_qa (which do_fetch depends upon) reference oe.qa.handle_error() which in turn adds dependencies on ERROR_QA and WARN_QA. This means that ERROR_QA:append = " nothing" will cause literally everything to rebuild and break sstate reuse. Take advantage of new bitbake functionality to add a custom visitorcode function to handle_error which optimises the references into contains expressions which means the ERROR_QA and WARN_QA references are optmised to containing specific strings. This dramatically improves sstate reuse. The qa module has to be imported first since other code in later modules references it and bitbake can't handle the dependency ordering internally without a lot of unwanted complexity. (From OE-Core rev: a911ea9659503e9442a183f366e4545a5efe246e) Signed-off-by: Richard Purdie --- meta/lib/oe/qa.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'meta/lib/oe/qa.py') diff --git a/meta/lib/oe/qa.py b/meta/lib/oe/qa.py index f8ae3c743f..e338ad6439 100644 --- a/meta/lib/oe/qa.py +++ b/meta/lib/oe/qa.py @@ -4,6 +4,7 @@ # SPDX-License-Identifier: GPL-2.0-only # +import ast import os, struct, mmap class NotELFFileError(Exception): @@ -186,6 +187,20 @@ def write_error(type, error, d): with open(logfile, "a+") as f: f.write("%s: %s [%s]\n" % (p, error, type)) +def handle_error_visitorcode(name, args): + execs = set() + contains = {} + warn = None + if isinstance(args[0], ast.Constant) and isinstance(args[0].value, str): + for i in ["ERROR_QA", "WARN_QA"]: + if i not in contains: + contains[i] = set() + contains[i].add(args[0].value) + else: + warn = args[0] + execs.add(name) + return contains, execs, warn + def handle_error(error_class, error_msg, d): if error_class in (d.getVar("ERROR_QA") or "").split(): write_error(error_class, error_msg, d) @@ -198,6 +213,7 @@ def handle_error(error_class, error_msg, d): else: bb.note("QA Issue: %s [%s]" % (error_msg, error_class)) return True +handle_error.visitorcode = handle_error_visitorcode def add_message(messages, section, new_msg): if section not in messages: -- cgit v1.2.3-54-g00ecf