multilib_global.bbclass 8.7 KB

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