summaryrefslogtreecommitdiffstats
path: root/meta/classes
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2025-06-10 15:53:27 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2025-08-12 10:05:11 +0100
commitbdb5e99854c76f31d5463f55a657d40098a0743a (patch)
tree1b77d9e688cc1ab0002695b84a50e80ceda37494 /meta/classes
parent7c9a1f20f1f07d8a946f300878e680103d70ac84 (diff)
downloadpoky-bdb5e99854c76f31d5463f55a657d40098a0743a.tar.gz
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>
Diffstat (limited to 'meta/classes')
-rw-r--r--meta/classes/multilib.bbclass33
-rw-r--r--meta/classes/multilib_global.bbclass19
2 files changed, 24 insertions, 28 deletions
diff --git a/meta/classes/multilib.bbclass b/meta/classes/multilib.bbclass
index b959bbd93c..677dbc854a 100644
--- a/meta/classes/multilib.bbclass
+++ b/meta/classes/multilib.bbclass
@@ -112,11 +112,11 @@ python __anonymous () {
112 variant = d.getVar("BBEXTENDVARIANT") 112 variant = d.getVar("BBEXTENDVARIANT")
113 import oe.classextend 113 import oe.classextend
114 114
115 clsextend = oe.classextend.ClassExtender(variant, d) 115 prefixes = (d.getVar("MULTILIB_VARIANTS") or "").split()
116 116 clsextend = oe.classextend.ClassExtender(variant, prefixes, d)
117 clsextend.map_depends_variable("PACKAGE_INSTALL") 117 clsextend.set_filter("PACKAGE_INSTALL", deps=False)
118 clsextend.map_depends_variable("LINGUAS_INSTALL") 118 clsextend.set_filter("LINGUAS_INSTALL", deps=False)
119 clsextend.map_depends_variable("RDEPENDS") 119 clsextend.set_filter("RDEPENDS", deps=True)
120 pinstall = d.getVar("LINGUAS_INSTALL") + " " + d.getVar("PACKAGE_INSTALL") 120 pinstall = d.getVar("LINGUAS_INSTALL") + " " + d.getVar("PACKAGE_INSTALL")
121 d.setVar("PACKAGE_INSTALL", pinstall) 121 d.setVar("PACKAGE_INSTALL", pinstall)
122 d.setVar("LINGUAS_INSTALL", "") 122 d.setVar("LINGUAS_INSTALL", "")
@@ -136,27 +136,28 @@ python multilib_virtclass_handler_postkeyexp () {
136 136
137 import oe.classextend 137 import oe.classextend
138 138
139 clsextend = oe.classextend.ClassExtender(variant, d)
140
141 if bb.data.inherits_class('image', d): 139 if bb.data.inherits_class('image', d):
142 return 140 return
143 141
144 clsextend.map_depends_variable("DEPENDS") 142 prefixes = (d.getVar("MULTILIB_VARIANTS") or "").split()
145 clsextend.map_depends_variable("PACKAGE_WRITE_DEPS") 143 clsextend = oe.classextend.ClassExtender(variant, prefixes, d)
146 clsextend.map_variable("PROVIDES") 144
145 clsextend.set_filter("DEPENDS", deps=True)
146 clsextend.set_filter("PACKAGE_WRITE_DEPS", deps=False)
147
148 clsextend.set_filter("PROVIDES", deps=False)
147 149
148 if bb.data.inherits_class('cross-canadian', d): 150 if bb.data.inherits_class('cross-canadian', d):
149 return 151 return
150 152
151 clsextend.rename_packages()
152 clsextend.rename_package_variables((d.getVar("PACKAGEVARS") or "").split()) 153 clsextend.rename_package_variables((d.getVar("PACKAGEVARS") or "").split())
153 154
154 clsextend.map_packagevars() 155 clsextend.map_packagevars()
155 clsextend.map_regexp_variable("PACKAGES_DYNAMIC") 156
156 clsextend.map_variable("INITSCRIPT_PACKAGES") 157 clsextend.set_filter("INITSCRIPT_PACKAGES", deps=False)
157 clsextend.map_variable("USERADD_PACKAGES") 158 clsextend.set_filter("USERADD_PACKAGES", deps=False)
158 clsextend.map_variable("SYSTEMD_PACKAGES") 159 clsextend.set_filter("SYSTEMD_PACKAGES", deps=False)
159 clsextend.map_variable("UPDATERCPN") 160 clsextend.set_filter("UPDATERCPN", deps=False)
160 161
161 reset_alternative_priority(d) 162 reset_alternative_priority(d)
162} 163}
diff --git a/meta/classes/multilib_global.bbclass b/meta/classes/multilib_global.bbclass
index c1d6de100c..d9372d9ed1 100644
--- a/meta/classes/multilib_global.bbclass
+++ b/meta/classes/multilib_global.bbclass
@@ -207,30 +207,25 @@ python multilib_virtclass_handler_global () {
207 207
208 variants = (d.getVar("MULTILIB_VARIANTS") or "").split() 208 variants = (d.getVar("MULTILIB_VARIANTS") or "").split()
209 209
210 import oe.classextend
211 clsextends = []
212 for variant in variants:
213 clsextends.append(oe.classextend.ClassExtender(variant, localdata))
214
215 # Process PROVIDES 210 # Process PROVIDES
216 origprovs = provs = localdata.getVar("PROVIDES") or "" 211 origprovs = provs = localdata.getVar("PROVIDES") or ""
217 for clsextend in clsextends: 212 for variant in variants:
218 provs = provs + " " + clsextend.map_variable("PROVIDES", setvar=False) 213 provs = provs + " " + oe.classextend.suffix_filter_deps(localdata.getVar("PROVIDES") or "", variant, variants)
219 d.setVar("PROVIDES", provs) 214 d.setVar("PROVIDES", provs)
220 215
221 # Process RPROVIDES 216 # Process RPROVIDES
222 origrprovs = rprovs = localdata.getVar("RPROVIDES") or "" 217 origrprovs = rprovs = localdata.getVar("RPROVIDES") or ""
223 for clsextend in clsextends: 218 for variant in variants:
224 rprovs = rprovs + " " + clsextend.map_variable("RPROVIDES", setvar=False) 219 rprovs = rprovs + " " + oe.classextend.suffix_filter_deps(localdata.getVar("RPROVIDES") or "", variant, variants)
225 if rprovs.strip(): 220 if rprovs.strip():
226 d.setVar("RPROVIDES", rprovs) 221 d.setVar("RPROVIDES", rprovs)
227 222
228 # Process RPROVIDES:${PN}... 223 # Process RPROVIDES:${PN}...
229 for pkg in (d.getVar("PACKAGES") or "").split(): 224 for pkg in (d.getVar("PACKAGES") or "").split():
230 origrprovs = rprovs = localdata.getVar("RPROVIDES:%s" % pkg) or "" 225 origrprovs = rprovs = localdata.getVar("RPROVIDES:%s" % pkg) or ""
231 for clsextend in clsextends: 226 for variant in variants:
232 rprovs = rprovs + " " + clsextend.map_variable("RPROVIDES:%s" % pkg, setvar=False) 227 rprovs = rprovs + " " + oe.classextend.suffix_filter_deps(localdata.getVar("RPROVIDES:%s" % pkg) or "", variant, variants)
233 rprovs = rprovs + " " + clsextend.extname + "-" + pkg 228 rprovs = rprovs + " " + variant + "-" + pkg
234 d.setVar("RPROVIDES:%s" % pkg, rprovs) 229 d.setVar("RPROVIDES:%s" % pkg, rprovs)
235} 230}
236 231