[Python-checkins] r70914 - in python/branches/py3k: Doc/distutils/setupscript.rst Lib/distutils/command/build_ext.py Lib/distutils/extension.py Lib/distutils/tests/test_build_ext.py Misc/NEWS

tarek.ziade python-checkins at python.org
Wed Apr 1 00:37:55 CEST 2009


Author: tarek.ziade
Date: Wed Apr 1 00:37:55 2009
New Revision: 70914
Log:
Merged revisions 70910 via svnmerge from 
svn+ssh://pythondev@svn.python.org/python/trunk
........
 r70910 | tarek.ziade | 2009年03月31日 17:27:23 -0500 (2009年3月31日) | 1 line
 
 #5583 Added optional Extensions in Distutils
........
Modified:
 python/branches/py3k/ (props changed)
 python/branches/py3k/Doc/distutils/setupscript.rst
 python/branches/py3k/Lib/distutils/command/build_ext.py
 python/branches/py3k/Lib/distutils/extension.py
 python/branches/py3k/Lib/distutils/tests/test_build_ext.py
 python/branches/py3k/Misc/NEWS
Modified: python/branches/py3k/Doc/distutils/setupscript.rst
==============================================================================
--- python/branches/py3k/Doc/distutils/setupscript.rst	(original)
+++ python/branches/py3k/Doc/distutils/setupscript.rst	Wed Apr 1 00:37:55 2009
@@ -334,6 +334,10 @@
 
 There are still some other options which can be used to handle special cases.
 
+The :option:`optional` option is a boolean; if it is true, that specifies that
+a build failure in the extension should not abort the build process, but simply
+not install the failing extension.
+
 The :option:`extra_objects` option is a list of object files to be passed to the
 linker. These files must not have extensions, as the default extension for the
 compiler is used.
Modified: python/branches/py3k/Lib/distutils/command/build_ext.py
==============================================================================
--- python/branches/py3k/Lib/distutils/command/build_ext.py	(original)
+++ python/branches/py3k/Lib/distutils/command/build_ext.py	Wed Apr 1 00:37:55 2009
@@ -455,7 +455,13 @@
 self.check_extensions_list(self.extensions)
 
 for ext in self.extensions:
- self.build_extension(ext)
+ try:
+ self.build_extension(ext)
+ except (CCompilerError, DistutilsError) as e:
+ if not ext.optional:
+ raise
+ self.warn('building extension "%s" failed: %s' %
+ (ext.name, e))
 
 def build_extension(self, ext):
 sources = ext.sources
Modified: python/branches/py3k/Lib/distutils/extension.py
==============================================================================
--- python/branches/py3k/Lib/distutils/extension.py	(original)
+++ python/branches/py3k/Lib/distutils/extension.py	Wed Apr 1 00:37:55 2009
@@ -82,6 +82,9 @@
 language : string
 extension language (i.e. "c", "c++", "objc"). Will be detected
 from the source extensions if not provided.
+ optional : boolean
+ specifies that a build failure in the extension should not abort the
+ build process, but simply not install the failing extension.
 """
 
 # When adding arguments to this constructor, be sure to update
@@ -100,6 +103,7 @@
 swig_opts = None,
 depends=None,
 language=None,
+ optional=None,
 **kw # To catch unknown keywords
 ):
 assert isinstance(name, str), "'name' must be a string"
@@ -122,6 +126,7 @@
 self.swig_opts = swig_opts or []
 self.depends = depends or []
 self.language = language
+ self.optional = optional
 
 # If there are unknown keyword options, warn about them
 if len(kw):
Modified: python/branches/py3k/Lib/distutils/tests/test_build_ext.py
==============================================================================
--- python/branches/py3k/Lib/distutils/tests/test_build_ext.py	(original)
+++ python/branches/py3k/Lib/distutils/tests/test_build_ext.py	Wed Apr 1 00:37:55 2009
@@ -8,6 +8,9 @@
 from distutils.command.build_ext import build_ext
 from distutils import sysconfig
 from distutils.tests.support import TempdirManager
+from distutils.tests.support import LoggingSilencer
+from distutils.extension import Extension
+from distutils.errors import UnknownFileError
 
 import unittest
 from test import support
@@ -20,7 +23,9 @@
 srcdir = sysconfig.get_config_var('srcdir')
 return os.path.join(srcdir, 'Modules', 'xxmodule.c')
 
-class BuildExtTestCase(TempdirManager, unittest.TestCase):
+class BuildExtTestCase(TempdirManager,
+ LoggingSilencer,
+ unittest.TestCase):
 def setUp(self):
 # Create a simple test environment
 # Note that we're making changes to sys.path
@@ -141,6 +146,22 @@
 self.assert_(lib in cmd.library_dirs)
 self.assert_(incl in cmd.include_dirs)
 
+ def test_optional_extension(self):
+
+ # this extension will fail, but let's ignore this failure
+ # with the optional argument.
+ modules = [Extension('foo', ['xxx'], optional=False)]
+ dist = Distribution({'name': 'xx', 'ext_modules': modules})
+ cmd = build_ext(dist)
+ cmd.ensure_finalized()
+ self.assertRaises(UnknownFileError, cmd.run) # should raise an error
+
+ modules = [Extension('foo', ['xxx'], optional=True)]
+ dist = Distribution({'name': 'xx', 'ext_modules': modules})
+ cmd = build_ext(dist)
+ cmd.ensure_finalized()
+ cmd.run() # should pass
+
 def test_suite():
 src = _get_source_filename()
 if not os.path.exists(src):
Modified: python/branches/py3k/Misc/NEWS
==============================================================================
--- python/branches/py3k/Misc/NEWS	(original)
+++ python/branches/py3k/Misc/NEWS	Wed Apr 1 00:37:55 2009
@@ -282,6 +282,9 @@
 Library
 -------
 
+- Issue #5583: Added optional Extensions in Distutils. Initial patch by Georg
+ Brandl.
+
 - Issue #1222: locale.format() bug when the thousands separator is a space
 character.
 


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /