[OE-core] [PATCH] sdk.py: fix conflicts of packages
Jian Liu
jian.liu at windriver.com
Wed Nov 11 08:07:07 UTC 2015
If packages are conveyed to smart to install at the same time,
conflicts will not happen.
Try to install packages into sdk image at the same time
Signed-off-by: Jian Liu <jian.liu at windriver.com>
---
sdk.py | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------
1 file changed, 96 insertions(+), 12 deletions(-)
diff --git a/meta/lib/oe/sdk.py b/meta/lib/oe/sdk.py
index c57a441..f62d948 100644
--- a/meta/lib/oe/sdk.py
+++ b/meta/lib/oe/sdk.py
@@ -107,10 +107,38 @@ class RpmSdk(Sdk):
pm.dump_all_available_pkgs()
pm.update()
- for pkg_type in self.install_order:
- if pkg_type in pkgs_to_install:
- pm.install(pkgs_to_install[pkg_type],
- [False, True][pkg_type == Manifest.PKG_TYPE_ATTEMPT_ONLY])
+ except_pkgs = self.d.getVar('SDKIMAGE_INSTALL_COMPLEMENTARY', True).replace("*","").split()
+
+ # Here is only a workaround.
+ # The packages are separated into 3 parts ---
+ # -- attempt only (in pkgs_to_install)
+ # -- must install (in pkgs_to_install)
+ # -- comlementary (add -dev and -dbg after the packages in pkgs_to_install)
+ # If pkgs_to_install contains libxml2-dev and lib32-libxml2, the result will be
+ # libxml2-dev is installed but lib32-libxml2-dev will not be.
+ # Reason is that smart can not handle conflicts unless lib32-libxml2-dev and libxml2-dev
+ # is installed at the same time. That is "pm.install('lib32-libxml2-dev libxml2-dev').
+ # But the situation is "pm.install('lib32-libxml2-dev'); pm.install('libxml2-dev')"
+ # Here try to put lib32-libxml2-dev and libxml2-dev in comlementary packages, so that
+ # they can be installed at the same time
+ pkgs = []
+ pkgs_attempt = []
+ for pkg_type in pkgs_to_install:
+ for pkg in pkgs_to_install[pkg_type]:
+ for except_pkg in except_pkgs:
+ if "packagegroup" not in pkg and pkg.endswith(except_pkg):
+ pkg = pkg[:-len(except_pkg)]
+
+ if pkg_type == Manifest.PKG_TYPE_ATTEMPT_ONLY:
+ if pkg not in pkgs_attempt:
+ pkgs_attempt.append(pkg)
+ else:
+ if pkg not in pkgs_attempt:
+ pkgs.append(pkg)
+
+ pm.install(pkgs)
+
+ pm.install(pkgs_attempt, True)
def _populate(self):
bb.note("Installing TARGET packages")
@@ -184,10 +212,38 @@ class OpkgSdk(Sdk):
pm.update()
- for pkg_type in self.install_order:
- if pkg_type in pkgs_to_install:
- pm.install(pkgs_to_install[pkg_type],
- [False, True][pkg_type == Manifest.PKG_TYPE_ATTEMPT_ONLY])
+ except_pkgs = self.d.getVar('SDKIMAGE_INSTALL_COMPLEMENTARY', True).replace("*","").split()
+
+ # Here is only a workaround.
+ # The packages are separated into 3 parts ---
+ # -- attempt only (in pkgs_to_install)
+ # -- must install (in pkgs_to_install)
+ # -- comlementary (add -dev and -dbg after the packages in pkgs_to_install)
+ # If pkgs_to_install contains libxml2-dev and lib32-libxml2, the result will be
+ # libxml2-dev is installed but lib32-libxml2-dev will not be.
+ # Reason is that smart can not handle conflicts unless lib32-libxml2-dev and libxml2-dev
+ # is installed at the same time. That is "pm.install('lib32-libxml2-dev libxml2-dev').
+ # But the situation is "pm.install('lib32-libxml2-dev'); pm.install('libxml2-dev')"
+ # Here try to put lib32-libxml2-dev and libxml2-dev in comlementary packages, so that
+ # they can be installed at the same time
+ pkgs = []
+ pkgs_attempt = []
+ for pkg_type in pkgs_to_install:
+ for pkg in pkgs_to_install[pkg_type]:
+ for except_pkg in except_pkgs:
+ if "packagegroup" not in pkg and pkg.endswith(except_pkg):
+ pkg = pkg[:-len(except_pkg)]
+
+ if pkg_type == Manifest.PKG_TYPE_ATTEMPT_ONLY:
+ if pkg not in pkgs_attempt:
+ pkgs_attempt.append(pkg)
+ else:
+ if pkg not in pkgs_attempt:
+ pkgs.append(pkg)
+
+ pm.install(pkgs)
+
+ pm.install(pkgs_attempt, True)
def _populate(self):
bb.note("Installing TARGET packages")
@@ -260,10 +316,38 @@ class DpkgSdk(Sdk):
pm.write_index()
pm.update()
- for pkg_type in self.install_order:
- if pkg_type in pkgs_to_install:
- pm.install(pkgs_to_install[pkg_type],
- [False, True][pkg_type == Manifest.PKG_TYPE_ATTEMPT_ONLY])
+ except_pkgs = self.d.getVar('SDKIMAGE_INSTALL_COMPLEMENTARY', True).replace("*","").split()
+
+ # Here is only a workaround.
+ # The packages are separated into 3 parts ---
+ # -- attempt only (in pkgs_to_install)
+ # -- must install (in pkgs_to_install)
+ # -- comlementary (add -dev and -dbg after the packages in pkgs_to_install)
+ # If pkgs_to_install contains libxml2-dev and lib32-libxml2, the result will be
+ # libxml2-dev is installed but lib32-libxml2-dev will not be.
+ # Reason is that smart can not handle conflicts unless lib32-libxml2-dev and libxml2-dev
+ # is installed at the same time. That is "pm.install('lib32-libxml2-dev libxml2-dev').
+ # But the situation is "pm.install('lib32-libxml2-dev'); pm.install('libxml2-dev')"
+ # Here try to put lib32-libxml2-dev and libxml2-dev in comlementary packages, so that
+ # they can be installed at the same time
+ pkgs = []
+ pkgs_attempt = []
+ for pkg_type in pkgs_to_install:
+ for pkg in pkgs_to_install[pkg_type]:
+ for except_pkg in except_pkgs:
+ if "packagegroup" not in pkg and pkg.endswith(except_pkg):
+ pkg = pkg[:-len(except_pkg)]
+
+ if pkg_type == Manifest.PKG_TYPE_ATTEMPT_ONLY:
+ if pkg not in pkgs_attempt:
+ pkgs_attempt.append(pkg)
+ else:
+ if pkg not in pkgs_attempt:
+ pkgs.append(pkg)
+
+ pm.install(pkgs)
+
+ pm.install(pkgs_attempt, True)
def _populate(self):
bb.note("Installing TARGET packages")
More information about the Openembedded-core
mailing list