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):  class RpmPkgsList(PkgsList): -    def __init__(self, d, rootfs_dir, arch_var=None, os_var=None): +    def __init__(self, d, rootfs_dir, arch_var=None, os_var=None, rpm_version=5):          super(RpmPkgsList, self).__init__(d, rootfs_dir)          self.rpm_cmd = bb.utils.which(os.getenv('PATH'), "rpm") @@ -219,6 +219,8 @@ class RpmPkgsList(PkgsList):          self.ml_prefix_list, self.ml_os_list = \              RpmIndexer(d, rootfs_dir).get_ml_prefix_and_os_list(arch_var, os_var) +        self.rpm_version = rpm_version +      '''      Translate the RPM/Smart format names to the OE multilib format names      ''' @@ -267,11 +269,16 @@ class RpmPkgsList(PkgsList):      def list(self, format=None):          if format == "deps": +            if self.rpm_version == 4: +                bb.fatal("'deps' format dependency listings are not supported with rpm 4 since rpmresolve does not work")              return self._list_pkg_deps()          cmd = self.rpm_cmd + ' --root ' + self.rootfs_dir          cmd += ' -D "_dbpath /var/lib/rpm" -qa' -        cmd += " --qf '[%{NAME} %{ARCH} %{VERSION} %{PACKAGEORIGIN}\n]'" +        if self.rpm_version == 4: +            cmd += " --qf '[%{NAME} %{ARCH} %{VERSION}\n]'" +        else: +            cmd += " --qf '[%{NAME} %{ARCH} %{VERSION} %{PACKAGEORIGIN}\n]'"          try:              # bb.note(cmd) @@ -288,7 +295,10 @@ class RpmPkgsList(PkgsList):              pkg = line.split()[0]              arch = line.split()[1]              ver = line.split()[2] -            pkgorigin = line.split()[3] +            if self.rpm_version == 4: +                pkgorigin = "unknown" +            else: +                pkgorigin = line.split()[3]              new_pkg, new_arch = self._pkg_translate_smart_to_oe(pkg, arch)              if format == "arch": @@ -554,8 +564,17 @@ class RpmPM(PackageManager):          if not os.path.exists(self.d.expand('${T}/saved')):              bb.utils.mkdirhier(self.d.expand('${T}/saved')) +        # Determine rpm version +        cmd = "%s --version" % self.rpm_cmd +        try: +            output = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True) +        except subprocess.CalledProcessError as e: +            bb.fatal("Getting rpm version failed. Command '%s' " +                     "returned %d:\n%s" % (cmd, e.returncode, e.output)) +        self.rpm_version = int(output.split()[-1].split('.')[0]) +          self.indexer = RpmIndexer(self.d, self.deploy_dir) -        self.pkgs_list = RpmPkgsList(self.d, self.target_rootfs, arch_var, os_var) +        self.pkgs_list = RpmPkgsList(self.d, self.target_rootfs, arch_var, os_var, self.rpm_version)          self.ml_prefix_list, self.ml_os_list = self.indexer.get_ml_prefix_and_os_list(arch_var, os_var) @@ -745,43 +764,46 @@ class RpmPM(PackageManager):          # After change the __db.* cache size, log file will not be          # generated automatically, that will raise some warnings,          # so touch a bare log for rpm write into it. -        rpmlib_log = os.path.join(self.image_rpmlib, 'log', 'log.0000000001') -        if not os.path.exists(rpmlib_log): -            bb.utils.mkdirhier(os.path.join(self.image_rpmlib, 'log')) -            open(rpmlib_log, 'w+').close() - -        DB_CONFIG_CONTENT = "# ================ Environment\n" \ -            "set_data_dir .\n" \ -            "set_create_dir .\n" \ -            "set_lg_dir ./log\n" \ -            "set_tmp_dir ./tmp\n" \ -            "set_flags db_log_autoremove on\n" \ -            "\n" \ -            "# -- thread_count must be >= 8\n" \ -            "set_thread_count 64\n" \ -            "\n" \ -            "# ================ Logging\n" \ -            "\n" \ -            "# ================ Memory Pool\n" \ -            "set_cachesize 0 1048576 0\n" \ -            "set_mp_mmapsize 268435456\n" \ -            "\n" \ -            "# ================ Locking\n" \ -            "set_lk_max_locks 16384\n" \ -            "set_lk_max_lockers 16384\n" \ -            "set_lk_max_objects 16384\n" \ -            "mutex_set_max 163840\n" \ -            "\n" \ -            "# ================ Replication\n" - -        db_config_dir = os.path.join(self.image_rpmlib, 'DB_CONFIG') -        if not os.path.exists(db_config_dir): -            open(db_config_dir, 'w+').write(DB_CONFIG_CONTENT) +        if self.rpm_version == 5: +            rpmlib_log = os.path.join(self.image_rpmlib, 'log', 'log.0000000001') +            if not os.path.exists(rpmlib_log): +                bb.utils.mkdirhier(os.path.join(self.image_rpmlib, 'log')) +                open(rpmlib_log, 'w+').close() + +            DB_CONFIG_CONTENT = "# ================ Environment\n" \ +                "set_data_dir .\n" \ +                "set_create_dir .\n" \ +                "set_lg_dir ./log\n" \ +                "set_tmp_dir ./tmp\n" \ +                "set_flags db_log_autoremove on\n" \ +                "\n" \ +                "# -- thread_count must be >= 8\n" \ +                "set_thread_count 64\n" \ +                "\n" \ +                "# ================ Logging\n" \ +                "\n" \ +                "# ================ Memory Pool\n" \ +                "set_cachesize 0 1048576 0\n" \ +                "set_mp_mmapsize 268435456\n" \ +                "\n" \ +                "# ================ Locking\n" \ +                "set_lk_max_locks 16384\n" \ +                "set_lk_max_lockers 16384\n" \ +                "set_lk_max_objects 16384\n" \ +                "mutex_set_max 163840\n" \ +                "\n" \ +                "# ================ Replication\n" + +            db_config_dir = os.path.join(self.image_rpmlib, 'DB_CONFIG') +            if not os.path.exists(db_config_dir): +                open(db_config_dir, 'w+').write(DB_CONFIG_CONTENT)          # Create database so that smart doesn't complain (lazy init) -        cmd = "%s --root %s --dbpath /var/lib/rpm -qa > /dev/null" % ( -              self.rpm_cmd, -              self.target_rootfs) +        opt = "-qa" +        if self.rpm_version == 4: +            opt = "--initdb" +        cmd = "%s --root %s --dbpath /var/lib/rpm %s > /dev/null" % ( +              self.rpm_cmd, self.target_rootfs, opt)          try:              subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True)          except subprocess.CalledProcessError as e: @@ -818,6 +840,9 @@ class RpmPM(PackageManager):          # Write common configuration for host and target usage          self._invoke_smart('config --set rpm-nolinktos=1')          self._invoke_smart('config --set rpm-noparentdirs=1') +        check_signature = self.d.getVar('RPM_CHECK_SIGNATURES', True) +        if check_signature and check_signature.strip() == "0": +            self._invoke_smart('config --set rpm-check-signatures=false')          for i in self.d.getVar('BAD_RECOMMENDATIONS', True).split():              self._invoke_smart('flag --set ignore-recommends %s' % i) @@ -856,6 +881,11 @@ class RpmPM(PackageManager):          # If we ever run into needing more the 899 scripts, we'll have to.          # change num to start with 1000.          # +        if self.rpm_version == 4: +            scriptletcmd = "$2 $3 $4\n" +        else: +            scriptletcmd = "$2 $1/$3 $4\n" +          SCRIPTLET_FORMAT = "#!/bin/bash\n" \              "\n" \              "export PATH=%s\n" \ @@ -866,7 +896,7 @@ class RpmPM(PackageManager):              "export INTERCEPT_DIR=%s\n" \              "export NATIVE_ROOT=%s\n" \              "\n" \ -            "$2 $1/$3 $4\n" \ +            + scriptletcmd + \              "if [ $? -ne 0 ]; then\n" \              "  if [ $4 -eq 1 ]; then\n" \              "    mkdir -p $1/etc/rpm-postinsts\n" \ | 
