mirror of
https://github.com/python/cpython.git
synced 2025-08-22 01:35:16 +00:00
#5583 Added optional Extensions in Distutils
This commit is contained in:
parent
42f9b4e5b4
commit
9e47ce49a0
5 changed files with 40 additions and 2 deletions
|
@ -334,6 +334,10 @@ Other options
|
||||||
|
|
||||||
There are still some other options which can be used to handle special cases.
|
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
|
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
|
linker. These files must not have extensions, as the default extension for the
|
||||||
compiler is used.
|
compiler is used.
|
||||||
|
|
|
@ -476,7 +476,13 @@ class build_ext (Command):
|
||||||
self.check_extensions_list(self.extensions)
|
self.check_extensions_list(self.extensions)
|
||||||
|
|
||||||
for ext in self.extensions:
|
for ext in self.extensions:
|
||||||
self.build_extension(ext)
|
try:
|
||||||
|
self.build_extension(ext)
|
||||||
|
except (CCompilerError, DistutilsError), e:
|
||||||
|
if not ext.optional:
|
||||||
|
raise
|
||||||
|
self.warn('building extension "%s" failed: %s' %
|
||||||
|
(ext.name, e))
|
||||||
|
|
||||||
def build_extension(self, ext):
|
def build_extension(self, ext):
|
||||||
sources = ext.sources
|
sources = ext.sources
|
||||||
|
|
|
@ -83,6 +83,9 @@ class Extension:
|
||||||
language : string
|
language : string
|
||||||
extension language (i.e. "c", "c++", "objc"). Will be detected
|
extension language (i.e. "c", "c++", "objc"). Will be detected
|
||||||
from the source extensions if not provided.
|
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
|
# When adding arguments to this constructor, be sure to update
|
||||||
|
@ -101,6 +104,7 @@ class Extension:
|
||||||
swig_opts = None,
|
swig_opts = None,
|
||||||
depends=None,
|
depends=None,
|
||||||
language=None,
|
language=None,
|
||||||
|
optional=None,
|
||||||
**kw # To catch unknown keywords
|
**kw # To catch unknown keywords
|
||||||
):
|
):
|
||||||
assert type(name) is StringType, "'name' must be a string"
|
assert type(name) is StringType, "'name' must be a string"
|
||||||
|
@ -123,6 +127,7 @@ class Extension:
|
||||||
self.swig_opts = swig_opts or []
|
self.swig_opts = swig_opts or []
|
||||||
self.depends = depends or []
|
self.depends = depends or []
|
||||||
self.language = language
|
self.language = language
|
||||||
|
self.optional = optional
|
||||||
|
|
||||||
# If there are unknown keyword options, warn about them
|
# If there are unknown keyword options, warn about them
|
||||||
if len(kw):
|
if len(kw):
|
||||||
|
|
|
@ -8,6 +8,8 @@ from distutils.core import Extension, Distribution
|
||||||
from distutils.command.build_ext import build_ext
|
from distutils.command.build_ext import build_ext
|
||||||
from distutils import sysconfig
|
from distutils import sysconfig
|
||||||
from distutils.tests import support
|
from distutils.tests import support
|
||||||
|
from distutils.extension import Extension
|
||||||
|
from distutils.errors import UnknownFileError
|
||||||
|
|
||||||
import unittest
|
import unittest
|
||||||
from test import test_support
|
from test import test_support
|
||||||
|
@ -20,7 +22,9 @@ def _get_source_filename():
|
||||||
srcdir = sysconfig.get_config_var('srcdir')
|
srcdir = sysconfig.get_config_var('srcdir')
|
||||||
return os.path.join(srcdir, 'Modules', 'xxmodule.c')
|
return os.path.join(srcdir, 'Modules', 'xxmodule.c')
|
||||||
|
|
||||||
class BuildExtTestCase(support.TempdirManager, unittest.TestCase):
|
class BuildExtTestCase(support.TempdirManager,
|
||||||
|
support.LoggingSilencer,
|
||||||
|
unittest.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
# Create a simple test environment
|
# Create a simple test environment
|
||||||
# Note that we're making changes to sys.path
|
# Note that we're making changes to sys.path
|
||||||
|
@ -142,6 +146,22 @@ class BuildExtTestCase(support.TempdirManager, unittest.TestCase):
|
||||||
self.assert_(lib in cmd.library_dirs)
|
self.assert_(lib in cmd.library_dirs)
|
||||||
self.assert_(incl in cmd.include_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():
|
def test_suite():
|
||||||
src = _get_source_filename()
|
src = _get_source_filename()
|
||||||
if not os.path.exists(src):
|
if not os.path.exists(src):
|
||||||
|
|
|
@ -199,6 +199,9 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #5583: Added optional Extensions in Distutils. Initial patch by Georg
|
||||||
|
Brandl.
|
||||||
|
|
||||||
- Issue #5619: Multiprocessing children disobey the debug flag and causes
|
- Issue #5619: Multiprocessing children disobey the debug flag and causes
|
||||||
popups on windows buildbots. Patch applied to work around this issue.
|
popups on windows buildbots. Patch applied to work around this issue.
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue