Issues #1533164 and #5378: Added quiet and force-optimize options to Distutils bdist_rpm command

This commit is contained in:
Tarek Ziadé 2009-02-28 10:08:02 +00:00
parent 5c189b16a8
commit 7334735ee1
3 changed files with 184 additions and 6 deletions

View File

@ -123,10 +123,21 @@ class bdist_rpm (Command):
# Allow a packager to explicitly force an architecture
('force-arch=', None,
"Force an architecture onto the RPM build process"),
]
('quiet', 'q',
"Run the INSTALL phase of RPM building in quiet mode"),
# Forces the -O1 option when calling the install command,
# so the rpm contains all files needed for proper operation under
# SELinux. Some systems checks for this on build-time and will
# fail without this.
('force-optimize', None,
"Forces the -O1 option when calling the install command"),
]
boolean_options = ['keep-temp', 'use-rpm-opt-flags', 'rpm3-mode',
'no-autoreq']
'no-autoreq', 'quiet', 'force-optimize']
negative_opt = {'no-keep-temp': 'keep-temp',
'no-rpm-opt-flags': 'use-rpm-opt-flags',
@ -176,6 +187,8 @@ class bdist_rpm (Command):
self.no_autoreq = 0
self.force_arch = None
self.quiet = 0
self.force_optimize = 1
# initialize_options()
@ -322,6 +335,7 @@ class bdist_rpm (Command):
if os.path.exists('/usr/bin/rpmbuild') or \
os.path.exists('/bin/rpmbuild'):
rpm_cmd = ['rpmbuild']
if self.source_only: # what kind of RPMs?
rpm_cmd.append('-bs')
elif self.binary_only:
@ -333,6 +347,10 @@ class bdist_rpm (Command):
'_topdir %s' % os.path.abspath(self.rpm_base)])
if not self.keep_temp:
rpm_cmd.append('--clean')
if self.quiet:
rpm_cmd.append('--quiet')
rpm_cmd.append(spec_path)
# Determine the binary rpm names that should be built out of this spec
# file
@ -486,13 +504,19 @@ class bdist_rpm (Command):
# that we open and interpolate into the spec file, but the defaults
# are just text that we drop in as-is. Hmmm.
# forcing -O1 if force-optimize
if self.force_optimize:
optimize = ' -O1'
else:
optimize = ''
install_cmd = ('%s install%s --root=$RPM_BUILD_ROOT '
'--record=INSTALLED_FILES') % (def_setup_call, optimize)
script_options = [
('prep', 'prep_script', "%setup -n %{name}-%{unmangled_version}"),
('build', 'build_script', def_build),
('install', 'install_script',
("%s install "
"--root=$RPM_BUILD_ROOT "
"--record=INSTALLED_FILES") % def_setup_call),
('install', 'install_script', install_cmd),
('clean', 'clean_script', "rm -rf $RPM_BUILD_ROOT"),
('verifyscript', 'verify_script', None),
('pre', 'pre_install', None),

View File

@ -0,0 +1,149 @@
"""Tests for distutils.command.bdist_rpm."""
import unittest
import sys
import os
import tempfile
import shutil
from distutils.core import Distribution
from distutils.command.bdist_rpm import bdist_rpm
from distutils.tests import support
from distutils.spawn import find_executable
from distutils import spawn
from distutils.errors import DistutilsExecError
SETUP_PY = """\
from distutils.core import setup
import foo
setup(name='foo', version='0.1', py_modules=['foo'],
url='xxx', author='xxx', author_email='xxx')
"""
class BuildRpmTestCase(support.TempdirManager,
support.LoggingSilencer,
unittest.TestCase):
def setUp(self):
super(BuildRpmTestCase, self).setUp()
self.old_location = os.getcwd()
self.old_sys_argv = sys.argv[:]
def tearDown(self):
os.chdir(self.old_location)
sys.argv = self.old_sys_argv[:]
super(BuildRpmTestCase, self).tearDown()
def test_quiet(self):
# XXX I am unable yet to make this test work without
# spurious sdtout/stderr output under Mac OS X
if sys.platform != 'linux2':
return
# this test will run only if the rpm commands are found
if (find_executable('rpm') is None or
find_executable('rpmbuild') is None):
return
# let's create a package
tmp_dir = self.mkdtemp()
pkg_dir = os.path.join(tmp_dir, 'foo')
os.mkdir(pkg_dir)
self.write_file((pkg_dir, 'setup.py'), SETUP_PY)
self.write_file((pkg_dir, 'foo.py'), '#')
self.write_file((pkg_dir, 'MANIFEST.in'), 'include foo.py')
self.write_file((pkg_dir, 'README'), '')
dist = Distribution({'name': 'foo', 'version': '0.1',
'py_modules': ['foo'],
'url': 'xxx', 'author': 'xxx',
'author_email': 'xxx'})
dist.script_name = 'setup.py'
os.chdir(pkg_dir)
sys.argv = ['setup.py']
cmd = bdist_rpm(dist)
cmd.fix_python = True
# running in quiet mode
cmd.quiet = 1
cmd.ensure_finalized()
cmd.run()
dist_created = os.listdir(os.path.join(pkg_dir, 'dist'))
self.assert_('foo-0.1-1.noarch.rpm' in dist_created)
def test_no_optimize_flag(self):
# XXX I am unable yet to make this test work without
# spurious sdtout/stderr output under Mac OS X
if sys.platform != 'linux2':
return
# http://bugs.python.org/issue1533164
# this test will run only if the rpm command is found
if (find_executable('rpm') is None or
find_executable('rpmbuild') is None):
return
# let's create a package that brakes bdist_rpm
tmp_dir = self.mkdtemp()
pkg_dir = os.path.join(tmp_dir, 'foo')
os.mkdir(pkg_dir)
self.write_file((pkg_dir, 'setup.py'), SETUP_PY)
self.write_file((pkg_dir, 'foo.py'), '#')
self.write_file((pkg_dir, 'MANIFEST.in'), 'include foo.py')
self.write_file((pkg_dir, 'README'), '')
dist = Distribution({'name': 'foo', 'version': '0.1',
'py_modules': ['foo'],
'url': 'xxx', 'author': 'xxx',
'author_email': 'xxx'})
dist.script_name = 'setup.py'
os.chdir(pkg_dir)
sys.argv = ['setup.py']
cmd = bdist_rpm(dist)
cmd.fix_python = True
# running with force-optimize = 1
# and quiet = 1
cmd.quiet = 1
cmd.ensure_finalized()
cmd.run()
dist_created = os.listdir(os.path.join(pkg_dir, 'dist'))
self.assert_('foo-0.1-1.noarch.rpm' in dist_created)
os.remove(os.path.join(pkg_dir, 'dist', 'foo-0.1-1.noarch.rpm'))
# XXX I am unable yet to make this test work without
# spurious stderr output
# so returning until distutils.spawn acts better
return
# running with force-optimize = 0
cmd.force_optimize = 0
try:
# XXX How to prevent the spawned
# rpmbuild command to display errors ?
# this can be a problem for buildbots
cmd.ensure_finalized()
cmd.run()
except DistutilsExecError:
# happens only under Fedora/RedHat
# and some flavors of Linux
# otherwise it's a bug
if sys.platform == 'linux2':
return
dist_created = os.listdir(os.path.join(pkg_dir, 'dist'))
self.assert_('foo-0.1-1.noarch.rpm' in dist_created)
def test_suite():
return unittest.makeSuite(BuildRpmTestCase)
if __name__ == '__main__':
test_support.run_unittest(test_suite())

View File

@ -166,6 +166,11 @@ Core and Builtins
Library
-------
- Issue #1533164: Installed but not listed *.pyo was breaking Distutils
bdist_rpm command.
- Issue #5378: added --quiet option to Distutils bdist_rpm command.
- Issue #5052: make Distutils compatible with 2.3 again.
- Deprecated methods of symtable.Symbol have been removed: is_keywordarg(),