diff options
Diffstat (limited to 'meta/lib/oe/classextend.py')
| -rw-r--r-- | meta/lib/oe/classextend.py | 258 |
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 | ||
| 5 | 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) | ||
| 6 | 101 | ||
| 7 | def get_packages(d): | 102 | @bb.filter.filter_proc() |
| 8 | pkgs = d.getVar("PACKAGES_NONML") | 103 | def 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: | |
| 12 | def 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 | ||
| 16 | class ClassExtender(object): | 110 | class 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 | |||
| 147 | class 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) | ||
