Kaydet (Commit) 06fbee16 authored tarafından Tarek Ziadé's avatar Tarek Ziadé

Merged revisions 72531 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/trunk

........
  r72531 | tarek.ziade | 2009-05-10 12:12:08 +0200 (Sun, 10 May 2009) | 1 line

  fixed #5984 and improved test coverage
........
üst 54d9d078
...@@ -329,7 +329,7 @@ class build_ext(Command): ...@@ -329,7 +329,7 @@ class build_ext(Command):
self.compiler.set_include_dirs(self.include_dirs) self.compiler.set_include_dirs(self.include_dirs)
if self.define is not None: if self.define is not None:
# 'define' option is a list of (name,value) tuples # 'define' option is a list of (name,value) tuples
for (name,value) in self.define: for (name, value) in self.define:
self.compiler.define_macro(name, value) self.compiler.define_macro(name, value)
if self.undef is not None: if self.undef is not None:
for macro in self.undef: for macro in self.undef:
...@@ -365,22 +365,24 @@ class build_ext(Command): ...@@ -365,22 +365,24 @@ class build_ext(Command):
continue # OK! (assume type-checking done continue # OK! (assume type-checking done
# by Extension constructor) # by Extension constructor)
(ext_name, build_info) = ext if not isinstance(ext, tuple) or len(ext) != 2:
log.warn("old-style (ext_name, build_info) tuple found in "
"ext_modules for extension '%s'"
"-- please convert to Extension instance" % ext_name)
if not isinstance(ext, tuple) and len(ext) != 2:
raise DistutilsSetupError( raise DistutilsSetupError(
"each element of 'ext_modules' option must be an " "each element of 'ext_modules' option must be an "
"Extension instance or 2-tuple") "Extension instance or 2-tuple")
ext_name, build_info = ext
log.warn(("old-style (ext_name, build_info) tuple found in "
"ext_modules for extension '%s'"
"-- please convert to Extension instance" % ext_name))
if not (isinstance(ext_name, str) and if not (isinstance(ext_name, str) and
extension_name_re.match(ext_name)): extension_name_re.match(ext_name)):
raise DistutilsSetupError( raise DistutilsSetupError(
"first element of each tuple in 'ext_modules' " "first element of each tuple in 'ext_modules' "
"must be the extension name (a string)") "must be the extension name (a string)")
if not instance(build_info, DictionaryType): if not isinstance(build_info, dict):
raise DistutilsSetupError( raise DistutilsSetupError(
"second element of each tuple in 'ext_modules' " "second element of each tuple in 'ext_modules' "
"must be a dictionary (build info)") "must be a dictionary (build info)")
...@@ -391,11 +393,8 @@ class build_ext(Command): ...@@ -391,11 +393,8 @@ class build_ext(Command):
# Easy stuff: one-to-one mapping from dict elements to # Easy stuff: one-to-one mapping from dict elements to
# instance attributes. # instance attributes.
for key in ('include_dirs', for key in ('include_dirs', 'library_dirs', 'libraries',
'library_dirs', 'extra_objects', 'extra_compile_args',
'libraries',
'extra_objects',
'extra_compile_args',
'extra_link_args'): 'extra_link_args'):
val = build_info.get(key) val = build_info.get(key)
if val is not None: if val is not None:
......
...@@ -10,8 +10,8 @@ from distutils import sysconfig ...@@ -10,8 +10,8 @@ from distutils import sysconfig
from distutils.tests.support import TempdirManager from distutils.tests.support import TempdirManager
from distutils.tests.support import LoggingSilencer from distutils.tests.support import LoggingSilencer
from distutils.extension import Extension from distutils.extension import Extension
from distutils.errors import UnknownFileError from distutils.errors import (UnknownFileError, DistutilsSetupError,
from distutils.errors import CompileError CompileError)
import unittest import unittest
from test import support from test import support
...@@ -165,6 +165,130 @@ class BuildExtTestCase(TempdirManager, ...@@ -165,6 +165,130 @@ class BuildExtTestCase(TempdirManager,
cmd.ensure_finalized() cmd.ensure_finalized()
cmd.run() # should pass cmd.run() # should pass
def test_finalize_options(self):
# Make sure Python's include directories (for Python.h, pyconfig.h,
# etc.) are in the include search path.
modules = [Extension('foo', ['xxx'], optional=False)]
dist = Distribution({'name': 'xx', 'ext_modules': modules})
cmd = build_ext(dist)
cmd.finalize_options()
from distutils import sysconfig
py_include = sysconfig.get_python_inc()
self.assert_(py_include in cmd.include_dirs)
plat_py_include = sysconfig.get_python_inc(plat_specific=1)
self.assert_(plat_py_include in cmd.include_dirs)
# make sure cmd.libraries is turned into a list
# if it's a string
cmd = build_ext(dist)
cmd.libraries = 'my_lib'
cmd.finalize_options()
self.assertEquals(cmd.libraries, ['my_lib'])
# make sure cmd.library_dirs is turned into a list
# if it's a string
cmd = build_ext(dist)
cmd.library_dirs = 'my_lib_dir'
cmd.finalize_options()
self.assertEquals(cmd.library_dirs, ['my_lib_dir'])
# make sure rpath is turned into a list
# if it's a list of os.pathsep's paths
cmd = build_ext(dist)
cmd.rpath = os.pathsep.join(['one', 'two'])
cmd.finalize_options()
self.assertEquals(cmd.rpath, ['one', 'two'])
# XXX more tests to perform for win32
# make sure define is turned into 2-tuples
# strings if they are ','-separated strings
cmd = build_ext(dist)
cmd.define = 'one,two'
cmd.finalize_options()
self.assertEquals(cmd.define, [('one', '1'), ('two', '1')])
# make sure undef is turned into a list of
# strings if they are ','-separated strings
cmd = build_ext(dist)
cmd.undef = 'one,two'
cmd.finalize_options()
self.assertEquals(cmd.undef, ['one', 'two'])
# make sure swig_opts is turned into a list
cmd = build_ext(dist)
cmd.swig_opts = None
cmd.finalize_options()
self.assertEquals(cmd.swig_opts, [])
cmd = build_ext(dist)
cmd.swig_opts = '1 2'
cmd.finalize_options()
self.assertEquals(cmd.swig_opts, ['1', '2'])
def test_check_extensions_list(self):
dist = Distribution()
cmd = build_ext(dist)
cmd.finalize_options()
#'extensions' option must be a list of Extension instances
self.assertRaises(DistutilsSetupError, cmd.check_extensions_list, 'foo')
# each element of 'ext_modules' option must be an
# Extension instance or 2-tuple
exts = [('bar', 'foo', 'bar'), 'foo']
self.assertRaises(DistutilsSetupError, cmd.check_extensions_list, exts)
# first element of each tuple in 'ext_modules'
# must be the extension name (a string) and match
# a python dotted-separated name
exts = [('foo-bar', '')]
self.assertRaises(DistutilsSetupError, cmd.check_extensions_list, exts)
# second element of each tuple in 'ext_modules'
# must be a ary (build info)
exts = [('foo.bar', '')]
self.assertRaises(DistutilsSetupError, cmd.check_extensions_list, exts)
# ok this one should pass
exts = [('foo.bar', {'sources': [''], 'libraries': 'foo',
'some': 'bar'})]
cmd.check_extensions_list(exts)
ext = exts[0]
self.assert_(isinstance(ext, Extension))
# check_extensions_list adds in ext the values passed
# when they are in ('include_dirs', 'library_dirs', 'libraries'
# 'extra_objects', 'extra_compile_args', 'extra_link_args')
self.assertEquals(ext.libraries, 'foo')
self.assert_(not hasattr(ext, 'some'))
# 'macros' element of build info dict must be 1- or 2-tuple
exts = [('foo.bar', {'sources': [''], 'libraries': 'foo',
'some': 'bar', 'macros': [('1', '2', '3'), 'foo']})]
self.assertRaises(DistutilsSetupError, cmd.check_extensions_list, exts)
exts[0][1]['macros'] = [('1', '2'), ('3',)]
cmd.check_extensions_list(exts)
self.assertEquals(exts[0].undef_macros, ['3'])
self.assertEquals(exts[0].define_macros, [('1', '2')])
def test_get_source_files(self):
modules = [Extension('foo', ['xxx'], optional=False)]
dist = Distribution({'name': 'xx', 'ext_modules': modules})
cmd = build_ext(dist)
cmd.ensure_finalized()
self.assertEquals(cmd.get_source_files(), ['xxx'])
def test_get_outputs(self):
modules = [Extension('foo', ['xxx'], optional=False)]
dist = Distribution({'name': 'xx', 'ext_modules': modules})
cmd = build_ext(dist)
cmd.ensure_finalized()
self.assertEquals(len(cmd.get_outputs()), 1)
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):
......
...@@ -581,6 +581,9 @@ Core and Builtins ...@@ -581,6 +581,9 @@ Core and Builtins
Library Library
------- -------
- Issue #5984: distutils.command.build_ext.check_extensions_list checks were broken
for old-style extensions.
- Issue #5976: Fixed Distutils test_check_environ. - Issue #5976: Fixed Distutils test_check_environ.
- Issue #5941: Distutils build_clib command was not working anymore because - Issue #5941: Distutils build_clib command was not working anymore because
......
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