From 01c335432524f250ca806381ebcb8a208524eb34 Mon Sep 17 00:00:00 2001 From: Richard Purdie Date: Tue, 21 Jan 2025 14:44:23 +0000 Subject: bitbake: parse/ast: Add support for BB_RECIPE_VIRTUAL_PROVIDERS Currently, providers are set on a global config basis. This change allows for a select set of providers configured in BB_RECIPE_VIRTUAL_PROVIDERS to be selected on a per recipe basis. This would allow for the selection of virtual/cross-cc as gcc or clang for example in OE-Core. DEPENDS and task flag [depends] values are processed. (Bitbake rev: fb119c7888ae8a749aa824f8c51780176af077f9) Signed-off-by: Richard Purdie --- bitbake/lib/bb/parse/ast.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/bitbake/lib/bb/parse/ast.py b/bitbake/lib/bb/parse/ast.py index 30ede008d7..290ed45048 100644 --- a/bitbake/lib/bb/parse/ast.py +++ b/bitbake/lib/bb/parse/ast.py @@ -440,6 +440,30 @@ def runAnonFuncs(d): code.append("%s(d)" % funcname) bb.utils.better_exec("\n".join(code), {"d": d}) +# Handle recipe level PREFERRED_PROVIDERs +def handleVirtRecipeProviders(tasklist, d): + depends = (d.getVar("DEPENDS") or "").split() + virtprovs = (d.getVar("BB_RECIPE_VIRTUAL_PROVIDERS") or "").split() + newdeps = [] + for dep in depends: + if dep in virtprovs: + newdep = d.getVar("PREFERRED_PROVIDER_" + dep) + if not newdep: + bb.fatal("Error, recipe virtual provider PREFERRED_PROVIDER_%s not set" % dep) + newdeps.append(newdep) + else: + newdeps.append(dep) + d.setVar("DEPENDS", " ".join(newdeps)) + for task in tasklist: + taskdeps = (d.getVarFlag(task, "depends") or "").split() + remapped = [] + for entry in taskdeps: + r, t = entry.split(":") + if r in virtprovs: + r = d.getVar("PREFERRED_PROVIDER_" + r) + remapped.append("%s:%s" % (r, t)) + d.setVarFlag(task, "depends", " ".join(remapped)) + def finalize(fn, d, variant = None): saved_handlers = bb.event.get_handlers().copy() try: @@ -465,6 +489,7 @@ def finalize(fn, d, variant = None): tasklist = d.getVar('__BBTASKS', False) or [] bb.event.fire(bb.event.RecipeTaskPreProcess(fn, list(tasklist)), d) + handleVirtRecipeProviders(tasklist, d) bb.build.add_tasks(tasklist, d) bb.parse.siggen.finalise(fn, d, variant) -- cgit v1.2.3-54-g00ecf