aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobert Yang <liezhi.yang@windriver.com>2017-10-31 15:27:15 +0800
committerRobert Yang <liezhi.yang@windriver.com>2018-01-08 18:08:32 +0800
commit0229db6f880d03f273d831df338a1ae0d88cb09b (patch)
treecd450e5e2d5e3c196dd99032b6b6e7f38c32af48
parentbb62e54769d47b1dae4faf23b08334509ee1842a (diff)
downloadopenembedded-core-contrib-0229db6f880d03f273d831df338a1ae0d88cb09b.tar.gz
package_manager.py: reverse archs correctly
It had reversed all the archs, which mixed multilib and common archs, e.g.: "all any noarch x86_64 core2-64 qemux86_64 x86 i586 core2-32" After reversed: "core2-32 i586 x86 qemux86_64 core2-64 x86_64 noarch any all" The core2-32 has a higher priority than core2-64 after reversed which is incorrect. Don't mix with mulitlib when reverse can fix the problem, and let multilib archs have a higher priority for multilib image. Fixed: MACHINE = "qemux86-64" require conf/multilib.conf MULTILIBS = "multilib:lib32" DEFAULTTUNE_virtclass-multilib-lib32 = "core2-32" IMAGE_INSTALL_append = " ca-certificates" $ bitbake wrlinux-image-glibc-small Check rootfs.manifest, no core_32 packages is installed, this is correct, but after we build lib32-bash, it will be incorrect: $ bitbake lib32-bash $ bitbake wrlinux-image-glibc-small Check rootfs.manifest, a few lib32 packages are installed, such as lib32-bash, this is incorrect. It was because ca-certificates is allarch, and requires /bin/sh, which is provided by both bash and lib32-bash, and lib32-bash has a higher priority than bash, so it would be installed. [YOCTO #12288] Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
-rw-r--r--meta/lib/oe/package_manager.py57
1 files changed, 52 insertions, 5 deletions
diff --git a/meta/lib/oe/package_manager.py b/meta/lib/oe/package_manager.py
index ea99165d61..3ef669895c 100644
--- a/meta/lib/oe/package_manager.py
+++ b/meta/lib/oe/package_manager.py
@@ -467,10 +467,10 @@ class RpmPM(PackageManager):
self.target_rootfs = target_rootfs
self.target_vendor = target_vendor
self.task_name = task_name
- if arch_var == None:
- self.archs = self.d.getVar('ALL_MULTILIB_PACKAGE_ARCHS').replace("-","_")
- else:
- self.archs = self.d.getVar(arch_var).replace("-","_")
+
+ self.archs = self._determine_archs(arch_var)
+ bb.note("The archs used by package manager: %s" % self.archs)
+
if task_name == "host":
self.primary_arch = self.d.getVar('SDK_ARCH')
else:
@@ -489,9 +489,56 @@ class RpmPM(PackageManager):
if not os.path.exists(self.d.expand('${T}/saved')):
bb.utils.mkdirhier(self.d.expand('${T}/saved'))
+ def _determine_archs(self, arch_var):
+ if arch_var:
+ archs = self.d.getVar(arch_var).replace("-","_").split()
+ else:
+ archs = self.d.getVar('ALL_MULTILIB_PACKAGE_ARCHS').replace("-","_").split()
+ # Reverse archs to ensure the -best- match is listed firstly, but need
+ # make sure not mixed with multilib archs, and let multilib archs have
+ # higher a priority for multilib image:
+ # For non-multilib image: (e.g., core-image-minimal)
+ # machine_arch:package_archs:multilib_archs:allarch_archs
+ # For multilib image: (e.g., lib32-core-image-minimal)
+ # machine_arch:multilib_archs:package_archs:allarch_archs
+ package_archs_var = self.d.getVar('PACKAGE_ARCHS').replace("-","_").split()
+ machine_arch_var = [self.d.getVar('MACHINE_ARCH').replace("-","_")]
+ package_archs = []
+ allarch_archs = []
+ ml_archs = []
+ machine_arch = []
+ for arch in archs:
+ if arch in machine_arch_var:
+ bb.note("Found MACHINE_ARCH: %s" % arch)
+ machine_arch.append(arch)
+ elif arch in package_archs_var:
+ bb.note("Found PACKAGE_ARCH: %s" % arch)
+ package_archs.append(arch)
+ elif arch in 'all any noarch'.split():
+ bb.note("Found allarch: %s" % arch)
+ allarch_archs.append(arch)
+ else:
+ bb.note("Found multilib arch: %s" % arch)
+ ml_archs.append(arch)
+ package_archs.reverse()
+ if machine_arch:
+ archs = machine_arch
+ mlprefix = self.d.getVar('MLPREFIX')
+ if ml_archs:
+ ml_archs.reverse()
+ if mlprefix:
+ archs += ml_archs + package_archs
+ else:
+ archs += package_archs + ml_archs
+ else:
+ archs += package_archs
+
+ archs += allarch_archs
+ return ' '.join(archs)
+
def _configure_dnf(self):
# libsolv handles 'noarch' internally, we don't need to specify it explicitly
- archs = [i for i in reversed(self.archs.split()) if i not in ["any", "all", "noarch"]]
+ archs = [i for i in self.archs.split() if i not in ["any", "all", "noarch"]]
# This prevents accidental matching against libsolv's built-in policies
if len(archs) <= 1:
archs = archs + ["bogusarch"]