aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--meta/recipes-devtools/python/python-smartpm/smart-prefer-same-arch.patch119
-rw-r--r--meta/recipes-devtools/python/python-smartpm_git.bb2
2 files changed, 121 insertions, 0 deletions
diff --git a/meta/recipes-devtools/python/python-smartpm/smart-prefer-same-arch.patch b/meta/recipes-devtools/python/python-smartpm/smart-prefer-same-arch.patch
new file mode 100644
index 0000000000..b1305b512d
--- /dev/null
+++ b/meta/recipes-devtools/python/python-smartpm/smart-prefer-same-arch.patch
@@ -0,0 +1,119 @@
+From 1749592a76425449c1f3119fb14db3f5e14226ed Mon Sep 17 00:00:00 2001
+From: Robert Yang <liezhi.yang@windriver.com>
+Date: Tue, 27 Oct 2015 06:20:45 -0700
+Subject: [PATCH] smart/transaction.py: prefer same arch when install
+
+We had made smart install multilib RDEPENDS correctly from
+package_manager.py, but it couldn't handle RRECOMMANDS, this patch fix
+the issue from python-smartpm-native, and make it work well.
+
+The logic is: when pkg_A rdepends/rrecommands pkg_B, then let pkg_B use
+pkg_A's arch when possible.
+
+This patch fixed:
+require conf/multilib.conf
+MULTILIBS = "multilib:lib32"
+DEFAULTTUNE_virtclass-multilib-lib32 = "x86"
+RPM_PREFER_ELF_ARCH = "1"
+IMAGE_INSTALL_append = " lib32-connman-gnome"
+MACHINE = "qemux86-64"
+
+$ bitbake core-image-sato
+
+Only 64bit loaders like libgdk-pixbuf-2.0-loader-jpeg and
+libgdk-pixbuf-2.0-loader-png were installed before this patch since they
+are in RRECOMMANDS, now both 32bit and 64bit are installed.
+
+This patch is for native only to minimize the impact for this release,
+the main problem is the "if attempt:", otherwise, more packages like
+lib32-libc6-dev will be installed when populate_sdk, but only libc6-dev
+were installed before. We need reconstruct the way that we install the
+complentary packages in future release, the "if attempt:" make they work
+together atm.
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
+---
+ smart/transaction.py | 28 +++++++++++++++++++++++++---
+ 1 file changed, 25 insertions(+), 3 deletions(-)
+
+diff --git a/smart/transaction.py b/smart/transaction.py
+index f022aae..63a837c 100644
+--- a/smart/transaction.py
++++ b/smart/transaction.py
+@@ -22,6 +22,7 @@
+ from smart.const import INSTALL, REMOVE, UPGRADE, FIX, REINSTALL, KEEP, LOCKED_EXCLUDE, LOCKED_INSTALL, LOCKED_CONFLICT, LOCKED_CONFLICT_BY, LOCKED_NO_COEXIST, LOCKED_SYSCONF, LOCKED_REMOVE
+ from smart.cache import PreRequires, Package
+ from smart import *
++from smart.backends.rpm.rpmver import splitarch
+
+ def lock_reason(pkg, lockvalue):
+ try:
+@@ -618,6 +619,7 @@ class Transaction(object):
+ self._remove(namepkg, changeset, locked, pending, depth)
+
+ # Install packages required by this one.
++ pkgarch = splitarch(pkg.version)[1]
+ for req in pkg.requires + pkg.recommends:
+
+ reqrequired = req in pkg.requires
+@@ -626,6 +628,8 @@ class Transaction(object):
+ prvpkgs = {}
+ lockedpkgs = {}
+ found = False
++ found_same_arch = False
++ same_arch_in_provides = False
+ for prv in req.providedby:
+ for prvpkg in prv.packages:
+ if not reqrequired:
+@@ -633,9 +637,19 @@ class Transaction(object):
+ continue
+ elif pkgconf.testFlag("ignore-recommends", prvpkg):
+ continue
++ prvpkgarch = splitarch(prvpkg.version)[1]
++ if pkgarch == prvpkgarch:
++ # Found a same arch in provides
++ same_arch_in_provides = True
+ if isinst(prvpkg):
+ found = True
+- break
++ if attempt:
++ break
++ if pkgarch == prvpkgarch:
++ # Found the best match
++ found_same_arch = True
++ break
++ continue
+ if prvpkg not in locked:
+ prvpkgs[prvpkg] = True
+ else:
+@@ -643,7 +657,7 @@ class Transaction(object):
+ else:
+ continue
+ break
+- if found:
++ if found_same_arch or (found and attempt) or (found and not same_arch_in_provides):
+ # Someone is already providing it. Good.
+ continue
+
+@@ -672,7 +686,15 @@ class Transaction(object):
+
+ # It's only a recommend, skip
+ continue
+-
++ if len(prvpkgs) > 1 and not attempt:
++ prvarchs = set()
++ for prv in prvpkgs:
++ prvarchs.add(splitarch(prv.version)[1])
++ if pkgarch in prvarchs:
++ # Prefer the one which has the same arch
++ for prv in prvpkgs.copy():
++ if splitarch(prv.version)[1] != pkgarch:
++ del prvpkgs[prv]
+ if len(prvpkgs) == 1:
+ # Don't check locked here. prvpkgs was
+ # already filtered above.
+--
+1.7.9.5
+
diff --git a/meta/recipes-devtools/python/python-smartpm_git.bb b/meta/recipes-devtools/python/python-smartpm_git.bb
index d6c378bcfd..1ebf590712 100644
--- a/meta/recipes-devtools/python/python-smartpm_git.bb
+++ b/meta/recipes-devtools/python/python-smartpm_git.bb
@@ -26,6 +26,8 @@ SRC_URI = "\
file://smart-cache.py-getPackages-matches-name-version.patch \
"
+SRC_URI_append_class-native = "file://smart-prefer-same-arch.patch"
+
SRCREV = "407a7eca766431257dcd1da15175cc36a1bb22d0"
PV = "1.5+git${SRCPV}"