blob: 8a1a51aabad67f52c529b3f7c5e904b746d77b6f [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
33 overrides = e.data.getVar("OVERRIDES", False)
34 pn = e.data.getVar("PN", False)
35 overrides = overrides.replace("pn-${PN}", "pn-${PN}:pn-" + pn)
36 e.data.setVar("OVERRIDES", overrides)
37
38 if bb.data.inherits_class('image', e.data):
39 e.data.setVar("MLPREFIX", variant + "-")
40 e.data.setVar("PN", variant + "-" + e.data.getVar("PN", False))
Brad Bishop6e60e8b2018-02-01 10:27:11 -050041 e.data.setVar('SDKTARGETSYSROOT', e.data.getVar('SDKTARGETSYSROOT'))
Brad Bishop15ae2502019-06-18 21:44:24 -040042 override = ":virtclass-multilib-" + variant
43 e.data.setVar("OVERRIDES", e.data.getVar("OVERRIDES", False) + override)
Patrick Williams0ca19cc2021-08-16 14:03:13 -050044 target_vendor = e.data.getVar("TARGET_VENDOR:" + "virtclass-multilib-" + variant, False)
Patrick Williamsc124f4f2015-09-15 14:41:29 -050045 if target_vendor:
46 e.data.setVar("TARGET_VENDOR", target_vendor)
47 return
48
49 if bb.data.inherits_class('cross-canadian', e.data):
Brad Bishop1a4b7ee2018-12-16 17:11:34 -080050 # Multilib cross-candian should use the same nativesdk sysroot without MLPREFIX
51 e.data.setVar("RECIPE_SYSROOT", "${WORKDIR}/recipe-sysroot")
52 e.data.setVar("STAGING_DIR_TARGET", "${WORKDIR}/recipe-sysroot")
53 e.data.setVar("STAGING_DIR_HOST", "${WORKDIR}/recipe-sysroot")
Andrew Geisslerfc113ea2023-03-31 09:59:46 -050054 e.data.setVar("RECIPE_SYSROOT_MANIFEST_SUBDIR", "nativesdk-" + variant)
Patrick Williamsc124f4f2015-09-15 14:41:29 -050055 e.data.setVar("MLPREFIX", variant + "-")
56 override = ":virtclass-multilib-" + variant
57 e.data.setVar("OVERRIDES", e.data.getVar("OVERRIDES", False) + override)
Patrick Williamsc124f4f2015-09-15 14:41:29 -050058 return
59
60 if bb.data.inherits_class('native', e.data):
Brad Bishop316dfdd2018-06-25 12:45:53 -040061 raise bb.parse.SkipRecipe("We can't extend native recipes")
Patrick Williamsc124f4f2015-09-15 14:41:29 -050062
63 if bb.data.inherits_class('nativesdk', e.data) or bb.data.inherits_class('crosssdk', e.data):
Brad Bishop316dfdd2018-06-25 12:45:53 -040064 raise bb.parse.SkipRecipe("We can't extend nativesdk recipes")
Patrick Williamsc124f4f2015-09-15 14:41:29 -050065
Brad Bishop1a4b7ee2018-12-16 17:11:34 -080066 if bb.data.inherits_class('allarch', e.data) and not d.getVar('MULTILIB_VARIANTS') \
67 and not bb.data.inherits_class('packagegroup', e.data):
Brad Bishop316dfdd2018-06-25 12:45:53 -040068 raise bb.parse.SkipRecipe("Don't extend allarch recipes which are not packagegroups")
Patrick Williamsc124f4f2015-09-15 14:41:29 -050069
Patrick Williamsc124f4f2015-09-15 14:41:29 -050070 # Expand this since this won't work correctly once we set a multilib into place
Brad Bishop6e60e8b2018-02-01 10:27:11 -050071 e.data.setVar("ALL_MULTILIB_PACKAGE_ARCHS", e.data.getVar("ALL_MULTILIB_PACKAGE_ARCHS"))
Patrick Williamsc124f4f2015-09-15 14:41:29 -050072
73 override = ":virtclass-multilib-" + variant
74
Andrew Geissler7e0e3c02022-02-25 20:34:39 +000075 skip_msg = e.data.getVarFlag('SKIP_RECIPE', e.data.getVar('PN'))
76 if skip_msg:
Brad Bishop6e60e8b2018-02-01 10:27:11 -050077 pn_new = variant + "-" + e.data.getVar('PN')
Andrew Geissler7e0e3c02022-02-25 20:34:39 +000078 if not e.data.getVarFlag('SKIP_RECIPE', pn_new):
79 e.data.setVarFlag('SKIP_RECIPE', pn_new, skip_msg)
Brad Bishop6e60e8b2018-02-01 10:27:11 -050080
Patrick Williamsc124f4f2015-09-15 14:41:29 -050081 e.data.setVar("MLPREFIX", variant + "-")
82 e.data.setVar("PN", variant + "-" + e.data.getVar("PN", False))
83 e.data.setVar("OVERRIDES", e.data.getVar("OVERRIDES", False) + override)
84
Andrew Geissler9aee5002022-03-30 16:27:02 +000085 # Expand INCOMPATIBLE_LICENSE_EXCEPTIONS with multilib prefix
86 pkgs = e.data.getVar("INCOMPATIBLE_LICENSE_EXCEPTIONS")
87 if pkgs:
88 for pkg in pkgs.split():
89 pkgs += " " + variant + "-" + pkg
90 e.data.setVar("INCOMPATIBLE_LICENSE_EXCEPTIONS", pkgs)
Patrick Williamsc124f4f2015-09-15 14:41:29 -050091
92 # DEFAULTTUNE can change TARGET_ARCH override so expand this now before update_data
Patrick Williams0ca19cc2021-08-16 14:03:13 -050093 newtune = e.data.getVar("DEFAULTTUNE:" + "virtclass-multilib-" + variant, False)
Patrick Williamsc124f4f2015-09-15 14:41:29 -050094 if newtune:
95 e.data.setVar("DEFAULTTUNE", newtune)
Patrick Williamsc124f4f2015-09-15 14:41:29 -050096}
97
98addhandler multilib_virtclass_handler
99multilib_virtclass_handler[eventmask] = "bb.event.RecipePreFinalise"
100
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500101python __anonymous () {
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500102 if bb.data.inherits_class('image', d):
Andrew Geissler595f6302022-01-24 19:11:47 +0000103 # set rpm preferred file color for 32-bit multilib image
104 if d.getVar("SITEINFO_BITS") == "32":
105 d.setVar("RPM_PREFER_ELF_ARCH", "1")
106
Andrew Geissler1e34c2d2020-05-29 16:02:59 -0500107 variant = d.getVar("BBEXTENDVARIANT")
108 import oe.classextend
109
110 clsextend = oe.classextend.ClassExtender(variant, d)
111
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500112 clsextend.map_depends_variable("PACKAGE_INSTALL")
113 clsextend.map_depends_variable("LINGUAS_INSTALL")
114 clsextend.map_depends_variable("RDEPENDS")
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500115 pinstall = d.getVar("LINGUAS_INSTALL") + " " + d.getVar("PACKAGE_INSTALL")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500116 d.setVar("PACKAGE_INSTALL", pinstall)
117 d.setVar("LINGUAS_INSTALL", "")
118 # FIXME, we need to map this to something, not delete it!
119 d.setVar("PACKAGE_INSTALL_ATTEMPTONLY", "")
Brad Bishop316dfdd2018-06-25 12:45:53 -0400120 bb.build.deltask('do_populate_sdk_ext', d)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500121 return
Andrew Geissler1e34c2d2020-05-29 16:02:59 -0500122}
123
124python multilib_virtclass_handler_postkeyexp () {
125 cls = d.getVar("BBEXTENDCURR")
126 variant = d.getVar("BBEXTENDVARIANT")
127 if cls != "multilib" or not variant:
128 return
129
130 variant = d.getVar("BBEXTENDVARIANT")
131
132 import oe.classextend
133
134 clsextend = oe.classextend.ClassExtender(variant, d)
135
136 if bb.data.inherits_class('image', d):
137 return
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500138
139 clsextend.map_depends_variable("DEPENDS")
140 clsextend.map_variable("PROVIDES")
141
142 if bb.data.inherits_class('cross-canadian', d):
143 return
144
145 clsextend.rename_packages()
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500146 clsextend.rename_package_variables((d.getVar("PACKAGEVARS") or "").split())
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500147
148 clsextend.map_packagevars()
149 clsextend.map_regexp_variable("PACKAGES_DYNAMIC")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500150 clsextend.map_variable("INITSCRIPT_PACKAGES")
151 clsextend.map_variable("USERADD_PACKAGES")
152 clsextend.map_variable("SYSTEMD_PACKAGES")
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800153 clsextend.map_variable("UPDATERCPN")
Brad Bishop96ff1982019-08-19 13:50:42 -0400154
155 reset_alternative_priority(d)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500156}
157
Andrew Geissler1e34c2d2020-05-29 16:02:59 -0500158addhandler multilib_virtclass_handler_postkeyexp
159multilib_virtclass_handler_postkeyexp[eventmask] = "bb.event.RecipePostKeyExpansion"
160
Brad Bishop96ff1982019-08-19 13:50:42 -0400161def reset_alternative_priority(d):
162 if not bb.data.inherits_class('update-alternatives', d):
163 return
164
165 # There might be multiple multilibs at the same time, e.g., lib32 and
166 # lib64, each of them should have a different priority.
167 multilib_variants = d.getVar('MULTILIB_VARIANTS')
168 bbextendvariant = d.getVar('BBEXTENDVARIANT')
169 reset_gap = multilib_variants.split().index(bbextendvariant) + 1
170
171 # ALTERNATIVE_PRIORITY = priority
172 alt_priority_recipe = d.getVar('ALTERNATIVE_PRIORITY')
173 # Reset ALTERNATIVE_PRIORITY when found
174 if alt_priority_recipe:
175 reset_priority = int(alt_priority_recipe) - reset_gap
176 bb.debug(1, '%s: Setting ALTERNATIVE_PRIORITY to %s' % (d.getVar('PN'), reset_priority))
177 d.setVar('ALTERNATIVE_PRIORITY', reset_priority)
178
179 handled_pkgs = []
180 for pkg in (d.getVar('PACKAGES') or "").split():
181 # ALTERNATIVE_PRIORITY_pkg = priority
182 alt_priority_pkg = d.getVar('ALTERNATIVE_PRIORITY_%s' % pkg)
183 # Reset ALTERNATIVE_PRIORITY_pkg when found
184 if alt_priority_pkg:
185 reset_priority = int(alt_priority_pkg) - reset_gap
186 if not pkg in handled_pkgs:
187 handled_pkgs.append(pkg)
188 bb.debug(1, '%s: Setting ALTERNATIVE_PRIORITY_%s to %s' % (pkg, pkg, reset_priority))
189 d.setVar('ALTERNATIVE_PRIORITY_%s' % pkg, reset_priority)
190
Patrick Williams213cb262021-08-07 19:21:33 -0500191 for alt_name in (d.getVar('ALTERNATIVE:%s' % pkg) or "").split():
Brad Bishop96ff1982019-08-19 13:50:42 -0400192 # ALTERNATIVE_PRIORITY_pkg[tool] = priority
193 alt_priority_pkg_name = d.getVarFlag('ALTERNATIVE_PRIORITY_%s' % pkg, alt_name)
194 # ALTERNATIVE_PRIORITY[tool] = priority
195 alt_priority_name = d.getVarFlag('ALTERNATIVE_PRIORITY', alt_name)
196
197 if alt_priority_pkg_name:
198 reset_priority = int(alt_priority_pkg_name) - reset_gap
199 bb.debug(1, '%s: Setting ALTERNATIVE_PRIORITY_%s[%s] to %s' % (pkg, pkg, alt_name, reset_priority))
200 d.setVarFlag('ALTERNATIVE_PRIORITY_%s' % pkg, alt_name, reset_priority)
201 elif alt_priority_name:
202 reset_priority = int(alt_priority_name) - reset_gap
203 bb.debug(1, '%s: Setting ALTERNATIVE_PRIORITY[%s] to %s' % (pkg, alt_name, reset_priority))
204 d.setVarFlag('ALTERNATIVE_PRIORITY', alt_name, reset_priority)
205
Patrick Williams213cb262021-08-07 19:21:33 -0500206PACKAGEFUNCS:append = " do_package_qa_multilib"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500207
208python do_package_qa_multilib() {
209
210 def check_mlprefix(pkg, var, mlprefix):
Andrew Geissler5199d832021-09-24 16:47:35 -0500211 values = bb.utils.explode_deps(d.getVar('%s:%s' % (var, pkg)) or d.getVar(var) or "")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500212 candidates = []
213 for i in values:
214 if i.startswith('virtual/'):
215 i = i[len('virtual/'):]
Andrew Geissler82c905d2020-04-13 13:39:40 -0500216
217 if (not (i.startswith(mlprefix) or i.startswith("kernel-") \
218 or ('cross-canadian' in i) or i.startswith("nativesdk-") \
219 or i.startswith("rtld") or i.startswith("/"))):
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500220 candidates.append(i)
Andrew Geissler82c905d2020-04-13 13:39:40 -0500221
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500222 if len(candidates) > 0:
223 msg = "%s package %s - suspicious values '%s' in %s" \
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500224 % (d.getVar('PN'), pkg, ' '.join(candidates), var)
Andrew Geisslereff27472021-10-29 15:35:00 -0500225 oe.qa.handle_error("multilib", msg, d)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500226
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500227 ml = d.getVar('MLPREFIX')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500228 if not ml:
229 return
230
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800231 # exception for ${MLPREFIX}target-sdk-provides-dummy
232 if 'target-sdk-provides-dummy' in d.getVar('PN'):
233 return
234
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500235 packages = d.getVar('PACKAGES')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500236 for pkg in packages.split():
237 check_mlprefix(pkg, 'RDEPENDS', ml)
238 check_mlprefix(pkg, 'RPROVIDES', ml)
239 check_mlprefix(pkg, 'RRECOMMENDS', ml)
240 check_mlprefix(pkg, 'RSUGGESTS', ml)
241 check_mlprefix(pkg, 'RREPLACES', ml)
242 check_mlprefix(pkg, 'RCONFLICTS', ml)
Andrew Geisslereff27472021-10-29 15:35:00 -0500243 oe.qa.exit_if_errors(d)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500244}