diff options
author | Robert Yang <liezhi.yang@windriver.com> | 2015-09-15 19:04:11 -0700 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2015-09-28 12:00:15 +0100 |
commit | eb7b1a58ceaab7fde4dc954eb4df4247d6c7c6d8 (patch) | |
tree | 09e8ee303b2c4b6e1326d2d3bd20d1a7fabf27f2 /meta/lib/oe/package_manager.py | |
parent | 5a51fb28dbdfcae8ceb503a5290532dd38aeb09f (diff) | |
download | poky-eb7b1a58ceaab7fde4dc954eb4df4247d6c7c6d8.tar.gz |
package_manager.py: make rpm install mutilib pkgs corectly
When configure multilib, "bitbake <image_bb> -c populate_sdk" should
install all arch toolchains (for example, 32 and 64bit), but rpm not
handle the multilib requires correctly, for example:
lib32-packagegroup-core-standalone-sdk-target requires lib32-libc6, rpm
may pull in libc6 rather than lib32-libc6, there are the similar issue
when:
IMAGE_INSTALL_append += "lib32-packagegroup-foo foo"
Use bitbake to expand the RDEPENDS will fix the problem since bitbake
knows mlprefix and handle it well, but rpm doesn't.
This patch only affects when:
IMAGE_INSTALL = "lib32-foo foo"
Doesn't affect:
IMAGE_INSTALL = "lib32-foo1 lib32-foo2"
Or:
IMAGE_INSTALL = "foo1 foo2"
[YOCTO #8089]
(From OE-Core rev: fc469e51475b5272b4047d4713eb99529193ac8a)
Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/lib/oe/package_manager.py')
-rw-r--r-- | meta/lib/oe/package_manager.py | 83 |
1 files changed, 81 insertions, 2 deletions
diff --git a/meta/lib/oe/package_manager.py b/meta/lib/oe/package_manager.py index 292ed44461..c51e88be58 100644 --- a/meta/lib/oe/package_manager.py +++ b/meta/lib/oe/package_manager.py | |||
@@ -605,12 +605,12 @@ class PackageManager(object): | |||
605 | cmd.extend(['-x', exclude]) | 605 | cmd.extend(['-x', exclude]) |
606 | try: | 606 | try: |
607 | bb.note("Installing complementary packages ...") | 607 | bb.note("Installing complementary packages ...") |
608 | bb.note('Running %s' % cmd) | ||
608 | complementary_pkgs = subprocess.check_output(cmd, stderr=subprocess.STDOUT) | 609 | complementary_pkgs = subprocess.check_output(cmd, stderr=subprocess.STDOUT) |
609 | except subprocess.CalledProcessError as e: | 610 | except subprocess.CalledProcessError as e: |
610 | bb.fatal("Could not compute complementary packages list. Command " | 611 | bb.fatal("Could not compute complementary packages list. Command " |
611 | "'%s' returned %d:\n%s" % | 612 | "'%s' returned %d:\n%s" % |
612 | (' '.join(cmd), e.returncode, e.output)) | 613 | (' '.join(cmd), e.returncode, e.output)) |
613 | |||
614 | self.install(complementary_pkgs.split(), attempt_only=True) | 614 | self.install(complementary_pkgs.split(), attempt_only=True) |
615 | 615 | ||
616 | def deploy_dir_lock(self): | 616 | def deploy_dir_lock(self): |
@@ -1050,6 +1050,35 @@ class RpmPM(PackageManager): | |||
1050 | def update(self): | 1050 | def update(self): |
1051 | self._invoke_smart('update rpmsys') | 1051 | self._invoke_smart('update rpmsys') |
1052 | 1052 | ||
1053 | def get_rdepends_recursively(self, pkgs): | ||
1054 | # pkgs will be changed during the loop, so use [:] to make a copy. | ||
1055 | for pkg in pkgs[:]: | ||
1056 | sub_data = oe.packagedata.read_subpkgdata(pkg, self.d) | ||
1057 | sub_rdep = sub_data.get("RDEPENDS_" + pkg) | ||
1058 | if not sub_rdep: | ||
1059 | continue | ||
1060 | done = bb.utils.explode_dep_versions2(sub_rdep).keys() | ||
1061 | next = done | ||
1062 | # Find all the rdepends on dependency chain | ||
1063 | while next: | ||
1064 | new = [] | ||
1065 | for sub_pkg in next: | ||
1066 | sub_data = oe.packagedata.read_subpkgdata(sub_pkg, self.d) | ||
1067 | sub_pkg_rdep = sub_data.get("RDEPENDS_" + sub_pkg) | ||
1068 | if not sub_pkg_rdep: | ||
1069 | continue | ||
1070 | for p in bb.utils.explode_dep_versions2(sub_pkg_rdep): | ||
1071 | # Already handled, skip it. | ||
1072 | if p in done or p in pkgs: | ||
1073 | continue | ||
1074 | # It's a new dep | ||
1075 | if oe.packagedata.has_subpkgdata(p, self.d): | ||
1076 | done.append(p) | ||
1077 | new.append(p) | ||
1078 | next = new | ||
1079 | pkgs.extend(done) | ||
1080 | return pkgs | ||
1081 | |||
1053 | ''' | 1082 | ''' |
1054 | Install pkgs with smart, the pkg name is oe format | 1083 | Install pkgs with smart, the pkg name is oe format |
1055 | ''' | 1084 | ''' |
@@ -1059,8 +1088,58 @@ class RpmPM(PackageManager): | |||
1059 | bb.note("There are no packages to install") | 1088 | bb.note("There are no packages to install") |
1060 | return | 1089 | return |
1061 | bb.note("Installing the following packages: %s" % ' '.join(pkgs)) | 1090 | bb.note("Installing the following packages: %s" % ' '.join(pkgs)) |
1091 | if not attempt_only: | ||
1092 | # Pull in multilib requires since rpm may not pull in them | ||
1093 | # correctly, for example, | ||
1094 | # lib32-packagegroup-core-standalone-sdk-target requires | ||
1095 | # lib32-libc6, but rpm may pull in libc6 rather than lib32-libc6 | ||
1096 | # since it doesn't know mlprefix (lib32-), bitbake knows it and | ||
1097 | # can handle it well, find out the RDEPENDS on the chain will | ||
1098 | # fix the problem. Both do_rootfs and do_populate_sdk have this | ||
1099 | # issue. | ||
1100 | # The attempt_only packages don't need this since they are | ||
1101 | # based on the installed ones. | ||
1102 | # | ||
1103 | # Separate pkgs into two lists, one is multilib, the other one | ||
1104 | # is non-multilib. | ||
1105 | ml_pkgs = [] | ||
1106 | non_ml_pkgs = pkgs[:] | ||
1107 | for pkg in pkgs: | ||
1108 | for mlib in (self.d.getVar("MULTILIB_VARIANTS", True) or "").split(): | ||
1109 | if pkg.startswith(mlib + '-'): | ||
1110 | ml_pkgs.append(pkg) | ||
1111 | non_ml_pkgs.remove(pkg) | ||
1112 | |||
1113 | if len(ml_pkgs) > 0 and len(non_ml_pkgs) > 0: | ||
1114 | # Found both foo and lib-foo | ||
1115 | ml_pkgs = self.get_rdepends_recursively(ml_pkgs) | ||
1116 | non_ml_pkgs = self.get_rdepends_recursively(non_ml_pkgs) | ||
1117 | # Longer list makes smart slower, so only keep the pkgs | ||
1118 | # which have the same BPN, and smart can handle others | ||
1119 | # correctly. | ||
1120 | pkgs_new = [] | ||
1121 | for pkg in non_ml_pkgs: | ||
1122 | for mlib in (self.d.getVar("MULTILIB_VARIANTS", True) or "").split(): | ||
1123 | mlib_pkg = mlib + "-" + pkg | ||
1124 | if mlib_pkg in ml_pkgs: | ||
1125 | pkgs_new.append(pkg) | ||
1126 | pkgs_new.append(mlib_pkg) | ||
1127 | for pkg in pkgs: | ||
1128 | if pkg not in pkgs_new: | ||
1129 | pkgs_new.append(pkg) | ||
1130 | pkgs = pkgs_new | ||
1131 | new_depends = {} | ||
1132 | deps = bb.utils.explode_dep_versions2(" ".join(pkgs)) | ||
1133 | for depend in deps: | ||
1134 | data = oe.packagedata.read_subpkgdata(depend, self.d) | ||
1135 | key = "PKG_%s" % depend | ||
1136 | if key in data: | ||
1137 | new_depend = data[key] | ||
1138 | else: | ||
1139 | new_depend = depend | ||
1140 | new_depends[new_depend] = deps[depend] | ||
1141 | pkgs = bb.utils.join_deps(new_depends, commasep=True).split(', ') | ||
1062 | pkgs = self._pkg_translate_oe_to_smart(pkgs, attempt_only) | 1142 | pkgs = self._pkg_translate_oe_to_smart(pkgs, attempt_only) |
1063 | |||
1064 | if not attempt_only: | 1143 | if not attempt_only: |
1065 | bb.note('to be installed: %s' % ' '.join(pkgs)) | 1144 | bb.note('to be installed: %s' % ' '.join(pkgs)) |
1066 | cmd = "%s %s install -y %s" % \ | 1145 | cmd = "%s %s install -y %s" % \ |