blob: b6c09969b198b02850809e93484d222683af0efc [file] [log] [blame]
Patrick Williams92b42cb2022-09-03 06:53:57 -05001#
2# Copyright OpenEmbedded Contributors
3#
4# SPDX-License-Identifier: MIT
5#
6
Patrick Williamsc124f4f2015-09-15 14:41:29 -05007python multilib_virtclass_handler () {
Brad Bishop6e60e8b2018-02-01 10:27:11 -05008 cls = e.data.getVar("BBEXTENDCURR")
9 variant = e.data.getVar("BBEXTENDVARIANT")
Patrick Williamsc124f4f2015-09-15 14:41:29 -050010 if cls != "multilib" or not variant:
11 return
12
Brad Bishopd7bf8c12018-02-25 22:55:05 -050013 localdata = bb.data.createCopy(e.data)
14 localdata.delVar('TMPDIR')
15 e.data.setVar('STAGING_KERNEL_DIR', localdata.getVar('STAGING_KERNEL_DIR'))
Patrick Williamsc124f4f2015-09-15 14:41:29 -050016
17 # There should only be one kernel in multilib configs
18 # We also skip multilib setup for module packages.
Brad Bishop6e60e8b2018-02-01 10:27:11 -050019 provides = (e.data.getVar("PROVIDES") or "").split()
Brad Bishop1a4b7ee2018-12-16 17:11:34 -080020 non_ml_recipes = d.getVar('NON_MULTILIB_RECIPES').split()
21 bpn = e.data.getVar("BPN")
22 if "virtual/kernel" in provides or \
23 bb.data.inherits_class('module-base', e.data) or \
24 bpn in non_ml_recipes:
25 raise bb.parse.SkipRecipe("We shouldn't have multilib variants for %s" % bpn)
Patrick Williamsc124f4f2015-09-15 14:41:29 -050026
Brad Bishop6e60e8b2018-02-01 10:27:11 -050027 save_var_name=e.data.getVar("MULTILIB_SAVE_VARNAME") or ""
Patrick Williamsc124f4f2015-09-15 14:41:29 -050028 for name in save_var_name.split():
Brad Bishop6e60e8b2018-02-01 10:27:11 -050029 val=e.data.getVar(name)
Patrick Williamsc124f4f2015-09-15 14:41:29 -050030 if val:
31 e.data.setVar(name + "_MULTILIB_ORIGINAL", val)
32
Andrew Geissler220dafd2023-10-04 10:18:08 -050033 # We nearly don't need this but dependencies on NON_MULTILIB_RECIPES don't work without it
34 d.setVar("SSTATE_ARCHS_TUNEPKG", "${@all_multilib_tune_values(d, 'TUNE_PKGARCH')}")
35
Patrick Williamsc124f4f2015-09-15 14:41:29 -050036 overrides = e.data.getVar("OVERRIDES", False)
37 pn = e.data.getVar("PN", False)
38 overrides = overrides.replace("pn-${PN}", "pn-${PN}:pn-" + pn)
39 e.data.setVar("OVERRIDES", overrides)
40
41 if bb.data.inherits_class('image', e.data):
42 e.data.setVar("MLPREFIX", variant + "-")
43 e.data.setVar("PN", variant + "-" + e.data.getVar("PN", False))
Brad Bishop6e60e8b2018-02-01 10:27:11 -050044 e.data.setVar('SDKTARGETSYSROOT', e.data.getVar('SDKTARGETSYSROOT'))
Brad Bishop15ae2502019-06-18 21:44:24 -040045 override = ":virtclass-multilib-" + variant
46 e.data.setVar("OVERRIDES", e.data.getVar("OVERRIDES", False) + override)
Patrick Williams0ca19cc2021-08-16 14:03:13 -050047 target_vendor = e.data.getVar("TARGET_VENDOR:" + "virtclass-multilib-" + variant, False)
Patrick Williamsc124f4f2015-09-15 14:41:29 -050048 if target_vendor:
49 e.data.setVar("TARGET_VENDOR", target_vendor)
50 return
51
52 if bb.data.inherits_class('cross-canadian', e.data):
Brad Bishop1a4b7ee2018-12-16 17:11:34 -080053 # Multilib cross-candian should use the same nativesdk sysroot without MLPREFIX
54 e.data.setVar("RECIPE_SYSROOT", "${WORKDIR}/recipe-sysroot")
55 e.data.setVar("STAGING_DIR_TARGET", "${WORKDIR}/recipe-sysroot")
56 e.data.setVar("STAGING_DIR_HOST", "${WORKDIR}/recipe-sysroot")
Andrew Geisslerfc113ea2023-03-31 09:59:46 -050057 e.data.setVar("RECIPE_SYSROOT_MANIFEST_SUBDIR", "nativesdk-" + variant)
Patrick Williamsc124f4f2015-09-15 14:41:29 -050058 e.data.setVar("MLPREFIX", variant + "-")
59 override = ":virtclass-multilib-" + variant
60 e.data.setVar("OVERRIDES", e.data.getVar("OVERRIDES", False) + override)
Patrick Williamsc124f4f2015-09-15 14:41:29 -050061 return
62
63 if bb.data.inherits_class('native', e.data):
Brad Bishop316dfdd2018-06-25 12:45:53 -040064 raise bb.parse.SkipRecipe("We can't extend native recipes")
Patrick Williamsc124f4f2015-09-15 14:41:29 -050065
66 if bb.data.inherits_class('nativesdk', e.data) or bb.data.inherits_class('crosssdk', e.data):
Brad Bishop316dfdd2018-06-25 12:45:53 -040067 raise bb.parse.SkipRecipe("We can't extend nativesdk recipes")
Patrick Williamsc124f4f2015-09-15 14:41:29 -050068
Brad Bishop1a4b7ee2018-12-16 17:11:34 -080069 if bb.data.inherits_class('allarch', e.data) and not d.getVar('MULTILIB_VARIANTS') \
70 and not bb.data.inherits_class('packagegroup', e.data):
Brad Bishop316dfdd2018-06-25 12:45:53 -040071 raise bb.parse.SkipRecipe("Don't extend allarch recipes which are not packagegroups")
Patrick Williamsc124f4f2015-09-15 14:41:29 -050072
Patrick Williamsc124f4f2015-09-15 14:41:29 -050073 # Expand this since this won't work correctly once we set a multilib into place
Brad Bishop6e60e8b2018-02-01 10:27:11 -050074 e.data.setVar("ALL_MULTILIB_PACKAGE_ARCHS", e.data.getVar("ALL_MULTILIB_PACKAGE_ARCHS"))
Patrick Williamsc124f4f2015-09-15 14:41:29 -050075
76 override = ":virtclass-multilib-" + variant
77
Andrew Geissler7e0e3c02022-02-25 20:34:39 +000078 skip_msg = e.data.getVarFlag('SKIP_RECIPE', e.data.getVar('PN'))
79 if skip_msg:
Brad Bishop6e60e8b2018-02-01 10:27:11 -050080 pn_new = variant + "-" + e.data.getVar('PN')
Andrew Geissler7e0e3c02022-02-25 20:34:39 +000081 if not e.data.getVarFlag('SKIP_RECIPE', pn_new):
82 e.data.setVarFlag('SKIP_RECIPE', pn_new, skip_msg)
Brad Bishop6e60e8b2018-02-01 10:27:11 -050083
Patrick Williamsc124f4f2015-09-15 14:41:29 -050084 e.data.setVar("MLPREFIX", variant + "-")
85 e.data.setVar("PN", variant + "-" + e.data.getVar("PN", False))
86 e.data.setVar("OVERRIDES", e.data.getVar("OVERRIDES", False) + override)
87
Andrew Geissler9aee5002022-03-30 16:27:02 +000088 # Expand INCOMPATIBLE_LICENSE_EXCEPTIONS with multilib prefix
89 pkgs = e.data.getVar("INCOMPATIBLE_LICENSE_EXCEPTIONS")
90 if pkgs:
91 for pkg in pkgs.split():
92 pkgs += " " + variant + "-" + pkg
93 e.data.setVar("INCOMPATIBLE_LICENSE_EXCEPTIONS", pkgs)
Patrick Williamsc124f4f2015-09-15 14:41:29 -050094
95 # DEFAULTTUNE can change TARGET_ARCH override so expand this now before update_data
Patrick Williams0ca19cc2021-08-16 14:03:13 -050096 newtune = e.data.getVar("DEFAULTTUNE:" + "virtclass-multilib-" + variant, False)
Patrick Williamsc124f4f2015-09-15 14:41:29 -050097 if newtune:
98 e.data.setVar("DEFAULTTUNE", newtune)
Patrick Williamsc124f4f2015-09-15 14:41:29 -050099}
100
101addhandler multilib_virtclass_handler
102multilib_virtclass_handler[eventmask] = "bb.event.RecipePreFinalise"
103
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500104python __anonymous () {
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500105 if bb.data.inherits_class('image', d):
Andrew Geissler595f6302022-01-24 19:11:47 +0000106 # set rpm preferred file color for 32-bit multilib image
107 if d.getVar("SITEINFO_BITS") == "32":
108 d.setVar("RPM_PREFER_ELF_ARCH", "1")
109
Andrew Geissler1e34c2d2020-05-29 16:02:59 -0500110 variant = d.getVar("BBEXTENDVARIANT")
111 import oe.classextend
112
113 clsextend = oe.classextend.ClassExtender(variant, d)
114
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500115 clsextend.map_depends_variable("PACKAGE_INSTALL")
116 clsextend.map_depends_variable("LINGUAS_INSTALL")
117 clsextend.map_depends_variable("RDEPENDS")
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500118 pinstall = d.getVar("LINGUAS_INSTALL") + " " + d.getVar("PACKAGE_INSTALL")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500119 d.setVar("PACKAGE_INSTALL", pinstall)
120 d.setVar("LINGUAS_INSTALL", "")
121 # FIXME, we need to map this to something, not delete it!
122 d.setVar("PACKAGE_INSTALL_ATTEMPTONLY", "")
Brad Bishop316dfdd2018-06-25 12:45:53 -0400123 bb.build.deltask('do_populate_sdk_ext', d)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500124 return
Andrew Geissler1e34c2d2020-05-29 16:02:59 -0500125}
126
127python multilib_virtclass_handler_postkeyexp () {
128 cls = d.getVar("BBEXTENDCURR")
129 variant = d.getVar("BBEXTENDVARIANT")
130 if cls != "multilib" or not variant:
131 return
132
133 variant = d.getVar("BBEXTENDVARIANT")
134
135 import oe.classextend
136
137 clsextend = oe.classextend.ClassExtender(variant, d)
138
139 if bb.data.inherits_class('image', d):
140 return
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500141
142 clsextend.map_depends_variable("DEPENDS")
Patrick Williams73bd93f2024-02-20 08:07:48 -0600143 clsextend.map_depends_variable("PACKAGE_WRITE_DEPS")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500144 clsextend.map_variable("PROVIDES")
145
146 if bb.data.inherits_class('cross-canadian', d):
147 return
148
149 clsextend.rename_packages()
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500150 clsextend.rename_package_variables((d.getVar("PACKAGEVARS") or "").split())
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500151
152 clsextend.map_packagevars()
153 clsextend.map_regexp_variable("PACKAGES_DYNAMIC")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500154 clsextend.map_variable("INITSCRIPT_PACKAGES")
155 clsextend.map_variable("USERADD_PACKAGES")
156 clsextend.map_variable("SYSTEMD_PACKAGES")
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800157 clsextend.map_variable("UPDATERCPN")
Brad Bishop96ff1982019-08-19 13:50:42 -0400158
159 reset_alternative_priority(d)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500160}
161
Andrew Geissler1e34c2d2020-05-29 16:02:59 -0500162addhandler multilib_virtclass_handler_postkeyexp
163multilib_virtclass_handler_postkeyexp[eventmask] = "bb.event.RecipePostKeyExpansion"
164
Brad Bishop96ff1982019-08-19 13:50:42 -0400165def reset_alternative_priority(d):
166 if not bb.data.inherits_class('update-alternatives', d):
167 return
168
169 # There might be multiple multilibs at the same time, e.g., lib32 and
170 # lib64, each of them should have a different priority.
171 multilib_variants = d.getVar('MULTILIB_VARIANTS')
172 bbextendvariant = d.getVar('BBEXTENDVARIANT')
173 reset_gap = multilib_variants.split().index(bbextendvariant) + 1
174
175 # ALTERNATIVE_PRIORITY = priority
176 alt_priority_recipe = d.getVar('ALTERNATIVE_PRIORITY')
177 # Reset ALTERNATIVE_PRIORITY when found
178 if alt_priority_recipe:
179 reset_priority = int(alt_priority_recipe) - reset_gap
180 bb.debug(1, '%s: Setting ALTERNATIVE_PRIORITY to %s' % (d.getVar('PN'), reset_priority))
181 d.setVar('ALTERNATIVE_PRIORITY', reset_priority)
182
183 handled_pkgs = []
184 for pkg in (d.getVar('PACKAGES') or "").split():
185 # ALTERNATIVE_PRIORITY_pkg = priority
186 alt_priority_pkg = d.getVar('ALTERNATIVE_PRIORITY_%s' % pkg)
187 # Reset ALTERNATIVE_PRIORITY_pkg when found
188 if alt_priority_pkg:
189 reset_priority = int(alt_priority_pkg) - reset_gap
190 if not pkg in handled_pkgs:
191 handled_pkgs.append(pkg)
192 bb.debug(1, '%s: Setting ALTERNATIVE_PRIORITY_%s to %s' % (pkg, pkg, reset_priority))
193 d.setVar('ALTERNATIVE_PRIORITY_%s' % pkg, reset_priority)
194
Patrick Williams213cb262021-08-07 19:21:33 -0500195 for alt_name in (d.getVar('ALTERNATIVE:%s' % pkg) or "").split():
Brad Bishop96ff1982019-08-19 13:50:42 -0400196 # ALTERNATIVE_PRIORITY_pkg[tool] = priority
197 alt_priority_pkg_name = d.getVarFlag('ALTERNATIVE_PRIORITY_%s' % pkg, alt_name)
198 # ALTERNATIVE_PRIORITY[tool] = priority
199 alt_priority_name = d.getVarFlag('ALTERNATIVE_PRIORITY', alt_name)
200
201 if alt_priority_pkg_name:
202 reset_priority = int(alt_priority_pkg_name) - reset_gap
203 bb.debug(1, '%s: Setting ALTERNATIVE_PRIORITY_%s[%s] to %s' % (pkg, pkg, alt_name, reset_priority))
204 d.setVarFlag('ALTERNATIVE_PRIORITY_%s' % pkg, alt_name, reset_priority)
205 elif alt_priority_name:
206 reset_priority = int(alt_priority_name) - reset_gap
207 bb.debug(1, '%s: Setting ALTERNATIVE_PRIORITY[%s] to %s' % (pkg, alt_name, reset_priority))
208 d.setVarFlag('ALTERNATIVE_PRIORITY', alt_name, reset_priority)
209
Patrick Williams213cb262021-08-07 19:21:33 -0500210PACKAGEFUNCS:append = " do_package_qa_multilib"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500211
212python do_package_qa_multilib() {
213
214 def check_mlprefix(pkg, var, mlprefix):
Andrew Geissler5199d832021-09-24 16:47:35 -0500215 values = bb.utils.explode_deps(d.getVar('%s:%s' % (var, pkg)) or d.getVar(var) or "")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500216 candidates = []
217 for i in values:
218 if i.startswith('virtual/'):
219 i = i[len('virtual/'):]
Andrew Geissler82c905d2020-04-13 13:39:40 -0500220
221 if (not (i.startswith(mlprefix) or i.startswith("kernel-") \
222 or ('cross-canadian' in i) or i.startswith("nativesdk-") \
223 or i.startswith("rtld") or i.startswith("/"))):
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500224 candidates.append(i)
Andrew Geissler82c905d2020-04-13 13:39:40 -0500225
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500226 if len(candidates) > 0:
227 msg = "%s package %s - suspicious values '%s' in %s" \
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500228 % (d.getVar('PN'), pkg, ' '.join(candidates), var)
Andrew Geisslereff27472021-10-29 15:35:00 -0500229 oe.qa.handle_error("multilib", msg, d)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500230
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500231 ml = d.getVar('MLPREFIX')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500232 if not ml:
233 return
234
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800235 # exception for ${MLPREFIX}target-sdk-provides-dummy
236 if 'target-sdk-provides-dummy' in d.getVar('PN'):
237 return
238
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500239 packages = d.getVar('PACKAGES')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500240 for pkg in packages.split():
241 check_mlprefix(pkg, 'RDEPENDS', ml)
242 check_mlprefix(pkg, 'RPROVIDES', ml)
243 check_mlprefix(pkg, 'RRECOMMENDS', ml)
244 check_mlprefix(pkg, 'RSUGGESTS', ml)
245 check_mlprefix(pkg, 'RREPLACES', ml)
246 check_mlprefix(pkg, 'RCONFLICTS', ml)
Andrew Geisslereff27472021-10-29 15:35:00 -0500247 oe.qa.exit_if_errors(d)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500248}