# # SPDX-License-Identifier: GPL-2.0-only # import collections def get_packages(d): pkgs = d.getVar("PACKAGES_NONML") extcls = d.getVar("EXTENDERCLASS") return extcls.rename_packages_internal(pkgs) def get_depends(varprefix, d): extcls = d.getVar("EXTENDERCLASS") return extcls.map_depends_variable(varprefix + "_NONML") class ClassExtender(object): def __init__(self, extname, d): self.extname = extname self.d = d self.pkgs_mapping = [] self.d.setVar("EXTENDERCLASS", self) def extend_name(self, name): if name.startswith("kernel-") or name == "virtual/kernel": return name if name.startswith("rtld"): return name if name.endswith("-crosssdk"): return name if name.endswith("-" + self.extname): name = name.replace("-" + self.extname, "") if name.startswith("virtual/"): subs = name.split("/", 1)[1] if not subs.startswith(self.extname): return "virtual/" + self.extname + "-" + subs return name if name.startswith("/") or (name.startswith("${") and name.endswith("}")): return name if not name.startswith(self.extname): return self.extname + "-" + name return name def map_variable(self, varname, setvar = True): var = self.d.getVar(varname) if not var: return "" var = var.split() newvar = [] for v in var: newvar.append(self.extend_name(v)) newdata = " ".join(newvar) if setvar: self.d.setVar(varname, newdata) return newdata def map_regexp_variable(self, varname, setvar = True): var = self.d.getVar(varname) if not var: return "" var = var.split() newvar = [] for v in var: if v.startswith("^" + self.extname): newvar.append(v) elif v.startswith("^"): newvar.append("^" + self.extname + "-" + v[1:]) else: newvar.append(self.extend_name(v)) newdata = " ".join(newvar) if setvar: self.d.setVar(varname, newdata) return newdata def map_depends(self, dep): if dep.endswith(("-native", "-native-runtime")) or ('nativesdk-' in dep) or ('cross-canadian' in dep) or ('-crosssdk-' in dep): return dep else: # Do not extend for that already have multilib prefix var = self.d.getVar("MULTILIB_VARIANTS") if var: var = var.split() for v in var: if dep.startswith(v): return dep return self.extend_name(dep) def map_depends_variable(self, varname, suffix = ""): # We need to preserve EXTENDPKGV so it can be expanded correctly later if suffix: varname = varname + ":" + suffix orig = self.d.getVar("EXTENDPKGV", False) self.d.setVar("EXTENDPKGV", "EXTENDPKGV") deps = self.d.getVar(varname) if not deps: self.d.setVar("EXTENDPKGV", orig) return deps = bb.utils.explode_dep_versions2(deps) newdeps = collections.OrderedDict() for dep in deps: newdeps[self.map_depends(dep)] = deps[dep] if not varname.endswith("_NONML"): self.d.renameVar(varname, varname + "_NONML") self.d.setVar(varname, "${@oe.classextend.get_depends('%s', d)}" % varname) self.d.appendVarFlag(varname, "vardeps", " " + varname + "_NONML") ret = bb.utils.join_deps(newdeps, False).replace("EXTENDPKGV", "${EXTENDPKGV}") self.d.setVar("EXTENDPKGV", orig) return ret def map_packagevars(self): for pkg in (self.d.getVar("PACKAGES").split() + [""]): self.map_depends_variable("RDEPENDS", pkg) self.map_depends_variable("RRECOMMENDS", pkg) self.map_depends_variable("RSUGGESTS", pkg) self.map_depends_variable("RPROVIDES", pkg) self.map_depends_variable("RREPLACES", pkg) self.map_depends_variable("RCONFLICTS", pkg) self.map_depends_variable("PKG", pkg) def rename_packages(self): for pkg in (self.d.getVar("PACKAGES") or "").split(): if pkg.startswith(self.extname): self.pkgs_mapping.append([pkg.split(self.extname + "-")[1], pkg]) continue self.pkgs_mapping.append([pkg, self.extend_name(pkg)]) self.d.renameVar("PACKAGES", "PACKAGES_NONML") self.d.setVar("PACKAGES", "${@oe.classextend.get_packages(d)}") def rename_packages_internal(self, pkgs): self.pkgs_mapping = [] for pkg in (self.d.expand(pkgs) or "").split(): if pkg.startswith(self.extname): self.pkgs_mapping.append([pkg.split(self.extname + "-")[1], pkg]) continue self.pkgs_mapping.append([pkg, self.extend_name(pkg)]) return " ".join([row[1] for row in self.pkgs_mapping]) def rename_package_variables(self, variables): for pkg_mapping in self.pkgs_mapping: if pkg_mapping[0].startswith("${") and pkg_mapping[0].endswith("}"): continue for subs in variables: self.d.renameVar("%s:%s" % (subs, pkg_mapping[0]), "%s:%s" % (subs, pkg_mapping[1])) class NativesdkClassExtender(ClassExtender): def map_depends(self, dep): if dep.startswith(self.extname): return dep if dep.endswith(("-gcc", "-g++")): return dep + "-crosssdk" elif dep.endswith(("-native", "-native-runtime")) or ('nativesdk-' in dep) or ('-cross-' in dep) or ('-crosssdk-' in dep): return dep else: return self.extend_name(dep)