From 0229db6f880d03f273d831df338a1ae0d88cb09b Mon Sep 17 00:00:00 2001 From: Robert Yang Date: Tue, 31 Oct 2017 15:27:15 +0800 Subject: 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 --- meta/lib/oe/package_manager.py | 57 ++++++++++++++++++++++++++++++++++++++---- 1 file 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"] -- cgit 1.2.3-korg