import gc
import codecs
import shutil
+import time
import unittest
import doctest
import operator
except ImportError: # No threads, no problems
threading = None
+WITH_CYTHON = True
+CY3_DIR = None
+
+from distutils.dist import Distribution
+from distutils.core import Extension
+from distutils.command.build_ext import build_ext as _build_ext
+distutils_distro = Distribution()
+
if sys.platform == 'win32':
# TODO: Figure out why this hackery (see http://thread.gmane.org/gmane.comp.python.cython.devel/8280/).
config_files = distutils_distro.find_config_files()
except ValueError: pass
distutils_distro.parse_config_files(cfgfiles)
-
-WITH_CYTHON = True
-
-from distutils.dist import Distribution
-from distutils.core import Extension
-from distutils.command.build_ext import build_ext as _build_ext
-distutils_distro = Distribution()
-
TEST_DIRS = ['compile', 'errors', 'run', 'wrappers', 'pyregr', 'build']
TEST_RUN_DIRS = ['run', 'wrappers', 'pyregr']
os.path.join('Cython', 'Debugger', 'libpython.py'),
]
-
+COMPILER = None
INCLUDE_DIRS = [ d for d in os.getenv('INCLUDE', '').split(os.pathsep) if d ]
CFLAGS = os.getenv('CFLAGS', '').split()
continue
suite.addTest(
self.handle_directory(path, filename))
- if sys.platform not in ['win32'] and sys.version_info[0] < 3:
- # Non-Windows makefile, can't run Cython under Py3.
- if [1 for selector in self.selectors if selector("embedded")]:
+ if sys.platform not in ['win32']:
+ # Non-Windows makefile.
+ if [1 for selector in self.selectors if selector("embedded")] \
+ and not [1 for selector in self.exclude_selectors if selector("embedded")]:
suite.addTest(unittest.makeSuite(EmbedTest))
return suite
filenames = os.listdir(path)
filenames.sort()
for filename in filenames:
- if context == "build" and filename.endswith(".srctree"):
+ if filename.endswith(".srctree"):
if not [ 1 for match in self.selectors if match(filename) ]:
continue
- suite.addTest(EndToEndTest(filename, workdir, self.cleanup_workdir))
+ if self.exclude_selectors:
+ if [1 for match in self.exclude_selectors if match(filename)]:
+ continue
+ suite.addTest(EndToEndTest(os.path.join(path, filename), workdir, self.cleanup_workdir))
continue
if not (filename.endswith(".pyx") or filename.endswith(".py")):
continue
if incdir:
build_extension.include_dirs.append(incdir)
build_extension.finalize_options()
+ if COMPILER:
+ build_extension.compiler = COMPILER
ext_include_dirs = []
for match, get_additional_include_dirs in EXT_DEP_INCLUDES:
if match(module):
ext_include_dirs += get_additional_include_dirs()
- self.copy_related_files(test_directory, workdir, module)
-
+ ext_compile_flags = CFLAGS[:]
+ if build_extension.compiler == 'mingw32':
+ ext_compile_flags.append('-Wno-format')
if extra_extension_args is None:
extra_extension_args = {}
+ self.copy_related_files(test_directory, workdir, module)
extension = Extension(
module,
sources = self.find_source_files(workdir, module),
include_dirs = ext_include_dirs,
- extra_compile_args = CFLAGS,
+ extra_compile_args = ext_compile_flags,
**extra_extension_args
)
if self.language == 'cpp':
if include_debugger:
skipped_dirs = []
else:
- cython_dir = os.path.dirname(os.path.abspath(__file__))
- skipped_dirs = [os.path.join(cython_dir, 'Cython', 'Debugger')]
+ skipped_dirs = ['Cython' + os.path.sep + 'Debugger' + os.path.sep]
for dirpath, dirnames, filenames in os.walk(path):
if dirpath != path and "__init__.py" not in filenames:
cython_root = os.path.dirname(os.path.abspath(__file__))
def __init__(self, treefile, workdir, cleanup_workdir=True):
+ self.name = os.path.splitext(os.path.basename(treefile))[0]
self.treefile = treefile
- self.workdir = os.path.join(workdir, os.path.splitext(treefile)[0])
+ self.workdir = os.path.join(workdir, self.name)
self.cleanup_workdir = cleanup_workdir
cython_syspath = self.cython_root
for path in sys.path[::-1]:
unittest.TestCase.__init__(self)
def shortDescription(self):
- return "End-to-end %s" % self.treefile
+ return "End-to-end %s" % self.name
def setUp(self):
from Cython.TestUtils import unpack_source_tree
- _, self.commands = unpack_source_tree(
- os.path.join('tests', 'build', self.treefile), self.workdir)
+ _, self.commands = unpack_source_tree(self.treefile, self.workdir)
self.old_dir = os.getcwd()
os.chdir(self.workdir)
if self.workdir not in sys.path:
def tearDown(self):
if self.cleanup_workdir:
- shutil.rmtree(self.workdir)
+ for trial in range(5):
+ try:
+ shutil.rmtree(self.workdir)
+ except OSError:
+ time.sleep(0.1)
+ else:
+ break
os.chdir(self.old_dir)
def runTest(self):
if not os.path.isdir(libdir) or libname not in os.listdir(libdir):
# report the error for the original directory
libdir = sysconfig.get_config_var('LIBDIR')
+ cython = 'cython.py'
+ if sys.version_info[0] >=3:
+ cython = os.path.join(CY3_DIR, cython)
+ cython = os.path.abspath(os.path.join('..', '..', cython))
self.assert_(os.system(
- "make PYTHON='%s' LIBDIR1='%s' test > make.output" % (sys.executable, libdir)) == 0)
+ "make PYTHON='%s' CYTHON='%s' LIBDIR1='%s' test > make.output" % (sys.executable, cython, libdir)) == 0)
try:
os.remove('make.output')
except OSError:
recursive-include Cython *.py *.pyx *.pxd
recursive-include Cython/Debugger/Tests *
include runtests.py
+ include cython.py
''')
sys.path.insert(0, cy3_dir)
parser.add_option("--no-cython", dest="with_cython",
action="store_false", default=True,
help="do not run the Cython compiler, only the C compiler")
+ parser.add_option("--compiler", dest="compiler", default=None,
+ help="C compiler type")
parser.add_option("--no-c", dest="use_c",
action="store_false", default=True,
help="do not test C compilation")
for name in cy_modules:
del sys.modules[name]
# hasn't been refactored yet - do it now
- cy3_dir = os.path.join(WORKDIR, 'Cy3')
+ global CY3_DIR
+ CY3_DIR = cy3_dir = os.path.join(WORKDIR, 'Cy3')
if sys.version_info >= (3,1):
refactor_for_py3(DISTDIR, cy3_dir)
elif os.path.isdir(cy3_dir):
# RUN ALL TESTS!
UNITTEST_MODULE = "Cython"
- UNITTEST_ROOT = os.path.join(os.getcwd(), UNITTEST_MODULE)
+ UNITTEST_ROOT = os.path.join(os.path.dirname(__file__), UNITTEST_MODULE)
if WITH_CYTHON:
if os.path.exists(WORKDIR):
for path in os.listdir(WORKDIR):
if sys.platform in ['win32', 'cygwin'] and sys.version_info < (2,6):
exclude_selectors += [ lambda x: x == "run.specialfloat" ]
+ global COMPILER
+ if options.compiler:
+ COMPILER = options.compiler
languages = []
if options.use_c:
languages.append('c')