1c342db35SBrad Bishop# 292b42cb3SPatrick Williams# Copyright OpenEmbedded Contributors 392b42cb3SPatrick Williams# 4c342db35SBrad Bishop# SPDX-License-Identifier: GPL-2.0-only 5c342db35SBrad Bishop# 6c342db35SBrad Bishop 7eb8dc403SDave Cobbleyimport collections 8eb8dc403SDave Cobbley 91e34c2d0SAndrew Geisslerdef get_packages(d): 101e34c2d0SAndrew Geissler pkgs = d.getVar("PACKAGES_NONML") 111e34c2d0SAndrew Geissler extcls = d.getVar("EXTENDERCLASS") 121e34c2d0SAndrew Geissler return extcls.rename_packages_internal(pkgs) 131e34c2d0SAndrew Geissler 141e34c2d0SAndrew Geisslerdef get_depends(varprefix, d): 151e34c2d0SAndrew Geissler extcls = d.getVar("EXTENDERCLASS") 161e34c2d0SAndrew Geissler return extcls.map_depends_variable(varprefix + "_NONML") 171e34c2d0SAndrew Geissler 18eb8dc403SDave Cobbleyclass ClassExtender(object): 19eb8dc403SDave Cobbley def __init__(self, extname, d): 20eb8dc403SDave Cobbley self.extname = extname 21eb8dc403SDave Cobbley self.d = d 22eb8dc403SDave Cobbley self.pkgs_mapping = [] 231e34c2d0SAndrew Geissler self.d.setVar("EXTENDERCLASS", self) 24eb8dc403SDave Cobbley 25eb8dc403SDave Cobbley def extend_name(self, name): 26eb8dc403SDave Cobbley if name.startswith("kernel-") or name == "virtual/kernel": 27eb8dc403SDave Cobbley return name 28eb8dc403SDave Cobbley if name.startswith("rtld"): 29eb8dc403SDave Cobbley return name 30eb8dc403SDave Cobbley if name.endswith("-crosssdk"): 31eb8dc403SDave Cobbley return name 32eb8dc403SDave Cobbley if name.endswith("-" + self.extname): 33eb8dc403SDave Cobbley name = name.replace("-" + self.extname, "") 34eb8dc403SDave Cobbley if name.startswith("virtual/"): 35*028142bdSAndrew Geissler # Assume large numbers of dashes means a triplet is present and we don't need to convert 36*028142bdSAndrew Geissler if name.count("-") >= 3 and name.endswith(("-go", "-binutils", "-gcc", "-g++")): 37*028142bdSAndrew Geissler return name 38eb8dc403SDave Cobbley subs = name.split("/", 1)[1] 39eb8dc403SDave Cobbley if not subs.startswith(self.extname): 40eb8dc403SDave Cobbley return "virtual/" + self.extname + "-" + subs 41eb8dc403SDave Cobbley return name 421e34c2d0SAndrew Geissler if name.startswith("/") or (name.startswith("${") and name.endswith("}")): 43a34c030eSBrad Bishop return name 44eb8dc403SDave Cobbley if not name.startswith(self.extname): 45eb8dc403SDave Cobbley return self.extname + "-" + name 46eb8dc403SDave Cobbley return name 47eb8dc403SDave Cobbley 48eb8dc403SDave Cobbley def map_variable(self, varname, setvar = True): 49eb8dc403SDave Cobbley var = self.d.getVar(varname) 50eb8dc403SDave Cobbley if not var: 51eb8dc403SDave Cobbley return "" 52eb8dc403SDave Cobbley var = var.split() 53eb8dc403SDave Cobbley newvar = [] 54eb8dc403SDave Cobbley for v in var: 55eb8dc403SDave Cobbley newvar.append(self.extend_name(v)) 56eb8dc403SDave Cobbley newdata = " ".join(newvar) 57eb8dc403SDave Cobbley if setvar: 58eb8dc403SDave Cobbley self.d.setVar(varname, newdata) 59eb8dc403SDave Cobbley return newdata 60eb8dc403SDave Cobbley 61eb8dc403SDave Cobbley def map_regexp_variable(self, varname, setvar = True): 62eb8dc403SDave Cobbley var = self.d.getVar(varname) 63eb8dc403SDave Cobbley if not var: 64eb8dc403SDave Cobbley return "" 65eb8dc403SDave Cobbley var = var.split() 66eb8dc403SDave Cobbley newvar = [] 67eb8dc403SDave Cobbley for v in var: 68eb8dc403SDave Cobbley if v.startswith("^" + self.extname): 69eb8dc403SDave Cobbley newvar.append(v) 70eb8dc403SDave Cobbley elif v.startswith("^"): 71eb8dc403SDave Cobbley newvar.append("^" + self.extname + "-" + v[1:]) 72eb8dc403SDave Cobbley else: 73eb8dc403SDave Cobbley newvar.append(self.extend_name(v)) 74eb8dc403SDave Cobbley newdata = " ".join(newvar) 75eb8dc403SDave Cobbley if setvar: 76eb8dc403SDave Cobbley self.d.setVar(varname, newdata) 77eb8dc403SDave Cobbley return newdata 78eb8dc403SDave Cobbley 79eb8dc403SDave Cobbley def map_depends(self, dep): 80eb8dc403SDave Cobbley if dep.endswith(("-native", "-native-runtime")) or ('nativesdk-' in dep) or ('cross-canadian' in dep) or ('-crosssdk-' in dep): 81eb8dc403SDave Cobbley return dep 82eb8dc403SDave Cobbley else: 83eb8dc403SDave Cobbley # Do not extend for that already have multilib prefix 84eb8dc403SDave Cobbley var = self.d.getVar("MULTILIB_VARIANTS") 85eb8dc403SDave Cobbley if var: 86eb8dc403SDave Cobbley var = var.split() 87eb8dc403SDave Cobbley for v in var: 88eb8dc403SDave Cobbley if dep.startswith(v): 89eb8dc403SDave Cobbley return dep 90eb8dc403SDave Cobbley return self.extend_name(dep) 91eb8dc403SDave Cobbley 92eb8dc403SDave Cobbley def map_depends_variable(self, varname, suffix = ""): 93eb8dc403SDave Cobbley # We need to preserve EXTENDPKGV so it can be expanded correctly later 94eb8dc403SDave Cobbley if suffix: 95213cb269SPatrick Williams varname = varname + ":" + suffix 96eb8dc403SDave Cobbley orig = self.d.getVar("EXTENDPKGV", False) 97eb8dc403SDave Cobbley self.d.setVar("EXTENDPKGV", "EXTENDPKGV") 98eb8dc403SDave Cobbley deps = self.d.getVar(varname) 99eb8dc403SDave Cobbley if not deps: 100eb8dc403SDave Cobbley self.d.setVar("EXTENDPKGV", orig) 101eb8dc403SDave Cobbley return 102eb8dc403SDave Cobbley deps = bb.utils.explode_dep_versions2(deps) 103eb8dc403SDave Cobbley newdeps = collections.OrderedDict() 104eb8dc403SDave Cobbley for dep in deps: 105eb8dc403SDave Cobbley newdeps[self.map_depends(dep)] = deps[dep] 106eb8dc403SDave Cobbley 1071e34c2d0SAndrew Geissler if not varname.endswith("_NONML"): 1081e34c2d0SAndrew Geissler self.d.renameVar(varname, varname + "_NONML") 1091e34c2d0SAndrew Geissler self.d.setVar(varname, "${@oe.classextend.get_depends('%s', d)}" % varname) 1101e34c2d0SAndrew Geissler self.d.appendVarFlag(varname, "vardeps", " " + varname + "_NONML") 1111e34c2d0SAndrew Geissler ret = bb.utils.join_deps(newdeps, False).replace("EXTENDPKGV", "${EXTENDPKGV}") 112eb8dc403SDave Cobbley self.d.setVar("EXTENDPKGV", orig) 1131e34c2d0SAndrew Geissler return ret 114eb8dc403SDave Cobbley 115eb8dc403SDave Cobbley def map_packagevars(self): 116eb8dc403SDave Cobbley for pkg in (self.d.getVar("PACKAGES").split() + [""]): 117eb8dc403SDave Cobbley self.map_depends_variable("RDEPENDS", pkg) 118eb8dc403SDave Cobbley self.map_depends_variable("RRECOMMENDS", pkg) 119eb8dc403SDave Cobbley self.map_depends_variable("RSUGGESTS", pkg) 120eb8dc403SDave Cobbley self.map_depends_variable("RPROVIDES", pkg) 121eb8dc403SDave Cobbley self.map_depends_variable("RREPLACES", pkg) 122eb8dc403SDave Cobbley self.map_depends_variable("RCONFLICTS", pkg) 123eb8dc403SDave Cobbley self.map_depends_variable("PKG", pkg) 124eb8dc403SDave Cobbley 125eb8dc403SDave Cobbley def rename_packages(self): 126eb8dc403SDave Cobbley for pkg in (self.d.getVar("PACKAGES") or "").split(): 127eb8dc403SDave Cobbley if pkg.startswith(self.extname): 128eb8dc403SDave Cobbley self.pkgs_mapping.append([pkg.split(self.extname + "-")[1], pkg]) 129eb8dc403SDave Cobbley continue 130eb8dc403SDave Cobbley self.pkgs_mapping.append([pkg, self.extend_name(pkg)]) 131eb8dc403SDave Cobbley 1321e34c2d0SAndrew Geissler self.d.renameVar("PACKAGES", "PACKAGES_NONML") 1331e34c2d0SAndrew Geissler self.d.setVar("PACKAGES", "${@oe.classextend.get_packages(d)}") 1341e34c2d0SAndrew Geissler 1351e34c2d0SAndrew Geissler def rename_packages_internal(self, pkgs): 1361e34c2d0SAndrew Geissler self.pkgs_mapping = [] 1371e34c2d0SAndrew Geissler for pkg in (self.d.expand(pkgs) or "").split(): 1381e34c2d0SAndrew Geissler if pkg.startswith(self.extname): 1391e34c2d0SAndrew Geissler self.pkgs_mapping.append([pkg.split(self.extname + "-")[1], pkg]) 1401e34c2d0SAndrew Geissler continue 1411e34c2d0SAndrew Geissler self.pkgs_mapping.append([pkg, self.extend_name(pkg)]) 1421e34c2d0SAndrew Geissler 1431e34c2d0SAndrew Geissler return " ".join([row[1] for row in self.pkgs_mapping]) 144eb8dc403SDave Cobbley 145eb8dc403SDave Cobbley def rename_package_variables(self, variables): 146eb8dc403SDave Cobbley for pkg_mapping in self.pkgs_mapping: 1471e34c2d0SAndrew Geissler if pkg_mapping[0].startswith("${") and pkg_mapping[0].endswith("}"): 1481e34c2d0SAndrew Geissler continue 149eb8dc403SDave Cobbley for subs in variables: 150213cb269SPatrick Williams self.d.renameVar("%s:%s" % (subs, pkg_mapping[0]), "%s:%s" % (subs, pkg_mapping[1])) 151eb8dc403SDave Cobbley 152eb8dc403SDave Cobbleyclass NativesdkClassExtender(ClassExtender): 153eb8dc403SDave Cobbley def map_depends(self, dep): 154eb8dc403SDave Cobbley if dep.startswith(self.extname): 155eb8dc403SDave Cobbley return dep 156*028142bdSAndrew Geissler if dep.endswith(("-native", "-native-runtime")) or ('nativesdk-' in dep) or ('-cross-' in dep) or ('-crosssdk-' in dep): 157eb8dc403SDave Cobbley return dep 158eb8dc403SDave Cobbley else: 159eb8dc403SDave Cobbley return self.extend_name(dep) 160