home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / lib / python2.6 / distutils / command / bdist_rpm.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-04-20  |  17.0 KB  |  415 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. """distutils.command.bdist_rpm
  5.  
  6. Implements the Distutils 'bdist_rpm' command (create RPM source and binary
  7. distributions)."""
  8. __revision__ = '$Id: bdist_rpm.py 61000 2008-02-23 17:40:11Z christian.heimes $'
  9. import sys
  10. import os
  11. import string
  12. from types import *
  13. from distutils.core import Command
  14. from distutils.debug import DEBUG
  15. from distutils.util import get_platform
  16. from distutils.file_util import write_file
  17. from distutils.errors import *
  18. from distutils.sysconfig import get_python_version
  19. from distutils import log
  20.  
  21. class bdist_rpm(Command):
  22.     description = 'create an RPM distribution'
  23.     user_options = [
  24.         ('bdist-base=', None, 'base directory for creating built distributions'),
  25.         ('rpm-base=', None, 'base directory for creating RPMs (defaults to "rpm" under --bdist-base; must be specified for RPM 2)'),
  26.         ('dist-dir=', 'd', 'directory to put final RPM files in (and .spec files if --spec-only)'),
  27.         ('python=', None, 'path to Python interpreter to hard-code in the .spec file (default: "python")'),
  28.         ('fix-python', None, 'hard-code the exact path to the current Python interpreter in the .spec file'),
  29.         ('spec-only', None, 'only regenerate spec file'),
  30.         ('source-only', None, 'only generate source RPM'),
  31.         ('binary-only', None, 'only generate binary RPM'),
  32.         ('use-bzip2', None, 'use bzip2 instead of gzip to create source distribution'),
  33.         ('distribution-name=', None, 'name of the (Linux) distribution to which this RPM applies (*not* the name of the module distribution!)'),
  34.         ('group=', None, 'package classification [default: "Development/Libraries"]'),
  35.         ('release=', None, 'RPM release number'),
  36.         ('serial=', None, 'RPM serial number'),
  37.         ('vendor=', None, 'RPM "vendor" (eg. "Joe Blow <joe@example.com>") [default: maintainer or author from setup script]'),
  38.         ('packager=', None, 'RPM packager (eg. "Jane Doe <jane@example.net>")[default: vendor]'),
  39.         ('doc-files=', None, 'list of documentation files (space or comma-separated)'),
  40.         ('changelog=', None, 'RPM changelog'),
  41.         ('icon=', None, 'name of icon file'),
  42.         ('provides=', None, 'capabilities provided by this package'),
  43.         ('requires=', None, 'capabilities required by this package'),
  44.         ('conflicts=', None, 'capabilities which conflict with this package'),
  45.         ('build-requires=', None, 'capabilities required to build this package'),
  46.         ('obsoletes=', None, 'capabilities made obsolete by this package'),
  47.         ('no-autoreq', None, 'do not automatically calculate dependencies'),
  48.         ('keep-temp', 'k', "don't clean up RPM build directory"),
  49.         ('no-keep-temp', None, 'clean up RPM build directory [default]'),
  50.         ('use-rpm-opt-flags', None, 'compile with RPM_OPT_FLAGS when building from source RPM'),
  51.         ('no-rpm-opt-flags', None, 'do not pass any RPM CFLAGS to compiler'),
  52.         ('rpm3-mode', None, 'RPM 3 compatibility mode (default)'),
  53.         ('rpm2-mode', None, 'RPM 2 compatibility mode'),
  54.         ('prep-script=', None, 'Specify a script for the PREP phase of RPM building'),
  55.         ('build-script=', None, 'Specify a script for the BUILD phase of RPM building'),
  56.         ('pre-install=', None, 'Specify a script for the pre-INSTALL phase of RPM building'),
  57.         ('install-script=', None, 'Specify a script for the INSTALL phase of RPM building'),
  58.         ('post-install=', None, 'Specify a script for the post-INSTALL phase of RPM building'),
  59.         ('pre-uninstall=', None, 'Specify a script for the pre-UNINSTALL phase of RPM building'),
  60.         ('post-uninstall=', None, 'Specify a script for the post-UNINSTALL phase of RPM building'),
  61.         ('clean-script=', None, 'Specify a script for the CLEAN phase of RPM building'),
  62.         ('verify-script=', None, 'Specify a script for the VERIFY phase of the RPM build'),
  63.         ('force-arch=', None, 'Force an architecture onto the RPM build process')]
  64.     boolean_options = [
  65.         'keep-temp',
  66.         'use-rpm-opt-flags',
  67.         'rpm3-mode',
  68.         'no-autoreq']
  69.     negative_opt = {
  70.         'no-keep-temp': 'keep-temp',
  71.         'no-rpm-opt-flags': 'use-rpm-opt-flags',
  72.         'rpm2-mode': 'rpm3-mode' }
  73.     
  74.     def initialize_options(self):
  75.         self.bdist_base = None
  76.         self.rpm_base = None
  77.         self.dist_dir = None
  78.         self.python = None
  79.         self.fix_python = None
  80.         self.spec_only = None
  81.         self.binary_only = None
  82.         self.source_only = None
  83.         self.use_bzip2 = None
  84.         self.distribution_name = None
  85.         self.group = None
  86.         self.release = None
  87.         self.serial = None
  88.         self.vendor = None
  89.         self.packager = None
  90.         self.doc_files = None
  91.         self.changelog = None
  92.         self.icon = None
  93.         self.prep_script = None
  94.         self.build_script = None
  95.         self.install_script = None
  96.         self.clean_script = None
  97.         self.verify_script = None
  98.         self.pre_install = None
  99.         self.post_install = None
  100.         self.pre_uninstall = None
  101.         self.post_uninstall = None
  102.         self.prep = None
  103.         self.provides = None
  104.         self.requires = None
  105.         self.conflicts = None
  106.         self.build_requires = None
  107.         self.obsoletes = None
  108.         self.keep_temp = 0
  109.         self.use_rpm_opt_flags = 1
  110.         self.rpm3_mode = 1
  111.         self.no_autoreq = 0
  112.         self.force_arch = None
  113.  
  114.     
  115.     def finalize_options(self):
  116.         self.set_undefined_options('bdist', ('bdist_base', 'bdist_base'))
  117.         if self.rpm_base is None:
  118.             if not self.rpm3_mode:
  119.                 raise DistutilsOptionError, 'you must specify --rpm-base in RPM 2 mode'
  120.             self.rpm3_mode
  121.             self.rpm_base = os.path.join(self.bdist_base, 'rpm')
  122.         
  123.         if self.python is None:
  124.             if self.fix_python:
  125.                 self.python = sys.executable
  126.             else:
  127.                 self.python = 'python'
  128.         elif self.fix_python:
  129.             raise DistutilsOptionError, '--python and --fix-python are mutually exclusive options'
  130.         
  131.         if os.name != 'posix':
  132.             raise DistutilsPlatformError, "don't know how to create RPM distributions on platform %s" % os.name
  133.         os.name != 'posix'
  134.         if self.binary_only and self.source_only:
  135.             raise DistutilsOptionError, "cannot supply both '--source-only' and '--binary-only'"
  136.         self.source_only
  137.         if not self.distribution.has_ext_modules():
  138.             self.use_rpm_opt_flags = 0
  139.         
  140.         self.set_undefined_options('bdist', ('dist_dir', 'dist_dir'))
  141.         self.finalize_package_data()
  142.  
  143.     
  144.     def finalize_package_data(self):
  145.         self.ensure_string('group', 'Development/Libraries')
  146.         self.ensure_string('vendor', '%s <%s>' % (self.distribution.get_contact(), self.distribution.get_contact_email()))
  147.         self.ensure_string('packager')
  148.         self.ensure_string_list('doc_files')
  149.         if type(self.doc_files) is ListType:
  150.             for readme in ('README', 'README.txt'):
  151.                 if os.path.exists(readme) and readme not in self.doc_files:
  152.                     self.doc_files.append(readme)
  153.                     continue
  154.             
  155.         
  156.         self.ensure_string('release', '1')
  157.         self.ensure_string('serial')
  158.         self.ensure_string('distribution_name')
  159.         self.ensure_string('changelog')
  160.         self.changelog = self._format_changelog(self.changelog)
  161.         self.ensure_filename('icon')
  162.         self.ensure_filename('prep_script')
  163.         self.ensure_filename('build_script')
  164.         self.ensure_filename('install_script')
  165.         self.ensure_filename('clean_script')
  166.         self.ensure_filename('verify_script')
  167.         self.ensure_filename('pre_install')
  168.         self.ensure_filename('post_install')
  169.         self.ensure_filename('pre_uninstall')
  170.         self.ensure_filename('post_uninstall')
  171.         self.ensure_string_list('provides')
  172.         self.ensure_string_list('requires')
  173.         self.ensure_string_list('conflicts')
  174.         self.ensure_string_list('build_requires')
  175.         self.ensure_string_list('obsoletes')
  176.         self.ensure_string('force_arch')
  177.  
  178.     
  179.     def run(self):
  180.         if DEBUG:
  181.             print 'before _get_package_data():'
  182.             print 'vendor =', self.vendor
  183.             print 'packager =', self.packager
  184.             print 'doc_files =', self.doc_files
  185.             print 'changelog =', self.changelog
  186.         
  187.         if self.spec_only:
  188.             spec_dir = self.dist_dir
  189.             self.mkpath(spec_dir)
  190.         else:
  191.             rpm_dir = { }
  192.             for d in ('SOURCES', 'SPECS', 'BUILD', 'RPMS', 'SRPMS'):
  193.                 rpm_dir[d] = os.path.join(self.rpm_base, d)
  194.                 self.mkpath(rpm_dir[d])
  195.             
  196.             spec_dir = rpm_dir['SPECS']
  197.         spec_path = os.path.join(spec_dir, '%s.spec' % self.distribution.get_name())
  198.         self.execute(write_file, (spec_path, self._make_spec_file()), "writing '%s'" % spec_path)
  199.         if self.spec_only:
  200.             return None
  201.         saved_dist_files = self.distribution.dist_files[:]
  202.         sdist = self.reinitialize_command('sdist')
  203.         if self.use_bzip2:
  204.             sdist.formats = [
  205.                 'bztar']
  206.         else:
  207.             sdist.formats = [
  208.                 'gztar']
  209.         self.run_command('sdist')
  210.         self.distribution.dist_files = saved_dist_files
  211.         source = sdist.get_archive_files()[0]
  212.         source_dir = rpm_dir['SOURCES']
  213.         self.copy_file(source, source_dir)
  214.         if self.icon:
  215.             if os.path.exists(self.icon):
  216.                 self.copy_file(self.icon, source_dir)
  217.             else:
  218.                 raise DistutilsFileError, "icon file '%s' does not exist" % self.icon
  219.         os.path.exists(self.icon)
  220.         log.info('building RPMs')
  221.         rpm_cmd = [
  222.             'rpm']
  223.         if os.path.exists('/usr/bin/rpmbuild') or os.path.exists('/bin/rpmbuild'):
  224.             rpm_cmd = [
  225.                 'rpmbuild']
  226.         
  227.         if self.source_only:
  228.             rpm_cmd.append('-bs')
  229.         elif self.binary_only:
  230.             rpm_cmd.append('-bb')
  231.         else:
  232.             rpm_cmd.append('-ba')
  233.         if self.rpm3_mode:
  234.             rpm_cmd.extend([
  235.                 '--define',
  236.                 '_topdir %s' % os.path.abspath(self.rpm_base)])
  237.         
  238.         if not self.keep_temp:
  239.             rpm_cmd.append('--clean')
  240.         
  241.         rpm_cmd.append(spec_path)
  242.         nvr_string = '%{name}-%{version}-%{release}'
  243.         src_rpm = nvr_string + '.src.rpm'
  244.         non_src_rpm = '%{arch}/' + nvr_string + '.%{arch}.rpm'
  245.         q_cmd = "rpm -q --qf '%s %s\\n' --specfile '%s'" % (src_rpm, non_src_rpm, spec_path)
  246.         out = os.popen(q_cmd)
  247.         binary_rpms = []
  248.         source_rpm = None
  249.         while None:
  250.             line = out.readline()
  251.             if not line:
  252.                 break
  253.             
  254.             l = string.split(string.strip(line))
  255.             if not len(l) == 2:
  256.                 raise AssertionError
  257.             if source_rpm is None:
  258.                 source_rpm = l[0]
  259.                 continue
  260.             len(l) == 2
  261.             continue
  262.             status = out.close()
  263.             if status:
  264.                 raise DistutilsExecError('Failed to execute: %s' % repr(q_cmd))
  265.             status
  266.             self.spawn(rpm_cmd)
  267.             if not self.dry_run:
  268.                 if not self.binary_only:
  269.                     srpm = os.path.join(rpm_dir['SRPMS'], source_rpm)
  270.                     if not os.path.exists(srpm):
  271.                         raise AssertionError
  272.                     self.move_file(srpm, self.dist_dir)
  273.                 
  274.                 if not self.source_only:
  275.                     for rpm in binary_rpms:
  276.                         rpm = os.path.join(rpm_dir['RPMS'], rpm)
  277.                         if os.path.exists(rpm):
  278.                             self.move_file(rpm, self.dist_dir)
  279.                             continue
  280.                     
  281.                 
  282.             
  283.  
  284.     
  285.     def _dist_path(self, path):
  286.         return os.path.join(self.dist_dir, os.path.basename(path))
  287.  
  288.     
  289.     def _make_spec_file(self):
  290.         '''Generate the text of an RPM spec file and return it as a
  291.         list of strings (one per line).
  292.         '''
  293.         spec_file = [
  294.             '%define name ' + self.distribution.get_name(),
  295.             '%define version ' + self.distribution.get_version().replace('-', '_'),
  296.             '%define unmangled_version ' + self.distribution.get_version(),
  297.             '%define release ' + self.release.replace('-', '_'),
  298.             '',
  299.             'Summary: ' + self.distribution.get_description()]
  300.         spec_file.extend([
  301.             'Name: %{name}',
  302.             'Version: %{version}',
  303.             'Release: %{release}'])
  304.         if self.use_bzip2:
  305.             spec_file.append('Source0: %{name}-%{unmangled_version}.tar.bz2')
  306.         else:
  307.             spec_file.append('Source0: %{name}-%{unmangled_version}.tar.gz')
  308.         spec_file.extend([
  309.             'License: ' + self.distribution.get_license(),
  310.             'Group: ' + self.group,
  311.             'BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot',
  312.             'Prefix: %{_prefix}'])
  313.         if not self.force_arch:
  314.             if not self.distribution.has_ext_modules():
  315.                 spec_file.append('BuildArch: noarch')
  316.             
  317.         else:
  318.             spec_file.append('BuildArch: %s' % self.force_arch)
  319.         for field in ('Vendor', 'Packager', 'Provides', 'Requires', 'Conflicts', 'Obsoletes'):
  320.             val = getattr(self, string.lower(field))
  321.             if type(val) is ListType:
  322.                 spec_file.append('%s: %s' % (field, string.join(val)))
  323.                 continue
  324.             if val is not None:
  325.                 spec_file.append('%s: %s' % (field, val))
  326.                 continue
  327.         
  328.         if self.distribution.get_url() != 'UNKNOWN':
  329.             spec_file.append('Url: ' + self.distribution.get_url())
  330.         
  331.         if self.distribution_name:
  332.             spec_file.append('Distribution: ' + self.distribution_name)
  333.         
  334.         if self.build_requires:
  335.             spec_file.append('BuildRequires: ' + string.join(self.build_requires))
  336.         
  337.         if self.icon:
  338.             spec_file.append('Icon: ' + os.path.basename(self.icon))
  339.         
  340.         if self.no_autoreq:
  341.             spec_file.append('AutoReq: 0')
  342.         
  343.         spec_file.extend([
  344.             '',
  345.             '%description',
  346.             self.distribution.get_long_description()])
  347.         def_setup_call = '%s %s' % (self.python, os.path.basename(sys.argv[0]))
  348.         def_build = '%s build' % def_setup_call
  349.         if self.use_rpm_opt_flags:
  350.             def_build = 'env CFLAGS="$RPM_OPT_FLAGS" ' + def_build
  351.         
  352.         script_options = [
  353.             ('prep', 'prep_script', '%setup -n %{name}-%{unmangled_version}'),
  354.             ('build', 'build_script', def_build),
  355.             ('install', 'install_script', '%s install --root=$RPM_BUILD_ROOT --record=INSTALLED_FILES' % def_setup_call),
  356.             ('clean', 'clean_script', 'rm -rf $RPM_BUILD_ROOT'),
  357.             ('verifyscript', 'verify_script', None),
  358.             ('pre', 'pre_install', None),
  359.             ('post', 'post_install', None),
  360.             ('preun', 'pre_uninstall', None),
  361.             ('postun', 'post_uninstall', None)]
  362.         for rpm_opt, attr, default in script_options:
  363.             val = getattr(self, attr)
  364.             if val or default:
  365.                 spec_file.extend([
  366.                     '',
  367.                     '%' + rpm_opt])
  368.                 if val:
  369.                     spec_file.extend(string.split(open(val, 'r').read(), '\n'))
  370.                 else:
  371.                     spec_file.append(default)
  372.             val
  373.         
  374.         spec_file.extend([
  375.             '',
  376.             '%files -f INSTALLED_FILES',
  377.             '%defattr(-,root,root)'])
  378.         if self.doc_files:
  379.             spec_file.append('%doc ' + string.join(self.doc_files))
  380.         
  381.         if self.changelog:
  382.             spec_file.extend([
  383.                 '',
  384.                 '%changelog'])
  385.             spec_file.extend(self.changelog)
  386.         
  387.         return spec_file
  388.  
  389.     
  390.     def _format_changelog(self, changelog):
  391.         '''Format the changelog correctly and convert it to a list of strings
  392.         '''
  393.         if not changelog:
  394.             return changelog
  395.         new_changelog = []
  396.         for line in string.split(string.strip(changelog), '\n'):
  397.             line = string.strip(line)
  398.             if line[0] == '*':
  399.                 new_changelog.extend([
  400.                     '',
  401.                     line])
  402.                 continue
  403.             changelog
  404.             if line[0] == '-':
  405.                 new_changelog.append(line)
  406.                 continue
  407.             new_changelog.append('  ' + line)
  408.         
  409.         if not new_changelog[0]:
  410.             del new_changelog[0]
  411.         
  412.         return new_changelog
  413.  
  414.  
  415.