multilib.bbclass: Reduce ALTERNATIVE_PRIORITY for extended recipes

Fixed:
MACHINE = "qemux86-64"
require conf/multilib.conf
MULTILIBS = "multilib:lib32"
DEFAULTTUNE_virtclass-multilib-lib32 = "x86"

$ bitbake core-image-minimal
update-alternatives: libtool has multiple providers with the same priority,
please check
/path/to/rootfs/usr/lib/opkg/alternatives/libtool for details

Both libtool and lib32-libtool have the same priority (as they're the same
recipe), so update-alternatives won't deterministically pick a provider. This
means you could end up with an image using a 32-bit pkgconfig and 64-bit
libtool, for example.

Make extended recipes reduce priority by 1 (or 2, 3 ... when there are multiple
variants in MULTILIB_VARIANTS) to fix the problem.

[YOCTO #13418]

(From OE-Core rev: 51730928df4dbecac72b56e9f843885674b4d18a)

Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Armin Kuster <akuster808@gmail.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Robert Yang
2019-06-26 20:59:34 +08:00
committed by Richard Purdie
parent 4802bed8ce
commit dabc1206b5

View File

@@ -123,8 +123,55 @@ python __anonymous () {
clsextend.map_variable("USERADD_PACKAGES")
clsextend.map_variable("SYSTEMD_PACKAGES")
clsextend.map_variable("UPDATERCPN")
reset_alternative_priority(d)
}
def reset_alternative_priority(d):
if not bb.data.inherits_class('update-alternatives', d):
return
# There might be multiple multilibs at the same time, e.g., lib32 and
# lib64, each of them should have a different priority.
multilib_variants = d.getVar('MULTILIB_VARIANTS')
bbextendvariant = d.getVar('BBEXTENDVARIANT')
reset_gap = multilib_variants.split().index(bbextendvariant) + 1
# ALTERNATIVE_PRIORITY = priority
alt_priority_recipe = d.getVar('ALTERNATIVE_PRIORITY')
# Reset ALTERNATIVE_PRIORITY when found
if alt_priority_recipe:
reset_priority = int(alt_priority_recipe) - reset_gap
bb.debug(1, '%s: Setting ALTERNATIVE_PRIORITY to %s' % (d.getVar('PN'), reset_priority))
d.setVar('ALTERNATIVE_PRIORITY', reset_priority)
handled_pkgs = []
for pkg in (d.getVar('PACKAGES') or "").split():
# ALTERNATIVE_PRIORITY_pkg = priority
alt_priority_pkg = d.getVar('ALTERNATIVE_PRIORITY_%s' % pkg)
# Reset ALTERNATIVE_PRIORITY_pkg when found
if alt_priority_pkg:
reset_priority = int(alt_priority_pkg) - reset_gap
if not pkg in handled_pkgs:
handled_pkgs.append(pkg)
bb.debug(1, '%s: Setting ALTERNATIVE_PRIORITY_%s to %s' % (pkg, pkg, reset_priority))
d.setVar('ALTERNATIVE_PRIORITY_%s' % pkg, reset_priority)
for alt_name in (d.getVar('ALTERNATIVE_%s' % pkg) or "").split():
# ALTERNATIVE_PRIORITY_pkg[tool] = priority
alt_priority_pkg_name = d.getVarFlag('ALTERNATIVE_PRIORITY_%s' % pkg, alt_name)
# ALTERNATIVE_PRIORITY[tool] = priority
alt_priority_name = d.getVarFlag('ALTERNATIVE_PRIORITY', alt_name)
if alt_priority_pkg_name:
reset_priority = int(alt_priority_pkg_name) - reset_gap
bb.debug(1, '%s: Setting ALTERNATIVE_PRIORITY_%s[%s] to %s' % (pkg, pkg, alt_name, reset_priority))
d.setVarFlag('ALTERNATIVE_PRIORITY_%s' % pkg, alt_name, reset_priority)
elif alt_priority_name:
reset_priority = int(alt_priority_name) - reset_gap
bb.debug(1, '%s: Setting ALTERNATIVE_PRIORITY[%s] to %s' % (pkg, alt_name, reset_priority))
d.setVarFlag('ALTERNATIVE_PRIORITY', alt_name, reset_priority)
PACKAGEFUNCS_append = " do_package_qa_multilib"
python do_package_qa_multilib() {