summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--meta/lib/oe/package_manager.py110
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
212class RpmPkgsList(PkgsList): 212class 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" \