Commit 0aee51d1 authored by Tarek Ziadé's avatar Tarek Ziadé

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
........
parent f2378909
......@@ -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):
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment