diff options
author | Richard Purdie <richard.purdie@linuxfoundation.org> | 2014-08-29 15:25:15 +0000 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2014-09-03 11:09:03 +0100 |
commit | 45907b6d7fec3a929b51b7675962090dc627cd63 (patch) | |
tree | 8d167dd348b4d7df8ab3aa922af323ee9de140d3 | |
parent | c5dc66430e8efa918afe5c8f502d3fcff3a0019d (diff) | |
download | poky-45907b6d7fec3a929b51b7675962090dc627cd63.tar.gz |
package_manager: Add rpm v4 support
Currently the package manager code only supports rpm v5. To be useful outside
of OE or with OE layers using v4, it makes sense to add in rpm v4 support. This
takes a patch from "Bartosh, Eduard" <eduard.bartosh@intel.com> and enhances
it to also include versions of the workarounds from poky-eurogiciel to
allow rpm v4 usage with the class for image construction.
(From OE-Core rev: fe21804c296bbb8b2b8b0c29e6e4890bc17f07fc)
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r-- | meta/lib/oe/package_manager.py | 110 |
1 files changed, 70 insertions, 40 deletions
diff --git a/meta/lib/oe/package_manager.py b/meta/lib/oe/package_manager.py index 612c8357a6..86cef02d77 100644 --- a/meta/lib/oe/package_manager.py +++ b/meta/lib/oe/package_manager.py | |||
@@ -210,7 +210,7 @@ class PkgsList(object): | |||
210 | 210 | ||
211 | 211 | ||
212 | class RpmPkgsList(PkgsList): | 212 | class RpmPkgsList(PkgsList): |
213 | def __init__(self, d, rootfs_dir, arch_var=None, os_var=None): | 213 | def __init__(self, d, rootfs_dir, arch_var=None, os_var=None, rpm_version=5): |
214 | super(RpmPkgsList, self).__init__(d, rootfs_dir) | 214 | super(RpmPkgsList, self).__init__(d, rootfs_dir) |
215 | 215 | ||
216 | self.rpm_cmd = bb.utils.which(os.getenv('PATH'), "rpm") | 216 | self.rpm_cmd = bb.utils.which(os.getenv('PATH'), "rpm") |
@@ -219,6 +219,8 @@ class RpmPkgsList(PkgsList): | |||
219 | self.ml_prefix_list, self.ml_os_list = \ | 219 | self.ml_prefix_list, self.ml_os_list = \ |
220 | RpmIndexer(d, rootfs_dir).get_ml_prefix_and_os_list(arch_var, os_var) | 220 | RpmIndexer(d, rootfs_dir).get_ml_prefix_and_os_list(arch_var, os_var) |
221 | 221 | ||
222 | self.rpm_version = rpm_version | ||
223 | |||
222 | ''' | 224 | ''' |
223 | Translate the RPM/Smart format names to the OE multilib format names | 225 | Translate the RPM/Smart format names to the OE multilib format names |
224 | ''' | 226 | ''' |
@@ -267,11 +269,16 @@ class RpmPkgsList(PkgsList): | |||
267 | 269 | ||
268 | def list(self, format=None): | 270 | def list(self, format=None): |
269 | if format == "deps": | 271 | if format == "deps": |
272 | if self.rpm_version == 4: | ||
273 | bb.fatal("'deps' format dependency listings are not supported with rpm 4 since rpmresolve does not work") | ||
270 | return self._list_pkg_deps() | 274 | return self._list_pkg_deps() |
271 | 275 | ||
272 | cmd = self.rpm_cmd + ' --root ' + self.rootfs_dir | 276 | cmd = self.rpm_cmd + ' --root ' + self.rootfs_dir |
273 | cmd += ' -D "_dbpath /var/lib/rpm" -qa' | 277 | cmd += ' -D "_dbpath /var/lib/rpm" -qa' |
274 | cmd += " --qf '[%{NAME} %{ARCH} %{VERSION} %{PACKAGEORIGIN}\n]'" | 278 | if self.rpm_version == 4: |
279 | cmd += " --qf '[%{NAME} %{ARCH} %{VERSION}\n]'" | ||
280 | else: | ||
281 | cmd += " --qf '[%{NAME} %{ARCH} %{VERSION} %{PACKAGEORIGIN}\n]'" | ||
275 | 282 | ||
276 | try: | 283 | try: |
277 | # bb.note(cmd) | 284 | # bb.note(cmd) |
@@ -288,7 +295,10 @@ class RpmPkgsList(PkgsList): | |||
288 | pkg = line.split()[0] | 295 | pkg = line.split()[0] |
289 | arch = line.split()[1] | 296 | arch = line.split()[1] |
290 | ver = line.split()[2] | 297 | ver = line.split()[2] |
291 | pkgorigin = line.split()[3] | 298 | if self.rpm_version == 4: |
299 | pkgorigin = "unknown" | ||
300 | else: | ||
301 | pkgorigin = line.split()[3] | ||
292 | new_pkg, new_arch = self._pkg_translate_smart_to_oe(pkg, arch) | 302 | new_pkg, new_arch = self._pkg_translate_smart_to_oe(pkg, arch) |
293 | 303 | ||
294 | if format == "arch": | 304 | if format == "arch": |
@@ -554,8 +564,17 @@ class RpmPM(PackageManager): | |||
554 | if not os.path.exists(self.d.expand('${T}/saved')): | 564 | if not os.path.exists(self.d.expand('${T}/saved')): |
555 | bb.utils.mkdirhier(self.d.expand('${T}/saved')) | 565 | bb.utils.mkdirhier(self.d.expand('${T}/saved')) |
556 | 566 | ||
567 | # Determine rpm version | ||
568 | cmd = "%s --version" % self.rpm_cmd | ||
569 | try: | ||
570 | output = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True) | ||
571 | except subprocess.CalledProcessError as e: | ||
572 | bb.fatal("Getting rpm version failed. Command '%s' " | ||
573 | "returned %d:\n%s" % (cmd, e.returncode, e.output)) | ||
574 | self.rpm_version = int(output.split()[-1].split('.')[0]) | ||
575 | |||
557 | self.indexer = RpmIndexer(self.d, self.deploy_dir) | 576 | self.indexer = RpmIndexer(self.d, self.deploy_dir) |
558 | self.pkgs_list = RpmPkgsList(self.d, self.target_rootfs, arch_var, os_var) | 577 | self.pkgs_list = RpmPkgsList(self.d, self.target_rootfs, arch_var, os_var, self.rpm_version) |
559 | 578 | ||
560 | self.ml_prefix_list, self.ml_os_list = self.indexer.get_ml_prefix_and_os_list(arch_var, os_var) | 579 | self.ml_prefix_list, self.ml_os_list = self.indexer.get_ml_prefix_and_os_list(arch_var, os_var) |
561 | 580 | ||
@@ -745,43 +764,46 @@ class RpmPM(PackageManager): | |||
745 | # After change the __db.* cache size, log file will not be | 764 | # After change the __db.* cache size, log file will not be |
746 | # generated automatically, that will raise some warnings, | 765 | # generated automatically, that will raise some warnings, |
747 | # so touch a bare log for rpm write into it. | 766 | # so touch a bare log for rpm write into it. |
748 | rpmlib_log = os.path.join(self.image_rpmlib, 'log', 'log.0000000001') | 767 | if self.rpm_version == 5: |
749 | if not os.path.exists(rpmlib_log): | 768 | rpmlib_log = os.path.join(self.image_rpmlib, 'log', 'log.0000000001') |
750 | bb.utils.mkdirhier(os.path.join(self.image_rpmlib, 'log')) | 769 | if not os.path.exists(rpmlib_log): |
751 | open(rpmlib_log, 'w+').close() | 770 | bb.utils.mkdirhier(os.path.join(self.image_rpmlib, 'log')) |
752 | 771 | open(rpmlib_log, 'w+').close() | |
753 | DB_CONFIG_CONTENT = "# ================ Environment\n" \ | 772 | |
754 | "set_data_dir .\n" \ | 773 | DB_CONFIG_CONTENT = "# ================ Environment\n" \ |
755 | "set_create_dir .\n" \ | 774 | "set_data_dir .\n" \ |
756 | "set_lg_dir ./log\n" \ | 775 | "set_create_dir .\n" \ |
757 | "set_tmp_dir ./tmp\n" \ | 776 | "set_lg_dir ./log\n" \ |
758 | "set_flags db_log_autoremove on\n" \ | 777 | "set_tmp_dir ./tmp\n" \ |
759 | "\n" \ | 778 | "set_flags db_log_autoremove on\n" \ |
760 | "# -- thread_count must be >= 8\n" \ | 779 | "\n" \ |
761 | "set_thread_count 64\n" \ | 780 | "# -- thread_count must be >= 8\n" \ |
762 | "\n" \ | 781 | "set_thread_count 64\n" \ |
763 | "# ================ Logging\n" \ | 782 | "\n" \ |
764 | "\n" \ | 783 | "# ================ Logging\n" \ |
765 | "# ================ Memory Pool\n" \ | 784 | "\n" \ |
766 | "set_cachesize 0 1048576 0\n" \ | 785 | "# ================ Memory Pool\n" \ |
767 | "set_mp_mmapsize 268435456\n" \ | 786 | "set_cachesize 0 1048576 0\n" \ |
768 | "\n" \ | 787 | "set_mp_mmapsize 268435456\n" \ |
769 | "# ================ Locking\n" \ | 788 | "\n" \ |
770 | "set_lk_max_locks 16384\n" \ | 789 | "# ================ Locking\n" \ |
771 | "set_lk_max_lockers 16384\n" \ | 790 | "set_lk_max_locks 16384\n" \ |
772 | "set_lk_max_objects 16384\n" \ | 791 | "set_lk_max_lockers 16384\n" \ |
773 | "mutex_set_max 163840\n" \ | 792 | "set_lk_max_objects 16384\n" \ |
774 | "\n" \ | 793 | "mutex_set_max 163840\n" \ |
775 | "# ================ Replication\n" | 794 | "\n" \ |
776 | 795 | "# ================ Replication\n" | |
777 | db_config_dir = os.path.join(self.image_rpmlib, 'DB_CONFIG') | 796 | |
778 | if not os.path.exists(db_config_dir): | 797 | db_config_dir = os.path.join(self.image_rpmlib, 'DB_CONFIG') |
779 | open(db_config_dir, 'w+').write(DB_CONFIG_CONTENT) | 798 | if not os.path.exists(db_config_dir): |
799 | open(db_config_dir, 'w+').write(DB_CONFIG_CONTENT) | ||
780 | 800 | ||
781 | # Create database so that smart doesn't complain (lazy init) | 801 | # Create database so that smart doesn't complain (lazy init) |
782 | cmd = "%s --root %s --dbpath /var/lib/rpm -qa > /dev/null" % ( | 802 | opt = "-qa" |
783 | self.rpm_cmd, | 803 | if self.rpm_version == 4: |
784 | self.target_rootfs) | 804 | opt = "--initdb" |
805 | cmd = "%s --root %s --dbpath /var/lib/rpm %s > /dev/null" % ( | ||
806 | self.rpm_cmd, self.target_rootfs, opt) | ||
785 | try: | 807 | try: |
786 | subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True) | 808 | subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True) |
787 | except subprocess.CalledProcessError as e: | 809 | except subprocess.CalledProcessError as e: |
@@ -818,6 +840,9 @@ class RpmPM(PackageManager): | |||
818 | # Write common configuration for host and target usage | 840 | # Write common configuration for host and target usage |
819 | self._invoke_smart('config --set rpm-nolinktos=1') | 841 | self._invoke_smart('config --set rpm-nolinktos=1') |
820 | self._invoke_smart('config --set rpm-noparentdirs=1') | 842 | self._invoke_smart('config --set rpm-noparentdirs=1') |
843 | check_signature = self.d.getVar('RPM_CHECK_SIGNATURES', True) | ||
844 | if check_signature and check_signature.strip() == "0": | ||
845 | self._invoke_smart('config --set rpm-check-signatures=false') | ||
821 | for i in self.d.getVar('BAD_RECOMMENDATIONS', True).split(): | 846 | for i in self.d.getVar('BAD_RECOMMENDATIONS', True).split(): |
822 | self._invoke_smart('flag --set ignore-recommends %s' % i) | 847 | self._invoke_smart('flag --set ignore-recommends %s' % i) |
823 | 848 | ||
@@ -856,6 +881,11 @@ class RpmPM(PackageManager): | |||
856 | # If we ever run into needing more the 899 scripts, we'll have to. | 881 | # If we ever run into needing more the 899 scripts, we'll have to. |
857 | # change num to start with 1000. | 882 | # change num to start with 1000. |
858 | # | 883 | # |
884 | if self.rpm_version == 4: | ||
885 | scriptletcmd = "$2 $3 $4\n" | ||
886 | else: | ||
887 | scriptletcmd = "$2 $1/$3 $4\n" | ||
888 | |||
859 | SCRIPTLET_FORMAT = "#!/bin/bash\n" \ | 889 | SCRIPTLET_FORMAT = "#!/bin/bash\n" \ |
860 | "\n" \ | 890 | "\n" \ |
861 | "export PATH=%s\n" \ | 891 | "export PATH=%s\n" \ |
@@ -866,7 +896,7 @@ class RpmPM(PackageManager): | |||
866 | "export INTERCEPT_DIR=%s\n" \ | 896 | "export INTERCEPT_DIR=%s\n" \ |
867 | "export NATIVE_ROOT=%s\n" \ | 897 | "export NATIVE_ROOT=%s\n" \ |
868 | "\n" \ | 898 | "\n" \ |
869 | "$2 $1/$3 $4\n" \ | 899 | + scriptletcmd + \ |
870 | "if [ $? -ne 0 ]; then\n" \ | 900 | "if [ $? -ne 0 ]; then\n" \ |
871 | " if [ $4 -eq 1 ]; then\n" \ | 901 | " if [ $4 -eq 1 ]; then\n" \ |
872 | " mkdir -p $1/etc/rpm-postinsts\n" \ | 902 | " mkdir -p $1/etc/rpm-postinsts\n" \ |