summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYann Dirson <yann@blade-group.com>2020-04-07 22:02:35 +0200
committerRichard Purdie <richard.purdie@linuxfoundation.org>2020-04-26 14:00:50 +0100
commitd645fe38d38a9fe499c2c79b1b2dced3bed01a89 (patch)
treec9ebe2f3bafdf523ccede93a860e36bd563306cc
parent5e3c05701e52b1cc9b32204e76c7afb08ce661a9 (diff)
downloadpoky-d645fe38d38a9fe499c2c79b1b2dced3bed01a89.tar.gz
package: get_package_mapping: avoid dependency mapping if renamed package provides original name
Packages with a runtime dependency on a target package whose name is changed by the PKG_* mechanism must rebuild when that mapping changes, but we have no way of tracking this today, so eg. packagegroup-machine-base ends up with a relationship on a versioned kernel-image, and does not get rebuilt when that version changes, leading to unsatisfiable dependency and reproducibility issue. OTOH there is no reason for the dependency to get rewritten if the renamed package already has a RPROVIDES on the non-rewritten package name, and if the dependency relationship is an unversionned one. This is what this patch prevents. Note that this may not cover all cases of rewritten package names. Notably I had to let the rewrite be done in the case of versionned dependencies, as package managers usually can follow "Provides" in such case; this includes many dependencies against shared-lib packages renamed to their soname, and those at least are OK, since the dependent recipe should explicitly depend on the target recipe. (From OE-Core rev: 920beaaeef62b558e046f32c8ef0332250969ef1) Signed-off-by: Yann Dirson <yann@blade-group.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--meta/classes/package.bbclass16
1 files changed, 13 insertions, 3 deletions
diff --git a/meta/classes/package.bbclass b/meta/classes/package.bbclass
index 648297ad25..0b5cf47749 100644
--- a/meta/classes/package.bbclass
+++ b/meta/classes/package.bbclass
@@ -614,7 +614,7 @@ def copydebugsources(debugsrcdir, sources, d):
614# Package data handling routines 614# Package data handling routines
615# 615#
616 616
617def get_package_mapping (pkg, basepkg, d): 617def get_package_mapping (pkg, basepkg, d, depversions=None):
618 import oe.packagedata 618 import oe.packagedata
619 619
620 data = oe.packagedata.read_subpkgdata(pkg, d) 620 data = oe.packagedata.read_subpkgdata(pkg, d)
@@ -625,6 +625,14 @@ def get_package_mapping (pkg, basepkg, d):
625 if bb.data.inherits_class('allarch', d) and not d.getVar('MULTILIB_VARIANTS') \ 625 if bb.data.inherits_class('allarch', d) and not d.getVar('MULTILIB_VARIANTS') \
626 and data[key] == basepkg: 626 and data[key] == basepkg:
627 return pkg 627 return pkg
628 if depversions == []:
629 # Avoid returning a mapping if the renamed package rprovides its original name
630 rprovkey = "RPROVIDES_%s" % pkg
631 if rprovkey in data:
632 if pkg in bb.utils.explode_dep_versions2(data[rprovkey]):
633 bb.note("%s rprovides %s, not replacing the latter" % (data[key], pkg))
634 return pkg
635 # Do map to rewritten package name
628 return data[key] 636 return data[key]
629 637
630 return pkg 638 return pkg
@@ -645,8 +653,10 @@ def runtime_mapping_rename (varname, pkg, d):
645 653
646 new_depends = {} 654 new_depends = {}
647 deps = bb.utils.explode_dep_versions2(d.getVar(varname) or "") 655 deps = bb.utils.explode_dep_versions2(d.getVar(varname) or "")
648 for depend in deps: 656 for depend, depversions in deps.items():
649 new_depend = get_package_mapping(depend, pkg, d) 657 new_depend = get_package_mapping(depend, pkg, d, depversions)
658 if depend != new_depend:
659 bb.note("package name mapping done: %s -> %s" % (depend, new_depend))
650 new_depends[new_depend] = deps[depend] 660 new_depends[new_depend] = deps[depend]
651 661
652 d.setVar(varname, bb.utils.join_deps(new_depends, commasep=False)) 662 d.setVar(varname, bb.utils.join_deps(new_depends, commasep=False))