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