1
0
mirror of https://git.yoctoproject.org/poky synced 2026-07-16 15:57:04 +00:00

classes/lib: Switch classextend to use new filter API

Currently, class extensions are implmented using shadow variables and
access indirection which is horribly ineffient and ugly.

Switch to using the new bitbake filter API, which allows a translation
of the variable before the expanded value is returned. This allows us
to drop the shadow variable accesses. It also avoids the need to iterate
PACKAGES and make many variable changes since a filter against RDEPENDS
applies to RDEPENDS:${PN} and all of it's other overridden values.

Since data expansion happens at access, it also avoids many of the race
conditions this code has tranditionally been plagued with.

(From OE-Core rev: 24a9858a8927e91d499ee342ed93a0dbb44d83bc)

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Richard Purdie
2025-06-10 15:53:27 +01:00
parent 7c9a1f20f1
commit bdb5e99854
7 changed files with 159 additions and 202 deletions
+17 -16
View File
@@ -112,11 +112,11 @@ python __anonymous () {
variant = d.getVar("BBEXTENDVARIANT")
import oe.classextend
clsextend = oe.classextend.ClassExtender(variant, d)
clsextend.map_depends_variable("PACKAGE_INSTALL")
clsextend.map_depends_variable("LINGUAS_INSTALL")
clsextend.map_depends_variable("RDEPENDS")
prefixes = (d.getVar("MULTILIB_VARIANTS") or "").split()
clsextend = oe.classextend.ClassExtender(variant, prefixes, d)
clsextend.set_filter("PACKAGE_INSTALL", deps=False)
clsextend.set_filter("LINGUAS_INSTALL", deps=False)
clsextend.set_filter("RDEPENDS", deps=True)
pinstall = d.getVar("LINGUAS_INSTALL") + " " + d.getVar("PACKAGE_INSTALL")
d.setVar("PACKAGE_INSTALL", pinstall)
d.setVar("LINGUAS_INSTALL", "")
@@ -136,27 +136,28 @@ python multilib_virtclass_handler_postkeyexp () {
import oe.classextend
clsextend = oe.classextend.ClassExtender(variant, d)
if bb.data.inherits_class('image', d):
return
clsextend.map_depends_variable("DEPENDS")
clsextend.map_depends_variable("PACKAGE_WRITE_DEPS")
clsextend.map_variable("PROVIDES")
prefixes = (d.getVar("MULTILIB_VARIANTS") or "").split()
clsextend = oe.classextend.ClassExtender(variant, prefixes, d)
clsextend.set_filter("DEPENDS", deps=True)
clsextend.set_filter("PACKAGE_WRITE_DEPS", deps=False)
clsextend.set_filter("PROVIDES", deps=False)
if bb.data.inherits_class('cross-canadian', d):
return
clsextend.rename_packages()
clsextend.rename_package_variables((d.getVar("PACKAGEVARS") or "").split())
clsextend.map_packagevars()
clsextend.map_regexp_variable("PACKAGES_DYNAMIC")
clsextend.map_variable("INITSCRIPT_PACKAGES")
clsextend.map_variable("USERADD_PACKAGES")
clsextend.map_variable("SYSTEMD_PACKAGES")
clsextend.map_variable("UPDATERCPN")
clsextend.set_filter("INITSCRIPT_PACKAGES", deps=False)
clsextend.set_filter("USERADD_PACKAGES", deps=False)
clsextend.set_filter("SYSTEMD_PACKAGES", deps=False)
clsextend.set_filter("UPDATERCPN", deps=False)
reset_alternative_priority(d)
}
+7 -12
View File
@@ -207,30 +207,25 @@ python multilib_virtclass_handler_global () {
variants = (d.getVar("MULTILIB_VARIANTS") or "").split()
import oe.classextend
clsextends = []
for variant in variants:
clsextends.append(oe.classextend.ClassExtender(variant, localdata))
# Process PROVIDES
origprovs = provs = localdata.getVar("PROVIDES") or ""
for clsextend in clsextends:
provs = provs + " " + clsextend.map_variable("PROVIDES", setvar=False)
for variant in variants:
provs = provs + " " + oe.classextend.suffix_filter_deps(localdata.getVar("PROVIDES") or "", variant, variants)
d.setVar("PROVIDES", provs)
# Process RPROVIDES
origrprovs = rprovs = localdata.getVar("RPROVIDES") or ""
for clsextend in clsextends:
rprovs = rprovs + " " + clsextend.map_variable("RPROVIDES", setvar=False)
for variant in variants:
rprovs = rprovs + " " + oe.classextend.suffix_filter_deps(localdata.getVar("RPROVIDES") or "", variant, variants)
if rprovs.strip():
d.setVar("RPROVIDES", rprovs)
# Process RPROVIDES:${PN}...
for pkg in (d.getVar("PACKAGES") or "").split():
origrprovs = rprovs = localdata.getVar("RPROVIDES:%s" % pkg) or ""
for clsextend in clsextends:
rprovs = rprovs + " " + clsextend.map_variable("RPROVIDES:%s" % pkg, setvar=False)
rprovs = rprovs + " " + clsextend.extname + "-" + pkg
for variant in variants:
rprovs = rprovs + " " + oe.classextend.suffix_filter_deps(localdata.getVar("RPROVIDES:%s" % pkg) or "", variant, variants)
rprovs = rprovs + " " + variant + "-" + pkg
d.setVar("RPROVIDES:%s" % pkg, rprovs)
}