summaryrefslogtreecommitdiffstats
path: root/meta/lib/oe/classextend.py
diff options
context:
space:
mode:
Diffstat (limited to 'meta/lib/oe/classextend.py')
-rw-r--r--meta/lib/oe/classextend.py258
1 files changed, 121 insertions, 137 deletions
diff --git a/meta/lib/oe/classextend.py b/meta/lib/oe/classextend.py
index d3d8fbe724..ddca10dee5 100644
--- a/meta/lib/oe/classextend.py
+++ b/meta/lib/oe/classextend.py
@@ -1,156 +1,140 @@
1# 1#
2# Copyright OpenEmbedded Contributors
3#
2# SPDX-License-Identifier: GPL-2.0-only 4# SPDX-License-Identifier: GPL-2.0-only
3# 5#
4 6
5import collections 7import collections
8import bb.filter
9
10@bb.filter.filter_proc()
11def 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
38def 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
69def 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()
79def 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()
84def 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()
91def 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)
6 101
7def get_packages(d): 102@bb.filter.filter_proc()
8 pkgs = d.getVar("PACKAGES_NONML") 103def suffix_filter_deps(val, extname, prefixes):
9 extcls = d.getVar("EXTENDERCLASS") 104 deps = bb.utils.explode_dep_versions2(val)
10 return extcls.rename_packages_internal(pkgs) 105 newdeps = collections.OrderedDict()
11 106 for dep in deps:
12def get_depends(varprefix, d): 107 newdeps[add_suffix(dep, extname, prefixes)] = deps[dep]
13 extcls = d.getVar("EXTENDERCLASS") 108 return bb.utils.join_deps(newdeps, False)
14 return extcls.map_depends_variable(varprefix + "_NONML")
15 109
16class ClassExtender(object): 110class ClassExtender(object):
17 def __init__(self, extname, d): 111 def __init__(self, extname, prefixes, d):
18 self.extname = extname 112 self.extname = extname
19 self.d = d 113 self.d = d
20 self.pkgs_mapping = [] 114 self.prefixes = prefixes
21 self.d.setVar("EXTENDERCLASS", self)
22
23 def extend_name(self, name):
24 if name.startswith("kernel-") or name == "virtual/kernel":
25 return name
26 if name.startswith("rtld"):
27 return name
28 if name.endswith("-crosssdk"):
29 return name
30 if name.endswith("-" + self.extname):
31 name = name.replace("-" + self.extname, "")
32 if name.startswith("virtual/"):
33 subs = name.split("/", 1)[1]
34 if not subs.startswith(self.extname):
35 return "virtual/" + self.extname + "-" + subs
36 return name
37 if name.startswith("/") or (name.startswith("${") and name.endswith("}")):
38 return name
39 if not name.startswith(self.extname):
40 return self.extname + "-" + name
41 return name
42
43 def map_variable(self, varname, setvar = True):
44 var = self.d.getVar(varname)
45 if not var:
46 return ""
47 var = var.split()
48 newvar = []
49 for v in var:
50 newvar.append(self.extend_name(v))
51 newdata = " ".join(newvar)
52 if setvar:
53 self.d.setVar(varname, newdata)
54 return newdata
55
56 def map_regexp_variable(self, varname, setvar = True):
57 var = self.d.getVar(varname)
58 if not var:
59 return ""
60 var = var.split()
61 newvar = []
62 for v in var:
63 if v.startswith("^" + self.extname):
64 newvar.append(v)
65 elif v.startswith("^"):
66 newvar.append("^" + self.extname + "-" + v[1:])
67 else:
68 newvar.append(self.extend_name(v))
69 newdata = " ".join(newvar)
70 if setvar:
71 self.d.setVar(varname, newdata)
72 return newdata
73 115
74 def map_depends(self, dep): 116 def set_filter(self, var, deps):
75 if dep.endswith(("-native", "-native-runtime")) or ('nativesdk-' in dep) or ('cross-canadian' in dep) or ('-crosssdk-' in dep): 117 if deps:
76 return dep 118 self.d.setVarFilter(var, "suffix_filter_deps(val, '" + self.extname + "', " + str(self.prefixes) + ")")
77 else: 119 else:
78 # Do not extend for that already have multilib prefix 120 self.d.setVarFilter(var, "suffix_filter(val, '" + self.extname + "', " + str(self.prefixes) + ")")
79 var = self.d.getVar("MULTILIB_VARIANTS")
80 if var:
81 var = var.split()
82 for v in var:
83 if dep.startswith(v):
84 return dep
85 return self.extend_name(dep)
86
87 def map_depends_variable(self, varname, suffix = ""):
88 # We need to preserve EXTENDPKGV so it can be expanded correctly later
89 if suffix:
90 varname = varname + "_" + suffix
91 orig = self.d.getVar("EXTENDPKGV", False)
92 self.d.setVar("EXTENDPKGV", "EXTENDPKGV")
93 deps = self.d.getVar(varname)
94 if not deps:
95 self.d.setVar("EXTENDPKGV", orig)
96 return
97 deps = bb.utils.explode_dep_versions2(deps)
98 newdeps = collections.OrderedDict()
99 for dep in deps:
100 newdeps[self.map_depends(dep)] = deps[dep]
101
102 if not varname.endswith("_NONML"):
103 self.d.renameVar(varname, varname + "_NONML")
104 self.d.setVar(varname, "${@oe.classextend.get_depends('%s', d)}" % varname)
105 self.d.appendVarFlag(varname, "vardeps", " " + varname + "_NONML")
106 ret = bb.utils.join_deps(newdeps, False).replace("EXTENDPKGV", "${EXTENDPKGV}")
107 self.d.setVar("EXTENDPKGV", orig)
108 return ret
109 121
110 def map_packagevars(self): 122 def map_packagevars(self):
111 for pkg in (self.d.getVar("PACKAGES").split() + [""]): 123 self.set_filter("RDEPENDS", deps=True)
112 self.map_depends_variable("RDEPENDS", pkg) 124 self.set_filter("RRECOMMENDS", deps=True)
113 self.map_depends_variable("RRECOMMENDS", pkg) 125 self.set_filter("RSUGGESTS", deps=True)
114 self.map_depends_variable("RSUGGESTS", pkg) 126 self.set_filter("RPROVIDES", deps=True)
115 self.map_depends_variable("RPROVIDES", pkg) 127 self.set_filter("RREPLACES", deps=True)
116 self.map_depends_variable("RREPLACES", pkg) 128 self.set_filter("RCONFLICTS", deps=True)
117 self.map_depends_variable("RCONFLICTS", pkg) 129 self.set_filter("PKG", deps=True)
118 self.map_depends_variable("PKG", pkg)
119
120 def rename_packages(self):
121 for pkg in (self.d.getVar("PACKAGES") or "").split():
122 if pkg.startswith(self.extname):
123 self.pkgs_mapping.append([pkg.split(self.extname + "-")[1], pkg])
124 continue
125 self.pkgs_mapping.append([pkg, self.extend_name(pkg)])
126
127 self.d.renameVar("PACKAGES", "PACKAGES_NONML")
128 self.d.setVar("PACKAGES", "${@oe.classextend.get_packages(d)}")
129
130 def rename_packages_internal(self, pkgs):
131 self.pkgs_mapping = []
132 for pkg in (self.d.expand(pkgs) or "").split():
133 if pkg.startswith(self.extname):
134 self.pkgs_mapping.append([pkg.split(self.extname + "-")[1], pkg])
135 continue
136 self.pkgs_mapping.append([pkg, self.extend_name(pkg)])
137
138 return " ".join([row[1] for row in self.pkgs_mapping])
139 130
140 def rename_package_variables(self, variables): 131 def rename_package_variables(self, variables):
141 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:
142 if pkg_mapping[0].startswith("${") and pkg_mapping[0].endswith("}"): 137 if pkg_mapping[0].startswith("${") and pkg_mapping[0].endswith("}"):
143 continue 138 continue
144 for subs in variables: 139 for subs in variables:
145 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]))
146
147class NativesdkClassExtender(ClassExtender):
148 def map_depends(self, dep):
149 if dep.startswith(self.extname):
150 return dep
151 if dep.endswith(("-gcc", "-g++")):
152 return dep + "-crosssdk"
153 elif dep.endswith(("-native", "-native-runtime")) or ('nativesdk-' in dep) or ('-cross-' in dep) or ('-crosssdk-' in dep):
154 return dep
155 else:
156 return self.extend_name(dep)