mirror of https://github.com/python/cpython
Merged revisions 70910 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r70910 | tarek.ziade | 2009-03-31 17:27:23 -0500 (Tue, 31 Mar 2009) | 1 line #5583 Added optional Extensions in Distutils ........
This commit is contained in:
parent
a931404804
commit
b2e36f1df7
|
@ -334,6 +334,10 @@ Other options
|
|||
|
||||
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.
|
||||
|
|
|
@ -455,7 +455,13 @@ class build_ext(Command):
|
|||
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
|
||||
|
|
|
@ -82,6 +82,9 @@ class Extension:
|
|||
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 @@ class Extension:
|
|||
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 @@ class Extension:
|
|||
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):
|
||||
|
|
|
@ -8,6 +8,9 @@ from distutils.core import Extension, Distribution
|
|||
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 @@ def _get_source_filename():
|
|||
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 @@ class BuildExtTestCase(TempdirManager, unittest.TestCase):
|
|||
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):
|
||||
|
|
Loading…
Reference in New Issue