diff options
-rw-r--r-- | meta/classes-recipe/native.bbclass | 39 | ||||
-rw-r--r-- | meta/classes-recipe/nativesdk.bbclass | 11 | ||||
-rw-r--r-- | meta/classes-recipe/toolchain-scripts.bbclass | 4 | ||||
-rw-r--r-- | meta/classes/multilib.bbclass | 33 | ||||
-rw-r--r-- | meta/classes/multilib_global.bbclass | 19 | ||||
-rw-r--r-- | meta/lib/oe/__init__.py | 2 | ||||
-rw-r--r-- | meta/lib/oe/classextend.py | 255 |
7 files changed, 160 insertions, 203 deletions
diff --git a/meta/classes-recipe/native.bbclass b/meta/classes-recipe/native.bbclass index 625975a694..7d1fe343fa 100644 --- a/meta/classes-recipe/native.bbclass +++ b/meta/classes-recipe/native.bbclass | |||
@@ -138,38 +138,18 @@ python native_virtclass_handler () { | |||
138 | if "native" not in classextend: | 138 | if "native" not in classextend: |
139 | return | 139 | return |
140 | 140 | ||
141 | def map_dependencies(varname, d, suffix = "", selfref=True, regex=False): | 141 | def map_dependencies(varname, d, suffix, selfref=True, regex=False): |
142 | if suffix: | 142 | varname = varname + ":" + suffix |
143 | varname = varname + ":" + suffix | ||
144 | deps = d.getVar(varname) | ||
145 | if not deps: | ||
146 | return | ||
147 | deps = bb.utils.explode_deps(deps) | ||
148 | newdeps = [] | ||
149 | for dep in deps: | ||
150 | if regex and dep.startswith("^") and dep.endswith("$"): | ||
151 | newdeps.append(dep[:-1].replace(pn, bpn) + "-native$") | ||
152 | elif dep == pn: | ||
153 | if not selfref: | ||
154 | continue | ||
155 | newdeps.append(dep) | ||
156 | elif "-cross-" in dep: | ||
157 | newdeps.append(dep.replace("-cross", "-native")) | ||
158 | elif not dep.endswith("-native"): | ||
159 | # Replace ${PN} with ${BPN} in the dependency to make sure | ||
160 | # dependencies on, e.g., ${PN}-foo become ${BPN}-foo-native | ||
161 | # rather than ${BPN}-native-foo-native. | ||
162 | newdeps.append(dep.replace(pn, bpn) + "-native") | ||
163 | else: | ||
164 | newdeps.append(dep) | ||
165 | output_varname = varname | ||
166 | # Handle ${PN}-xxx -> ${BPN}-xxx-native | 143 | # Handle ${PN}-xxx -> ${BPN}-xxx-native |
167 | if suffix != "${PN}" and "${PN}" in suffix: | 144 | if suffix != "${PN}" and "${PN}" in suffix: |
168 | output_varname = varname.replace("${PN}", "${BPN}") + "-native" | 145 | output_varname = varname.replace("${PN}", "${BPN}") + "-native" |
169 | d.renameVar(varname, output_varname) | 146 | d.renameVar(varname, output_varname) |
170 | d.setVar(output_varname, " ".join(newdeps)) | ||
171 | 147 | ||
172 | map_dependencies("DEPENDS", e.data, selfref=False) | 148 | d.setVarFilter("DEPENDS", "native_filter(val, '" + pn + "', '" + bpn + "', selfref=False)") |
149 | |||
150 | for varname in ["RDEPENDS", "RRECOMMENDS", "RSUGGESTS", "RPROVIDES", "RREPLACES"]: | ||
151 | d.setVarFilter(varname, "native_filter(val, '" + pn + "', '" + bpn + "')") | ||
152 | |||
173 | # We need to handle things like ${@bb.utils.contains('PTEST_ENABLED', '1', '${PN}-ptest', '', d)} | 153 | # We need to handle things like ${@bb.utils.contains('PTEST_ENABLED', '1', '${PN}-ptest', '', d)} |
174 | # and not pass ${PN}-test since in the native case it would be ignored. This does mean we ignore | 154 | # and not pass ${PN}-test since in the native case it would be ignored. This does mean we ignore |
175 | # anonymous python derived PACKAGES entries. | 155 | # anonymous python derived PACKAGES entries. |
@@ -181,8 +161,9 @@ python native_virtclass_handler () { | |||
181 | map_dependencies("RSUGGESTS", e.data, pkg) | 161 | map_dependencies("RSUGGESTS", e.data, pkg) |
182 | map_dependencies("RPROVIDES", e.data, pkg) | 162 | map_dependencies("RPROVIDES", e.data, pkg) |
183 | map_dependencies("RREPLACES", e.data, pkg) | 163 | map_dependencies("RREPLACES", e.data, pkg) |
184 | map_dependencies("PACKAGES", e.data) | 164 | |
185 | map_dependencies("PACKAGES_DYNAMIC", e.data, regex=True) | 165 | d.setVarFilter("PACKAGES", "native_filter(val, '" + pn + "', '" + bpn + "')") |
166 | d.setVarFilter("PACKAGES_DYNAMIC", "native_filter(val, '" + pn + "', '" + bpn + "', regex=True)") | ||
186 | 167 | ||
187 | provides = e.data.getVar("PROVIDES") | 168 | provides = e.data.getVar("PROVIDES") |
188 | nprovides = [] | 169 | nprovides = [] |
diff --git a/meta/classes-recipe/nativesdk.bbclass b/meta/classes-recipe/nativesdk.bbclass index 7ecb4c12c1..9838d5a54b 100644 --- a/meta/classes-recipe/nativesdk.bbclass +++ b/meta/classes-recipe/nativesdk.bbclass | |||
@@ -99,15 +99,14 @@ python () { | |||
99 | 99 | ||
100 | import oe.classextend | 100 | import oe.classextend |
101 | 101 | ||
102 | clsextend = oe.classextend.NativesdkClassExtender("nativesdk", d) | 102 | clsextend = oe.classextend.ClassExtender("nativesdk", [], d) |
103 | clsextend.rename_packages() | ||
104 | clsextend.rename_package_variables((d.getVar("PACKAGEVARS") or "").split()) | 103 | clsextend.rename_package_variables((d.getVar("PACKAGEVARS") or "").split()) |
105 | 104 | ||
106 | clsextend.map_depends_variable("DEPENDS") | 105 | clsextend.set_filter("DEPENDS", deps=True) |
107 | clsextend.map_depends_variable("PACKAGE_WRITE_DEPS") | 106 | clsextend.set_filter("PACKAGE_WRITE_DEPS", deps=False) |
108 | clsextend.map_packagevars() | 107 | clsextend.map_packagevars() |
109 | clsextend.map_variable("PROVIDES") | 108 | clsextend.set_filter("PROVIDES", deps=False) |
110 | clsextend.map_regexp_variable("PACKAGES_DYNAMIC") | 109 | |
111 | d.setVar("LIBCEXTENSION", "") | 110 | d.setVar("LIBCEXTENSION", "") |
112 | d.setVar("ABIEXTENSION", "") | 111 | d.setVar("ABIEXTENSION", "") |
113 | } | 112 | } |
diff --git a/meta/classes-recipe/toolchain-scripts.bbclass b/meta/classes-recipe/toolchain-scripts.bbclass index 5874a48af8..5d28df845b 100644 --- a/meta/classes-recipe/toolchain-scripts.bbclass +++ b/meta/classes-recipe/toolchain-scripts.bbclass | |||
@@ -238,11 +238,11 @@ toolchain_create_sdk_siteconfig () { | |||
238 | python __anonymous () { | 238 | python __anonymous () { |
239 | import oe.classextend | 239 | import oe.classextend |
240 | deps = "" | 240 | deps = "" |
241 | prefixes = (d.getVar("MULTILIB_VARIANTS") or "").split() | ||
241 | for dep in (d.getVar('TOOLCHAIN_NEED_CONFIGSITE_CACHE') or "").split(): | 242 | for dep in (d.getVar('TOOLCHAIN_NEED_CONFIGSITE_CACHE') or "").split(): |
242 | deps += " %s:do_populate_sysroot" % dep | 243 | deps += " %s:do_populate_sysroot" % dep |
243 | for variant in (d.getVar('MULTILIB_VARIANTS') or "").split(): | 244 | for variant in (d.getVar('MULTILIB_VARIANTS') or "").split(): |
244 | clsextend = oe.classextend.ClassExtender(variant, d) | 245 | newdep = oe.classextend.add_suffix(dep, variant, prefixes) |
245 | newdep = clsextend.extend_name(dep) | ||
246 | deps += " %s:do_populate_sysroot" % newdep | 246 | deps += " %s:do_populate_sysroot" % newdep |
247 | d.appendVarFlag('do_configure', 'depends', deps) | 247 | d.appendVarFlag('do_configure', 'depends', deps) |
248 | } | 248 | } |
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 | ||
diff --git a/meta/lib/oe/__init__.py b/meta/lib/oe/__init__.py index 73de774266..9e4134c483 100644 --- a/meta/lib/oe/__init__.py +++ b/meta/lib/oe/__init__.py | |||
@@ -12,4 +12,4 @@ __path__ = extend_path(__path__, __name__) | |||
12 | BBIMPORTS = ["qa", "data", "path", "utils", "types", "package", "packagedata", \ | 12 | BBIMPORTS = ["qa", "data", "path", "utils", "types", "package", "packagedata", \ |
13 | "packagegroup", "sstatesig", "lsb", "cachedpath", "license", "qemu", \ | 13 | "packagegroup", "sstatesig", "lsb", "cachedpath", "license", "qemu", \ |
14 | "reproducible", "rust", "buildcfg", "go", "spdx30_tasks", "spdx_common", \ | 14 | "reproducible", "rust", "buildcfg", "go", "spdx30_tasks", "spdx_common", \ |
15 | "cve_check", "tune"] | 15 | "cve_check", "tune", "classextend"] |
diff --git a/meta/lib/oe/classextend.py b/meta/lib/oe/classextend.py index 8ae5d3b715..ddca10dee5 100644 --- a/meta/lib/oe/classextend.py +++ b/meta/lib/oe/classextend.py | |||
@@ -5,155 +5,136 @@ | |||
5 | # | 5 | # |
6 | 6 | ||
7 | import collections | 7 | import collections |
8 | import bb.filter | ||
9 | |||
10 | @bb.filter.filter_proc() | ||
11 | def native_filter(val, pn, bpn, regex=False, selfref=True): | ||
12 | deps = val | ||
13 | if not deps: | ||
14 | return | ||
15 | deps = bb.utils.explode_deps(deps) | ||
16 | newdeps = [] | ||
17 | for dep in deps: | ||
18 | if regex and dep.startswith("^") and dep.endswith("$"): | ||
19 | if not dep.endswith("-native$"): | ||
20 | newdeps.append(dep[:-1].replace(pn, bpn) + "-native$") | ||
21 | else: | ||
22 | newdeps.append(dep) | ||
23 | elif dep == pn: | ||
24 | if not selfref: | ||
25 | continue | ||
26 | newdeps.append(dep) | ||
27 | elif "-cross-" in dep: | ||
28 | newdeps.append(dep.replace("-cross", "-native")) | ||
29 | elif not dep.endswith("-native"): | ||
30 | # Replace ${PN} with ${BPN} in the dependency to make sure | ||
31 | # dependencies on, e.g., ${PN}-foo become ${BPN}-foo-native | ||
32 | # rather than ${BPN}-native-foo-native. | ||
33 | newdeps.append(dep.replace(pn, bpn) + "-native") | ||
34 | else: | ||
35 | newdeps.append(dep) | ||
36 | return " ".join(newdeps) | ||
37 | |||
38 | def add_suffix(val, extname, prefixes): | ||
39 | if val.startswith(extname + "-"): | ||
40 | return val | ||
41 | if val.endswith(("-native", "-native-runtime")) or ('nativesdk-' in val) or ('-cross-' in val) or ('-crosssdk-' in val): | ||
42 | return val | ||
43 | # If it starts with a known prefix (e.g. multilibs), just pass it through | ||
44 | for prefix in prefixes: | ||
45 | if val.startswith(prefix + "-"): | ||
46 | return val | ||
47 | if val.startswith("kernel-") or val == "virtual/kernel": | ||
48 | return val | ||
49 | if val.startswith("rtld"): | ||
50 | return val | ||
51 | if val.endswith("-crosssdk"): | ||
52 | return val | ||
53 | if val.endswith("-" + extname): | ||
54 | val = val.replace("-" + extname, "") | ||
55 | if val.startswith("virtual/"): | ||
56 | # Assume large numbers of dashes means a triplet is present and we don't need to convert | ||
57 | if val.count("-") >= 3 and val.endswith(("-go",)): | ||
58 | return val | ||
59 | subs = val.split("/", 1)[1] | ||
60 | if not subs.startswith(extname): | ||
61 | return "virtual/" + extname + "-" + subs | ||
62 | return val | ||
63 | if val.startswith("/") or (val.startswith("${") and val.endswith("}")): | ||
64 | return val | ||
65 | if not val.startswith(extname): | ||
66 | return extname + "-" + val | ||
67 | return val | ||
68 | |||
69 | def get_package_mappings(packages, extname): | ||
70 | pkgs_mapping = [] | ||
71 | for pkg in packages.split(): | ||
72 | if pkg.startswith(extname): | ||
73 | pkgs_mapping.append([pkg.split(extname + "-")[1], pkg]) | ||
74 | continue | ||
75 | pkgs_mapping.append([pkg, add_suffix(pkg, extname, [])]) | ||
76 | return pkgs_mapping | ||
77 | |||
78 | @bb.filter.filter_proc() | ||
79 | def package_suffix_filter(val, extname): | ||
80 | pkgs_mapping = get_package_mappings(val, extname) | ||
81 | return " ".join([row[1] for row in pkgs_mapping]) | ||
82 | |||
83 | @bb.filter.filter_proc() | ||
84 | def suffix_filter(val, extname, prefixes): | ||
85 | newdeps = [] | ||
86 | for dep in val.split(): | ||
87 | newdeps.append(add_suffix(dep, extname, prefixes)) | ||
88 | return " ".join(newdeps) | ||
89 | |||
90 | @bb.filter.filter_proc() | ||
91 | def suffix_filter_regex(val, extname, prefixes): | ||
92 | newvar = [] | ||
93 | for v in val.split(): | ||
94 | if v.startswith("^" + extname): | ||
95 | newvar.append(v) | ||
96 | elif v.startswith("^"): | ||
97 | newvar.append("^" + extname + "-" + v[1:]) | ||
98 | else: | ||
99 | newvar.append(add_suffix(v, extname, prefixes)) | ||
100 | return " ".join(newvar) | ||
8 | 101 | ||
9 | def get_packages(d): | 102 | @bb.filter.filter_proc() |
10 | pkgs = d.getVar("PACKAGES_NONML") | 103 | def suffix_filter_deps(val, extname, prefixes): |
11 | extcls = d.getVar("EXTENDERCLASS") | 104 | deps = bb.utils.explode_dep_versions2(val) |
12 | return extcls.rename_packages_internal(pkgs) | 105 | newdeps = collections.OrderedDict() |
13 | 106 | for dep in deps: | |
14 | def get_depends(varprefix, d): | 107 | newdeps[add_suffix(dep, extname, prefixes)] = deps[dep] |
15 | extcls = d.getVar("EXTENDERCLASS") | 108 | return bb.utils.join_deps(newdeps, False) |
16 | return extcls.map_depends_variable(varprefix + "_NONML") | ||
17 | 109 | ||
18 | class ClassExtender(object): | 110 | class ClassExtender(object): |
19 | def __init__(self, extname, d): | 111 | def __init__(self, extname, prefixes, d): |
20 | self.extname = extname | 112 | self.extname = extname |
21 | self.d = d | 113 | self.d = d |
22 | self.pkgs_mapping = [] | 114 | self.prefixes = prefixes |
23 | self.d.setVar("EXTENDERCLASS", self) | ||
24 | |||
25 | def extend_name(self, name): | ||
26 | if name.startswith("kernel-") or name == "virtual/kernel": | ||
27 | return name | ||
28 | if name.startswith("rtld"): | ||
29 | return name | ||
30 | if name.endswith("-crosssdk"): | ||
31 | return name | ||
32 | if name.endswith("-" + self.extname): | ||
33 | name = name.replace("-" + self.extname, "") | ||
34 | if name.startswith("virtual/"): | ||
35 | # Assume large numbers of dashes means a triplet is present and we don't need to convert | ||
36 | if name.count("-") >= 3 and name.endswith(("-go",)): | ||
37 | return name | ||
38 | subs = name.split("/", 1)[1] | ||
39 | if not subs.startswith(self.extname): | ||
40 | return "virtual/" + self.extname + "-" + subs | ||
41 | return name | ||
42 | if name.startswith("/") or (name.startswith("${") and name.endswith("}")): | ||
43 | return name | ||
44 | if not name.startswith(self.extname): | ||
45 | return self.extname + "-" + name | ||
46 | return name | ||
47 | |||
48 | def map_variable(self, varname, setvar = True): | ||
49 | var = self.d.getVar(varname) | ||
50 | if not var: | ||
51 | return "" | ||
52 | var = var.split() | ||
53 | newvar = [] | ||
54 | for v in var: | ||
55 | newvar.append(self.extend_name(v)) | ||
56 | newdata = " ".join(newvar) | ||
57 | if setvar: | ||
58 | self.d.setVar(varname, newdata) | ||
59 | return newdata | ||
60 | |||
61 | def map_regexp_variable(self, varname, setvar = True): | ||
62 | var = self.d.getVar(varname) | ||
63 | if not var: | ||
64 | return "" | ||
65 | var = var.split() | ||
66 | newvar = [] | ||
67 | for v in var: | ||
68 | if v.startswith("^" + self.extname): | ||
69 | newvar.append(v) | ||
70 | elif v.startswith("^"): | ||
71 | newvar.append("^" + self.extname + "-" + v[1:]) | ||
72 | else: | ||
73 | newvar.append(self.extend_name(v)) | ||
74 | newdata = " ".join(newvar) | ||
75 | if setvar: | ||
76 | self.d.setVar(varname, newdata) | ||
77 | return newdata | ||
78 | 115 | ||
79 | def map_depends(self, dep): | 116 | def set_filter(self, var, deps): |
80 | if dep.endswith(("-native", "-native-runtime")) or ('nativesdk-' in dep) or ('cross-canadian' in dep) or ('-crosssdk-' in dep): | 117 | if deps: |
81 | return dep | 118 | self.d.setVarFilter(var, "suffix_filter_deps(val, '" + self.extname + "', " + str(self.prefixes) + ")") |
82 | else: | 119 | else: |
83 | # Do not extend for that already have multilib prefix | 120 | self.d.setVarFilter(var, "suffix_filter(val, '" + self.extname + "', " + str(self.prefixes) + ")") |
84 | var = self.d.getVar("MULTILIB_VARIANTS") | ||
85 | if var: | ||
86 | var = var.split() | ||
87 | for v in var: | ||
88 | if dep.startswith(v): | ||
89 | return dep | ||
90 | return self.extend_name(dep) | ||
91 | |||
92 | def map_depends_variable(self, varname, suffix = ""): | ||
93 | # We need to preserve EXTENDPKGV so it can be expanded correctly later | ||
94 | if suffix: | ||
95 | varname = varname + ":" + suffix | ||
96 | orig = self.d.getVar("EXTENDPKGV", False) | ||
97 | self.d.setVar("EXTENDPKGV", "EXTENDPKGV") | ||
98 | deps = self.d.getVar(varname) | ||
99 | if not deps: | ||
100 | self.d.setVar("EXTENDPKGV", orig) | ||
101 | return | ||
102 | deps = bb.utils.explode_dep_versions2(deps) | ||
103 | newdeps = collections.OrderedDict() | ||
104 | for dep in deps: | ||
105 | newdeps[self.map_depends(dep)] = deps[dep] | ||
106 | |||
107 | if not varname.endswith("_NONML"): | ||
108 | self.d.renameVar(varname, varname + "_NONML") | ||
109 | self.d.setVar(varname, "${@oe.classextend.get_depends('%s', d)}" % varname) | ||
110 | self.d.appendVarFlag(varname, "vardeps", " " + varname + "_NONML") | ||
111 | ret = bb.utils.join_deps(newdeps, False).replace("EXTENDPKGV", "${EXTENDPKGV}") | ||
112 | self.d.setVar("EXTENDPKGV", orig) | ||
113 | return ret | ||
114 | 121 | ||
115 | def map_packagevars(self): | 122 | def map_packagevars(self): |
116 | for pkg in (self.d.getVar("PACKAGES").split() + [""]): | 123 | self.set_filter("RDEPENDS", deps=True) |
117 | self.map_depends_variable("RDEPENDS", pkg) | 124 | self.set_filter("RRECOMMENDS", deps=True) |
118 | self.map_depends_variable("RRECOMMENDS", pkg) | 125 | self.set_filter("RSUGGESTS", deps=True) |
119 | self.map_depends_variable("RSUGGESTS", pkg) | 126 | self.set_filter("RPROVIDES", deps=True) |
120 | self.map_depends_variable("RPROVIDES", pkg) | 127 | self.set_filter("RREPLACES", deps=True) |
121 | self.map_depends_variable("RREPLACES", pkg) | 128 | self.set_filter("RCONFLICTS", deps=True) |
122 | self.map_depends_variable("RCONFLICTS", pkg) | 129 | self.set_filter("PKG", deps=True) |
123 | self.map_depends_variable("PKG", pkg) | ||
124 | |||
125 | def rename_packages(self): | ||
126 | for pkg in (self.d.getVar("PACKAGES") or "").split(): | ||
127 | if pkg.startswith(self.extname): | ||
128 | self.pkgs_mapping.append([pkg.split(self.extname + "-")[1], pkg]) | ||
129 | continue | ||
130 | self.pkgs_mapping.append([pkg, self.extend_name(pkg)]) | ||
131 | |||
132 | self.d.renameVar("PACKAGES", "PACKAGES_NONML") | ||
133 | self.d.setVar("PACKAGES", "${@oe.classextend.get_packages(d)}") | ||
134 | |||
135 | def rename_packages_internal(self, pkgs): | ||
136 | self.pkgs_mapping = [] | ||
137 | for pkg in (self.d.expand(pkgs) or "").split(): | ||
138 | if pkg.startswith(self.extname): | ||
139 | self.pkgs_mapping.append([pkg.split(self.extname + "-")[1], pkg]) | ||
140 | continue | ||
141 | self.pkgs_mapping.append([pkg, self.extend_name(pkg)]) | ||
142 | |||
143 | return " ".join([row[1] for row in self.pkgs_mapping]) | ||
144 | 130 | ||
145 | def rename_package_variables(self, variables): | 131 | def rename_package_variables(self, variables): |
146 | for pkg_mapping in self.pkgs_mapping: | 132 | pkgs_mapping = get_package_mappings(self.d.getVar('PACKAGES'), self.extname) |
133 | self.d.setVarFilter('PACKAGES', "package_suffix_filter(val, '" + self.extname + "')") | ||
134 | self.d.setVarFilter('PACKAGES_DYNAMIC', "suffix_filter_regex(val, '" + self.extname + "', " + str(self.prefixes) + ")") | ||
135 | |||
136 | for pkg_mapping in pkgs_mapping: | ||
147 | if pkg_mapping[0].startswith("${") and pkg_mapping[0].endswith("}"): | 137 | if pkg_mapping[0].startswith("${") and pkg_mapping[0].endswith("}"): |
148 | continue | 138 | continue |
149 | for subs in variables: | 139 | for subs in variables: |
150 | self.d.renameVar("%s:%s" % (subs, pkg_mapping[0]), "%s:%s" % (subs, pkg_mapping[1])) | 140 | self.d.renameVar("%s:%s" % (subs, pkg_mapping[0]), "%s:%s" % (subs, pkg_mapping[1])) |
151 | |||
152 | class NativesdkClassExtender(ClassExtender): | ||
153 | def map_depends(self, dep): | ||
154 | if dep.startswith(self.extname): | ||
155 | return dep | ||
156 | if dep.endswith(("-native", "-native-runtime")) or ('nativesdk-' in dep) or ('-cross-' in dep) or ('-crosssdk-' in dep): | ||
157 | return dep | ||
158 | else: | ||
159 | return self.extend_name(dep) | ||