1*4882a593Smuzhiyunpython multilib_virtclass_handler () { 2*4882a593Smuzhiyun cls = e.data.getVar("BBEXTENDCURR") 3*4882a593Smuzhiyun variant = e.data.getVar("BBEXTENDVARIANT") 4*4882a593Smuzhiyun if cls != "multilib" or not variant: 5*4882a593Smuzhiyun return 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun localdata = bb.data.createCopy(e.data) 8*4882a593Smuzhiyun localdata.delVar('TMPDIR') 9*4882a593Smuzhiyun e.data.setVar('STAGING_KERNEL_DIR', localdata.getVar('STAGING_KERNEL_DIR')) 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun # There should only be one kernel in multilib configs 12*4882a593Smuzhiyun # We also skip multilib setup for module packages. 13*4882a593Smuzhiyun provides = (e.data.getVar("PROVIDES") or "").split() 14*4882a593Smuzhiyun non_ml_recipes = d.getVar('NON_MULTILIB_RECIPES').split() 15*4882a593Smuzhiyun bpn = e.data.getVar("BPN") 16*4882a593Smuzhiyun if "virtual/kernel" in provides or \ 17*4882a593Smuzhiyun bb.data.inherits_class('module-base', e.data) or \ 18*4882a593Smuzhiyun bpn in non_ml_recipes: 19*4882a593Smuzhiyun raise bb.parse.SkipRecipe("We shouldn't have multilib variants for %s" % bpn) 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun save_var_name=e.data.getVar("MULTILIB_SAVE_VARNAME") or "" 22*4882a593Smuzhiyun for name in save_var_name.split(): 23*4882a593Smuzhiyun val=e.data.getVar(name) 24*4882a593Smuzhiyun if val: 25*4882a593Smuzhiyun e.data.setVar(name + "_MULTILIB_ORIGINAL", val) 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun overrides = e.data.getVar("OVERRIDES", False) 28*4882a593Smuzhiyun pn = e.data.getVar("PN", False) 29*4882a593Smuzhiyun overrides = overrides.replace("pn-${PN}", "pn-${PN}:pn-" + pn) 30*4882a593Smuzhiyun e.data.setVar("OVERRIDES", overrides) 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun if bb.data.inherits_class('image', e.data): 33*4882a593Smuzhiyun e.data.setVar("MLPREFIX", variant + "-") 34*4882a593Smuzhiyun e.data.setVar("PN", variant + "-" + e.data.getVar("PN", False)) 35*4882a593Smuzhiyun e.data.setVar('SDKTARGETSYSROOT', e.data.getVar('SDKTARGETSYSROOT')) 36*4882a593Smuzhiyun override = ":virtclass-multilib-" + variant 37*4882a593Smuzhiyun e.data.setVar("OVERRIDES", e.data.getVar("OVERRIDES", False) + override) 38*4882a593Smuzhiyun target_vendor = e.data.getVar("TARGET_VENDOR:" + "virtclass-multilib-" + variant, False) 39*4882a593Smuzhiyun if target_vendor: 40*4882a593Smuzhiyun e.data.setVar("TARGET_VENDOR", target_vendor) 41*4882a593Smuzhiyun return 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun if bb.data.inherits_class('cross-canadian', e.data): 44*4882a593Smuzhiyun # Multilib cross-candian should use the same nativesdk sysroot without MLPREFIX 45*4882a593Smuzhiyun e.data.setVar("RECIPE_SYSROOT", "${WORKDIR}/recipe-sysroot") 46*4882a593Smuzhiyun e.data.setVar("STAGING_DIR_TARGET", "${WORKDIR}/recipe-sysroot") 47*4882a593Smuzhiyun e.data.setVar("STAGING_DIR_HOST", "${WORKDIR}/recipe-sysroot") 48*4882a593Smuzhiyun e.data.setVar("RECIPE_SYSROOT_MANIFEST_SUBDIR", "nativesdk-" + variant) 49*4882a593Smuzhiyun e.data.setVar("MLPREFIX", variant + "-") 50*4882a593Smuzhiyun override = ":virtclass-multilib-" + variant 51*4882a593Smuzhiyun e.data.setVar("OVERRIDES", e.data.getVar("OVERRIDES", False) + override) 52*4882a593Smuzhiyun return 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun if bb.data.inherits_class('native', e.data): 55*4882a593Smuzhiyun raise bb.parse.SkipRecipe("We can't extend native recipes") 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun if bb.data.inherits_class('nativesdk', e.data) or bb.data.inherits_class('crosssdk', e.data): 58*4882a593Smuzhiyun raise bb.parse.SkipRecipe("We can't extend nativesdk recipes") 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun if bb.data.inherits_class('allarch', e.data) and not d.getVar('MULTILIB_VARIANTS') \ 61*4882a593Smuzhiyun and not bb.data.inherits_class('packagegroup', e.data): 62*4882a593Smuzhiyun raise bb.parse.SkipRecipe("Don't extend allarch recipes which are not packagegroups") 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun # Expand this since this won't work correctly once we set a multilib into place 65*4882a593Smuzhiyun e.data.setVar("ALL_MULTILIB_PACKAGE_ARCHS", e.data.getVar("ALL_MULTILIB_PACKAGE_ARCHS")) 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun override = ":virtclass-multilib-" + variant 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun skip_msg = e.data.getVarFlag('SKIP_RECIPE', e.data.getVar('PN')) 70*4882a593Smuzhiyun if skip_msg: 71*4882a593Smuzhiyun pn_new = variant + "-" + e.data.getVar('PN') 72*4882a593Smuzhiyun if not e.data.getVarFlag('SKIP_RECIPE', pn_new): 73*4882a593Smuzhiyun e.data.setVarFlag('SKIP_RECIPE', pn_new, skip_msg) 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun e.data.setVar("MLPREFIX", variant + "-") 76*4882a593Smuzhiyun e.data.setVar("PN", variant + "-" + e.data.getVar("PN", False)) 77*4882a593Smuzhiyun e.data.setVar("OVERRIDES", e.data.getVar("OVERRIDES", False) + override) 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun # Expand INCOMPATIBLE_LICENSE_EXCEPTIONS with multilib prefix 80*4882a593Smuzhiyun pkgs = e.data.getVar("INCOMPATIBLE_LICENSE_EXCEPTIONS") 81*4882a593Smuzhiyun if pkgs: 82*4882a593Smuzhiyun for pkg in pkgs.split(): 83*4882a593Smuzhiyun pkgs += " " + variant + "-" + pkg 84*4882a593Smuzhiyun e.data.setVar("INCOMPATIBLE_LICENSE_EXCEPTIONS", pkgs) 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun # DEFAULTTUNE can change TARGET_ARCH override so expand this now before update_data 87*4882a593Smuzhiyun newtune = e.data.getVar("DEFAULTTUNE:" + "virtclass-multilib-" + variant, False) 88*4882a593Smuzhiyun if newtune: 89*4882a593Smuzhiyun e.data.setVar("DEFAULTTUNE", newtune) 90*4882a593Smuzhiyun} 91*4882a593Smuzhiyun 92*4882a593Smuzhiyunaddhandler multilib_virtclass_handler 93*4882a593Smuzhiyunmultilib_virtclass_handler[eventmask] = "bb.event.RecipePreFinalise" 94*4882a593Smuzhiyun 95*4882a593Smuzhiyunpython __anonymous () { 96*4882a593Smuzhiyun if bb.data.inherits_class('image', d): 97*4882a593Smuzhiyun # set rpm preferred file color for 32-bit multilib image 98*4882a593Smuzhiyun if d.getVar("SITEINFO_BITS") == "32": 99*4882a593Smuzhiyun d.setVar("RPM_PREFER_ELF_ARCH", "1") 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun variant = d.getVar("BBEXTENDVARIANT") 102*4882a593Smuzhiyun import oe.classextend 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun clsextend = oe.classextend.ClassExtender(variant, d) 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun clsextend.map_depends_variable("PACKAGE_INSTALL") 107*4882a593Smuzhiyun clsextend.map_depends_variable("LINGUAS_INSTALL") 108*4882a593Smuzhiyun clsextend.map_depends_variable("RDEPENDS") 109*4882a593Smuzhiyun pinstall = d.getVar("LINGUAS_INSTALL") + " " + d.getVar("PACKAGE_INSTALL") 110*4882a593Smuzhiyun d.setVar("PACKAGE_INSTALL", pinstall) 111*4882a593Smuzhiyun d.setVar("LINGUAS_INSTALL", "") 112*4882a593Smuzhiyun # FIXME, we need to map this to something, not delete it! 113*4882a593Smuzhiyun d.setVar("PACKAGE_INSTALL_ATTEMPTONLY", "") 114*4882a593Smuzhiyun bb.build.deltask('do_populate_sdk_ext', d) 115*4882a593Smuzhiyun return 116*4882a593Smuzhiyun} 117*4882a593Smuzhiyun 118*4882a593Smuzhiyunpython multilib_virtclass_handler_postkeyexp () { 119*4882a593Smuzhiyun cls = d.getVar("BBEXTENDCURR") 120*4882a593Smuzhiyun variant = d.getVar("BBEXTENDVARIANT") 121*4882a593Smuzhiyun if cls != "multilib" or not variant: 122*4882a593Smuzhiyun return 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun variant = d.getVar("BBEXTENDVARIANT") 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun import oe.classextend 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun clsextend = oe.classextend.ClassExtender(variant, d) 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun if bb.data.inherits_class('image', d): 131*4882a593Smuzhiyun return 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun clsextend.map_depends_variable("DEPENDS") 134*4882a593Smuzhiyun clsextend.map_variable("PROVIDES") 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun if bb.data.inherits_class('cross-canadian', d): 137*4882a593Smuzhiyun return 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun clsextend.rename_packages() 140*4882a593Smuzhiyun clsextend.rename_package_variables((d.getVar("PACKAGEVARS") or "").split()) 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun clsextend.map_packagevars() 143*4882a593Smuzhiyun clsextend.map_regexp_variable("PACKAGES_DYNAMIC") 144*4882a593Smuzhiyun clsextend.map_variable("INITSCRIPT_PACKAGES") 145*4882a593Smuzhiyun clsextend.map_variable("USERADD_PACKAGES") 146*4882a593Smuzhiyun clsextend.map_variable("SYSTEMD_PACKAGES") 147*4882a593Smuzhiyun clsextend.map_variable("UPDATERCPN") 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun reset_alternative_priority(d) 150*4882a593Smuzhiyun} 151*4882a593Smuzhiyun 152*4882a593Smuzhiyunaddhandler multilib_virtclass_handler_postkeyexp 153*4882a593Smuzhiyunmultilib_virtclass_handler_postkeyexp[eventmask] = "bb.event.RecipePostKeyExpansion" 154*4882a593Smuzhiyun 155*4882a593Smuzhiyundef reset_alternative_priority(d): 156*4882a593Smuzhiyun if not bb.data.inherits_class('update-alternatives', d): 157*4882a593Smuzhiyun return 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun # There might be multiple multilibs at the same time, e.g., lib32 and 160*4882a593Smuzhiyun # lib64, each of them should have a different priority. 161*4882a593Smuzhiyun multilib_variants = d.getVar('MULTILIB_VARIANTS') 162*4882a593Smuzhiyun bbextendvariant = d.getVar('BBEXTENDVARIANT') 163*4882a593Smuzhiyun reset_gap = multilib_variants.split().index(bbextendvariant) + 1 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun # ALTERNATIVE_PRIORITY = priority 166*4882a593Smuzhiyun alt_priority_recipe = d.getVar('ALTERNATIVE_PRIORITY') 167*4882a593Smuzhiyun # Reset ALTERNATIVE_PRIORITY when found 168*4882a593Smuzhiyun if alt_priority_recipe: 169*4882a593Smuzhiyun reset_priority = int(alt_priority_recipe) - reset_gap 170*4882a593Smuzhiyun bb.debug(1, '%s: Setting ALTERNATIVE_PRIORITY to %s' % (d.getVar('PN'), reset_priority)) 171*4882a593Smuzhiyun d.setVar('ALTERNATIVE_PRIORITY', reset_priority) 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun handled_pkgs = [] 174*4882a593Smuzhiyun for pkg in (d.getVar('PACKAGES') or "").split(): 175*4882a593Smuzhiyun # ALTERNATIVE_PRIORITY_pkg = priority 176*4882a593Smuzhiyun alt_priority_pkg = d.getVar('ALTERNATIVE_PRIORITY_%s' % pkg) 177*4882a593Smuzhiyun # Reset ALTERNATIVE_PRIORITY_pkg when found 178*4882a593Smuzhiyun if alt_priority_pkg: 179*4882a593Smuzhiyun reset_priority = int(alt_priority_pkg) - reset_gap 180*4882a593Smuzhiyun if not pkg in handled_pkgs: 181*4882a593Smuzhiyun handled_pkgs.append(pkg) 182*4882a593Smuzhiyun bb.debug(1, '%s: Setting ALTERNATIVE_PRIORITY_%s to %s' % (pkg, pkg, reset_priority)) 183*4882a593Smuzhiyun d.setVar('ALTERNATIVE_PRIORITY_%s' % pkg, reset_priority) 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun for alt_name in (d.getVar('ALTERNATIVE:%s' % pkg) or "").split(): 186*4882a593Smuzhiyun # ALTERNATIVE_PRIORITY_pkg[tool] = priority 187*4882a593Smuzhiyun alt_priority_pkg_name = d.getVarFlag('ALTERNATIVE_PRIORITY_%s' % pkg, alt_name) 188*4882a593Smuzhiyun # ALTERNATIVE_PRIORITY[tool] = priority 189*4882a593Smuzhiyun alt_priority_name = d.getVarFlag('ALTERNATIVE_PRIORITY', alt_name) 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun if alt_priority_pkg_name: 192*4882a593Smuzhiyun reset_priority = int(alt_priority_pkg_name) - reset_gap 193*4882a593Smuzhiyun bb.debug(1, '%s: Setting ALTERNATIVE_PRIORITY_%s[%s] to %s' % (pkg, pkg, alt_name, reset_priority)) 194*4882a593Smuzhiyun d.setVarFlag('ALTERNATIVE_PRIORITY_%s' % pkg, alt_name, reset_priority) 195*4882a593Smuzhiyun elif alt_priority_name: 196*4882a593Smuzhiyun reset_priority = int(alt_priority_name) - reset_gap 197*4882a593Smuzhiyun bb.debug(1, '%s: Setting ALTERNATIVE_PRIORITY[%s] to %s' % (pkg, alt_name, reset_priority)) 198*4882a593Smuzhiyun d.setVarFlag('ALTERNATIVE_PRIORITY', alt_name, reset_priority) 199*4882a593Smuzhiyun 200*4882a593SmuzhiyunPACKAGEFUNCS:append = " do_package_qa_multilib" 201*4882a593Smuzhiyun 202*4882a593Smuzhiyunpython do_package_qa_multilib() { 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun def check_mlprefix(pkg, var, mlprefix): 205*4882a593Smuzhiyun values = bb.utils.explode_deps(d.getVar('%s:%s' % (var, pkg)) or d.getVar(var) or "") 206*4882a593Smuzhiyun candidates = [] 207*4882a593Smuzhiyun for i in values: 208*4882a593Smuzhiyun if i.startswith('virtual/'): 209*4882a593Smuzhiyun i = i[len('virtual/'):] 210*4882a593Smuzhiyun 211*4882a593Smuzhiyun if (not (i.startswith(mlprefix) or i.startswith("kernel-") \ 212*4882a593Smuzhiyun or ('cross-canadian' in i) or i.startswith("nativesdk-") \ 213*4882a593Smuzhiyun or i.startswith("rtld") or i.startswith("/"))): 214*4882a593Smuzhiyun candidates.append(i) 215*4882a593Smuzhiyun 216*4882a593Smuzhiyun if len(candidates) > 0: 217*4882a593Smuzhiyun msg = "%s package %s - suspicious values '%s' in %s" \ 218*4882a593Smuzhiyun % (d.getVar('PN'), pkg, ' '.join(candidates), var) 219*4882a593Smuzhiyun oe.qa.handle_error("multilib", msg, d) 220*4882a593Smuzhiyun 221*4882a593Smuzhiyun ml = d.getVar('MLPREFIX') 222*4882a593Smuzhiyun if not ml: 223*4882a593Smuzhiyun return 224*4882a593Smuzhiyun 225*4882a593Smuzhiyun # exception for ${MLPREFIX}target-sdk-provides-dummy 226*4882a593Smuzhiyun if 'target-sdk-provides-dummy' in d.getVar('PN'): 227*4882a593Smuzhiyun return 228*4882a593Smuzhiyun 229*4882a593Smuzhiyun packages = d.getVar('PACKAGES') 230*4882a593Smuzhiyun for pkg in packages.split(): 231*4882a593Smuzhiyun check_mlprefix(pkg, 'RDEPENDS', ml) 232*4882a593Smuzhiyun check_mlprefix(pkg, 'RPROVIDES', ml) 233*4882a593Smuzhiyun check_mlprefix(pkg, 'RRECOMMENDS', ml) 234*4882a593Smuzhiyun check_mlprefix(pkg, 'RSUGGESTS', ml) 235*4882a593Smuzhiyun check_mlprefix(pkg, 'RREPLACES', ml) 236*4882a593Smuzhiyun check_mlprefix(pkg, 'RCONFLICTS', ml) 237*4882a593Smuzhiyun oe.qa.exit_if_errors(d) 238*4882a593Smuzhiyun} 239