diff options
| -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" \ |
