docstr: Generate the text of an RPM spec file and return it as a
  list of strings (one per line).
docstr_tok: ["Generate","the","text","of","an","RPM","spec","file","and","return","it","as","a","list","of","strings","(","one","per","line",")","."]
code: def _make_spec_file(self):
      """Generate the text of an RPM spec file and return it as a
      list of strings (one per line).
      """
      # definitions and headers
      spec_file = [
          "%define name " + self.distribution.get_name(),
          "%define version "
          + self.distribution.get_version().replace("-", "_"),
          "%define unmangled_version "
          + self.distribution.get_version(),
          "%define release " + self.release.replace("-", "_"),
          "",
          "Summary: " + self.distribution.get_description(),
      ]
  
      # Workaround for #14443 which affects some RPM based systems such as
      # RHEL6 (and probably derivatives)
      vendor_hook = subprocess.getoutput(
          "rpm --eval %{__os_install_post}"
      )
      # Generate a potential replacement value for __os_install_post (whilst
      # normalizing the whitespace to simplify the test for whether the
      # invocation of brp-python-bytecompile passes in __python):
      vendor_hook = "\n".join(
          [
              "  %s \\" % line.strip()
              for line in vendor_hook.splitlines()
          ]
      )
      problem = "brp-python-bytecompile \\\n"
      fixed = "brp-python-bytecompile %{__python} \\\n"
      fixed_hook = vendor_hook.replace(problem, fixed)
      if fixed_hook != vendor_hook:
          spec_file.append(
              "# Workaround for http://bugs.python.org/issue14443"
          )
          spec_file.append(
              "%define __os_install_post " + fixed_hook + "\n"
          )
  
      # put locale summaries into spec file
      # XXX not supported for now (hard to put a dictionary
      # in a config file -- arg!)
      # for locale in self.summaries.keys():
      #    spec_file.append('Summary(%s): %s' % (locale,
      #                                          self.summaries[locale]))
  
      spec_file.extend(
          [
              "Name: %{name}",
              "Version: %{version}",
              "Release: %{release}",
          ]
      )
  
      # XXX yuck! this filename is available from the "sdist" command,
      # but only after it has run: and we create the spec file before
      # running "sdist", in case of --spec-only.
      if self.use_bzip2:
          spec_file.append(
              "Source0: %{name}-%{unmangled_version}.tar.bz2"
          )
      else:
          spec_file.append(
              "Source0: %{name}-%{unmangled_version}.tar.gz"
          )
  
      spec_file.extend(
          [
              "License: " + self.distribution.get_license(),
              "Group: " + self.group,
              "BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot",
              "Prefix: %{_prefix}",
          ]
      )
  
      if not self.force_arch:
          # noarch if no extension modules
          if not self.distribution.has_ext_modules():
              spec_file.append("BuildArch: noarch")
      else:
          spec_file.append("BuildArch: %s" % self.force_arch)
  
      for field in (
          "Vendor",
          "Packager",
          "Provides",
          "Requires",
          "Conflicts",
          "Obsoletes",
      ):
          val = getattr(self, field.lower())
          if isinstance(val, list):
              spec_file.append("%s: %s" % (field, " ".join(val)))
          elif val is not None:
              spec_file.append("%s: %s" % (field, val))
  
      if self.distribution.get_url() != "UNKNOWN":
          spec_file.append("Url: " + self.distribution.get_url())
  
      if self.distribution_name:
          spec_file.append("Distribution: " + self.distribution_name)
  
      if self.build_requires:
          spec_file.append(
              "BuildRequires: " + " ".join(self.build_requires)
          )
  
      if self.icon:
          spec_file.append("Icon: " + os.path.basename(self.icon))
  
      if self.no_autoreq:
          spec_file.append("AutoReq: 0")
  
      spec_file.extend(
          ["", "%description", self.distribution.get_long_description()]
      )
  
      # put locale descriptions into spec file
      # XXX again, suppressed because config file syntax doesn't
      # easily support this ;-(
      # for locale in self.descriptions.keys():
      #    spec_file.extend([
      #        '',
      #        '%description -l ' + locale,
      #        self.descriptions[locale],
      #        ])
  
      # rpm scripts
      # figure out default build script
      def_setup_call = "%s %s" % (
          self.python,
          os.path.basename(sys.argv[0]),
      )
      def_build = "%s build" % def_setup_call
      if self.use_rpm_opt_flags:
          def_build = 'env CFLAGS="$RPM_OPT_FLAGS" ' + def_build
  
      # insert contents of files
  
      # XXX this is kind of misleading: user-supplied options are files
      # that we open and interpolate into the spec file, but the defaults
      # are just text that we drop in as-is.  Hmmm.
  
      install_cmd = (
          "%s install -O1 --root=$RPM_BUILD_ROOT "
          "--record=INSTALLED_FILES"
      ) % def_setup_call
  
      script_options = [
          (
              "prep",
              "prep_script",
              "%setup -n %{name}-%{unmangled_version}",
          ),
          ("build", "build_script", def_build),
          ("install", "install_script", install_cmd),
          ("clean", "clean_script", "rm -rf $RPM_BUILD_ROOT"),
          ("verifyscript", "verify_script", None),
          ("pre", "pre_install", None),
          ("post", "post_install", None),
          ("preun", "pre_uninstall", None),
          ("postun", "post_uninstall", None),
      ]
  
      for rpm_opt, attr, default in script_options:
          # Insert contents of file referred to, if no file is referred to
          # use 'default' as contents of script
          val = getattr(self, attr)
          if val or default:
              spec_file.extend(
                  [
                      "",
                      "%" + rpm_opt,
                  ]
              )
              if val:
                  with open(val) as f:
                      spec_file.extend(f.read().split("\n"))
              else:
                  spec_file.append(default)
  
      # files section
      spec_file.extend(
          [
              "",
              "%files -f INSTALLED_FILES",
              "%defattr(-,root,root)",
          ]
      )
  
      if self.doc_files:
          spec_file.append("%doc " + " ".join(self.doc_files))
  
      if self.changelog:
          spec_file.extend(
              [
                  "",
                  "%changelog",
              ]
          )
          spec_file.extend(self.changelog)
  
      return spec_file
  
file_path: catboost/contrib/tools/python3/src/Lib/distutils/command/bdist_rpm.py
imports: import subprocess, sys, os
  from distutils.core import Command
  from distutils.debug import DEBUG
  from distutils.file_util import write_file
  from distutils.errors import *
  from distutils.sysconfig import get_python_version
  from distutils import log
label_desc: Use image node_id 6 for calling the bdist_rpm obj's underlying member method code with example usage: obj._make_spec_file() and returns: spec_file