1*4882a593Smuzhiyundef preferred_ml_updates(d): 2*4882a593Smuzhiyun # If any of PREFERRED_PROVIDER, PREFERRED_RPROVIDER, REQUIRED_VERSION 3*4882a593Smuzhiyun # or PREFERRED_VERSION are set, we need to mirror these variables in 4*4882a593Smuzhiyun # the multilib case; 5*4882a593Smuzhiyun multilibs = d.getVar('MULTILIBS') or "" 6*4882a593Smuzhiyun if not multilibs: 7*4882a593Smuzhiyun return 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun prefixes = [] 10*4882a593Smuzhiyun for ext in multilibs.split(): 11*4882a593Smuzhiyun eext = ext.split(':') 12*4882a593Smuzhiyun if len(eext) > 1 and eext[0] == 'multilib': 13*4882a593Smuzhiyun prefixes.append(eext[1]) 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun required_versions = [] 16*4882a593Smuzhiyun preferred_versions = [] 17*4882a593Smuzhiyun providers = [] 18*4882a593Smuzhiyun rproviders = [] 19*4882a593Smuzhiyun for v in d.keys(): 20*4882a593Smuzhiyun if v.startswith("REQUIRED_VERSION_"): 21*4882a593Smuzhiyun required_versions.append(v) 22*4882a593Smuzhiyun if v.startswith("PREFERRED_VERSION_"): 23*4882a593Smuzhiyun preferred_versions.append(v) 24*4882a593Smuzhiyun if v.startswith("PREFERRED_PROVIDER_"): 25*4882a593Smuzhiyun providers.append(v) 26*4882a593Smuzhiyun if v.startswith("PREFERRED_RPROVIDER_"): 27*4882a593Smuzhiyun rproviders.append(v) 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun def sort_versions(versions, keyword): 30*4882a593Smuzhiyun version_str = "_".join([keyword, "VERSION", ""]) 31*4882a593Smuzhiyun for v in versions: 32*4882a593Smuzhiyun val = d.getVar(v, False) 33*4882a593Smuzhiyun pkg = v.replace(version_str, "") 34*4882a593Smuzhiyun if pkg.endswith("-native") or "-crosssdk-" in pkg or pkg.startswith(("nativesdk-", "virtual/nativesdk-")): 35*4882a593Smuzhiyun continue 36*4882a593Smuzhiyun if '-cross-' in pkg and '${' in pkg: 37*4882a593Smuzhiyun for p in prefixes: 38*4882a593Smuzhiyun localdata = bb.data.createCopy(d) 39*4882a593Smuzhiyun override = ":virtclass-multilib-" + p 40*4882a593Smuzhiyun localdata.setVar("OVERRIDES", localdata.getVar("OVERRIDES", False) + override) 41*4882a593Smuzhiyun if "-canadian-" in pkg: 42*4882a593Smuzhiyun newtune = localdata.getVar("DEFAULTTUNE:" + "virtclass-multilib-" + p, False) 43*4882a593Smuzhiyun if newtune: 44*4882a593Smuzhiyun localdata.setVar("DEFAULTTUNE", newtune) 45*4882a593Smuzhiyun newname = localdata.expand(v) 46*4882a593Smuzhiyun else: 47*4882a593Smuzhiyun newname = localdata.expand(v).replace(version_str, version_str + p + '-') 48*4882a593Smuzhiyun if newname != v: 49*4882a593Smuzhiyun newval = localdata.expand(val) 50*4882a593Smuzhiyun d.setVar(newname, newval) 51*4882a593Smuzhiyun # Avoid future variable key expansion 52*4882a593Smuzhiyun vexp = d.expand(v) 53*4882a593Smuzhiyun if v != vexp and d.getVar(v, False): 54*4882a593Smuzhiyun d.renameVar(v, vexp) 55*4882a593Smuzhiyun continue 56*4882a593Smuzhiyun for p in prefixes: 57*4882a593Smuzhiyun newname = version_str + p + "-" + pkg 58*4882a593Smuzhiyun if not d.getVar(newname, False): 59*4882a593Smuzhiyun d.setVar(newname, val) 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun sort_versions(required_versions, "REQUIRED") 62*4882a593Smuzhiyun sort_versions(preferred_versions, "PREFERRED") 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun for prov in providers: 65*4882a593Smuzhiyun val = d.getVar(prov, False) 66*4882a593Smuzhiyun pkg = prov.replace("PREFERRED_PROVIDER_", "") 67*4882a593Smuzhiyun if pkg.endswith("-native") or "-crosssdk-" in pkg or pkg.startswith(("nativesdk-", "virtual/nativesdk-")): 68*4882a593Smuzhiyun continue 69*4882a593Smuzhiyun if 'cross-canadian' in pkg: 70*4882a593Smuzhiyun for p in prefixes: 71*4882a593Smuzhiyun localdata = bb.data.createCopy(d) 72*4882a593Smuzhiyun override = ":virtclass-multilib-" + p 73*4882a593Smuzhiyun localdata.setVar("OVERRIDES", localdata.getVar("OVERRIDES", False) + override) 74*4882a593Smuzhiyun newname = localdata.expand(prov) 75*4882a593Smuzhiyun if newname != prov: 76*4882a593Smuzhiyun newval = localdata.expand(val) 77*4882a593Smuzhiyun d.setVar(newname, newval) 78*4882a593Smuzhiyun # Avoid future variable key expansion 79*4882a593Smuzhiyun provexp = d.expand(prov) 80*4882a593Smuzhiyun if prov != provexp and d.getVar(prov, False): 81*4882a593Smuzhiyun d.renameVar(prov, provexp) 82*4882a593Smuzhiyun continue 83*4882a593Smuzhiyun virt = "" 84*4882a593Smuzhiyun if pkg.startswith("virtual/"): 85*4882a593Smuzhiyun pkg = pkg.replace("virtual/", "") 86*4882a593Smuzhiyun virt = "virtual/" 87*4882a593Smuzhiyun for p in prefixes: 88*4882a593Smuzhiyun newval = None 89*4882a593Smuzhiyun if pkg != "kernel": 90*4882a593Smuzhiyun newval = p + "-" + val 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun # implement variable keys 93*4882a593Smuzhiyun localdata = bb.data.createCopy(d) 94*4882a593Smuzhiyun override = ":virtclass-multilib-" + p 95*4882a593Smuzhiyun localdata.setVar("OVERRIDES", localdata.getVar("OVERRIDES", False) + override) 96*4882a593Smuzhiyun newname = localdata.expand(prov) 97*4882a593Smuzhiyun if newname != prov and not d.getVar(newname, False): 98*4882a593Smuzhiyun d.setVar(newname, localdata.expand(newval)) 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun # implement alternative multilib name 101*4882a593Smuzhiyun newname = localdata.expand("PREFERRED_PROVIDER_" + virt + p + "-" + pkg) 102*4882a593Smuzhiyun if not d.getVar(newname, False) and newval != None: 103*4882a593Smuzhiyun d.setVar(newname, localdata.expand(newval)) 104*4882a593Smuzhiyun # Avoid future variable key expansion 105*4882a593Smuzhiyun provexp = d.expand(prov) 106*4882a593Smuzhiyun if prov != provexp and d.getVar(prov, False): 107*4882a593Smuzhiyun d.renameVar(prov, provexp) 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun for prov in rproviders: 110*4882a593Smuzhiyun val = d.getVar(prov, False) 111*4882a593Smuzhiyun pkg = prov.replace("PREFERRED_RPROVIDER_", "") 112*4882a593Smuzhiyun for p in prefixes: 113*4882a593Smuzhiyun newval = p + "-" + val 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun # implement variable keys 116*4882a593Smuzhiyun localdata = bb.data.createCopy(d) 117*4882a593Smuzhiyun override = ":virtclass-multilib-" + p 118*4882a593Smuzhiyun localdata.setVar("OVERRIDES", localdata.getVar("OVERRIDES", False) + override) 119*4882a593Smuzhiyun newname = localdata.expand(prov) 120*4882a593Smuzhiyun if newname != prov and not d.getVar(newname, False): 121*4882a593Smuzhiyun d.setVar(newname, localdata.expand(newval)) 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun # implement alternative multilib name 124*4882a593Smuzhiyun newname = localdata.expand("PREFERRED_RPROVIDER_" + p + "-" + pkg) 125*4882a593Smuzhiyun if not d.getVar(newname, False) and newval != None: 126*4882a593Smuzhiyun d.setVar(newname, localdata.expand(newval)) 127*4882a593Smuzhiyun # Avoid future variable key expansion 128*4882a593Smuzhiyun provexp = d.expand(prov) 129*4882a593Smuzhiyun if prov != provexp and d.getVar(prov, False): 130*4882a593Smuzhiyun d.renameVar(prov, provexp) 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun def translate_provide(prefix, prov): 133*4882a593Smuzhiyun # Really need to know if kernel modules class is inherited somehow 134*4882a593Smuzhiyun if prov == "lttng-modules": 135*4882a593Smuzhiyun return prov 136*4882a593Smuzhiyun if not prov.startswith("virtual/"): 137*4882a593Smuzhiyun return prefix + "-" + prov 138*4882a593Smuzhiyun if prov == "virtual/kernel": 139*4882a593Smuzhiyun return prov 140*4882a593Smuzhiyun prov = prov.replace("virtual/", "") 141*4882a593Smuzhiyun return "virtual/" + prefix + "-" + prov 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun mp = (d.getVar("BB_MULTI_PROVIDER_ALLOWED") or "").split() 144*4882a593Smuzhiyun extramp = [] 145*4882a593Smuzhiyun for p in mp: 146*4882a593Smuzhiyun if p.endswith("-native") or "-crosssdk-" in p or p.startswith(("nativesdk-", "virtual/nativesdk-")) or 'cross-canadian' in p: 147*4882a593Smuzhiyun continue 148*4882a593Smuzhiyun for pref in prefixes: 149*4882a593Smuzhiyun extramp.append(translate_provide(pref, p)) 150*4882a593Smuzhiyun d.setVar("BB_MULTI_PROVIDER_ALLOWED", " ".join(mp + extramp)) 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun abisafe = (d.getVar("SIGGEN_EXCLUDERECIPES_ABISAFE") or "").split() 153*4882a593Smuzhiyun extras = [] 154*4882a593Smuzhiyun for p in prefixes: 155*4882a593Smuzhiyun for a in abisafe: 156*4882a593Smuzhiyun extras.append(p + "-" + a) 157*4882a593Smuzhiyun d.appendVar("SIGGEN_EXCLUDERECIPES_ABISAFE", " " + " ".join(extras)) 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun siggen_exclude = (d.getVar("SIGGEN_EXCLUDE_SAFE_RECIPE_DEPS") or "").split() 160*4882a593Smuzhiyun extras = [] 161*4882a593Smuzhiyun for p in prefixes: 162*4882a593Smuzhiyun for a in siggen_exclude: 163*4882a593Smuzhiyun a1, a2 = a.split("->") 164*4882a593Smuzhiyun extras.append(translate_provide(p, a1) + "->" + translate_provide(p, a2)) 165*4882a593Smuzhiyun d.appendVar("SIGGEN_EXCLUDE_SAFE_RECIPE_DEPS", " " + " ".join(extras)) 166*4882a593Smuzhiyun 167*4882a593Smuzhiyunpython multilib_virtclass_handler_vendor () { 168*4882a593Smuzhiyun if isinstance(e, bb.event.ConfigParsed): 169*4882a593Smuzhiyun for v in e.data.getVar("MULTILIB_VARIANTS").split(): 170*4882a593Smuzhiyun if e.data.getVar("TARGET_VENDOR:virtclass-multilib-" + v, False) is None: 171*4882a593Smuzhiyun e.data.setVar("TARGET_VENDOR:virtclass-multilib-" + v, e.data.getVar("TARGET_VENDOR", False) + "ml" + v) 172*4882a593Smuzhiyun preferred_ml_updates(e.data) 173*4882a593Smuzhiyun} 174*4882a593Smuzhiyunaddhandler multilib_virtclass_handler_vendor 175*4882a593Smuzhiyunmultilib_virtclass_handler_vendor[eventmask] = "bb.event.ConfigParsed" 176*4882a593Smuzhiyun 177*4882a593Smuzhiyunpython multilib_virtclass_handler_global () { 178*4882a593Smuzhiyun variant = e.data.getVar("BBEXTENDVARIANT") 179*4882a593Smuzhiyun if variant: 180*4882a593Smuzhiyun return 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun non_ml_recipes = d.getVar('NON_MULTILIB_RECIPES').split() 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun if bb.data.inherits_class('kernel', e.data) or \ 185*4882a593Smuzhiyun bb.data.inherits_class('module-base', e.data) or \ 186*4882a593Smuzhiyun d.getVar('BPN') in non_ml_recipes: 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun # We need to avoid expanding KERNEL_VERSION which we can do by deleting it 189*4882a593Smuzhiyun # from a copy of the datastore 190*4882a593Smuzhiyun localdata = bb.data.createCopy(d) 191*4882a593Smuzhiyun localdata.delVar("KERNEL_VERSION") 192*4882a593Smuzhiyun 193*4882a593Smuzhiyun variants = (e.data.getVar("MULTILIB_VARIANTS") or "").split() 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun import oe.classextend 196*4882a593Smuzhiyun clsextends = [] 197*4882a593Smuzhiyun for variant in variants: 198*4882a593Smuzhiyun clsextends.append(oe.classextend.ClassExtender(variant, localdata)) 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun # Process PROVIDES 201*4882a593Smuzhiyun origprovs = provs = localdata.getVar("PROVIDES") or "" 202*4882a593Smuzhiyun for clsextend in clsextends: 203*4882a593Smuzhiyun provs = provs + " " + clsextend.map_variable("PROVIDES", setvar=False) 204*4882a593Smuzhiyun e.data.setVar("PROVIDES", provs) 205*4882a593Smuzhiyun 206*4882a593Smuzhiyun # Process RPROVIDES 207*4882a593Smuzhiyun origrprovs = rprovs = localdata.getVar("RPROVIDES") or "" 208*4882a593Smuzhiyun for clsextend in clsextends: 209*4882a593Smuzhiyun rprovs = rprovs + " " + clsextend.map_variable("RPROVIDES", setvar=False) 210*4882a593Smuzhiyun if rprovs.strip(): 211*4882a593Smuzhiyun e.data.setVar("RPROVIDES", rprovs) 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun # Process RPROVIDES:${PN}... 214*4882a593Smuzhiyun for pkg in (e.data.getVar("PACKAGES") or "").split(): 215*4882a593Smuzhiyun origrprovs = rprovs = localdata.getVar("RPROVIDES:%s" % pkg) or "" 216*4882a593Smuzhiyun for clsextend in clsextends: 217*4882a593Smuzhiyun rprovs = rprovs + " " + clsextend.map_variable("RPROVIDES:%s" % pkg, setvar=False) 218*4882a593Smuzhiyun rprovs = rprovs + " " + clsextend.extname + "-" + pkg 219*4882a593Smuzhiyun e.data.setVar("RPROVIDES:%s" % pkg, rprovs) 220*4882a593Smuzhiyun} 221*4882a593Smuzhiyun 222*4882a593Smuzhiyunaddhandler multilib_virtclass_handler_global 223*4882a593Smuzhiyunmultilib_virtclass_handler_global[eventmask] = "bb.event.RecipeTaskPreProcess" 224