Commit 139664ca authored by Robert Bradshaw's avatar Robert Bradshaw

Simplify cythonize api.

parent 5266d1f9
from glob import glob from glob import glob
import re, os, sys import re, os, sys
try:
set
except NameError:
# Python 2.3
from sets import Set as set
from distutils.extension import Extension from distutils.extension import Extension
from Cython import Utils from Cython import Utils
...@@ -68,7 +74,7 @@ def line_iter(source): ...@@ -68,7 +74,7 @@ def line_iter(source):
class DistutilsInfo(object): class DistutilsInfo(object):
def __init__(self, source=None): def __init__(self, source=None, exn=None):
self.values = {} self.values = {}
if source is not None: if source is not None:
for line in line_iter(source): for line in line_iter(source):
...@@ -87,8 +93,17 @@ class DistutilsInfo(object): ...@@ -87,8 +93,17 @@ class DistutilsInfo(object):
if key == 'define_macros': if key == 'define_macros':
value = [tuple(macro.split('=')) for macro in value] value = [tuple(macro.split('=')) for macro in value]
self.values[key] = value self.values[key] = value
elif exn is not None:
for key in self.distutils_settings:
if key in ('name', 'sources'):
pass
value = getattr(exn, key, None)
if value:
self.values[key] = value
def merge(self, other): def merge(self, other):
if other is None:
return self
for key, value in other.values.items(): for key, value in other.values.items():
type = distutils_settings[key] type = distutils_settings[key]
if type is transitive_str and key not in self.values: if type is transitive_str and key not in self.values:
...@@ -303,8 +318,10 @@ class DependencyTree(object): ...@@ -303,8 +318,10 @@ class DependencyTree(object):
def distutils_info0(self, filename): def distutils_info0(self, filename):
return self.parse_dependencies(filename)[3] return self.parse_dependencies(filename)[3]
def distutils_info(self, filename, aliases): def distutils_info(self, filename, aliases=None, base=None):
return self.transitive_merge(filename, self.distutils_info0, DistutilsInfo.merge).subs(aliases) return (self.transitive_merge(filename, self.distutils_info0, DistutilsInfo.merge)
.subs(aliases)
.merge(base))
def transitive_merge(self, node, extract, merge): def transitive_merge(self, node, extract, merge):
try: try:
...@@ -351,19 +368,38 @@ def create_dependency_tree(ctx=None): ...@@ -351,19 +368,38 @@ def create_dependency_tree(ctx=None):
# TODO: Take common options. # TODO: Take common options.
# TODO: Symbolic names (e.g. for numpy.include_dirs() # TODO: Symbolic names (e.g. for numpy.include_dirs()
def create_extension_list(filepatterns, ctx=None, aliases=None): def create_extension_list(patterns, ctx=None, aliases=None):
seen = set()
deps = create_dependency_tree(ctx) deps = create_dependency_tree(ctx)
if isinstance(filepatterns, str): if not isinstance(patterns, list):
filepatterns = [filepatterns] patterns = [patterns]
module_list = [] module_list = []
for pattern in filepatterns: for pattern in patterns:
for file in glob(pattern): if isinstance(pattern, str):
filepattern = pattern
template = None
name = '*'
base = None
exn_type = Extension
elif isinstance(pattern, Extension):
filepattern = pattern.sources[0]
template = pattern
name = template.name
base = DistutilsInfo(template)
exn_type = type(template)
else:
raise TypeError, pattern
for file in glob(filepattern):
pkg = deps.package(file) pkg = deps.package(file)
name = deps.fully_qualifeid_name(file) if name == '*':
module_list.append(Extension(name=name, sources=[file], **deps.distutils_info(file, aliases).values)) name = deps.fully_qualifeid_name(file)
if name not in seen:
module_list.append(exn_type(name=name, sources=[file], **deps.distutils_info(file, aliases, base).values))
seen.add(name)
return module_list return module_list
def cythonize(module_list, ctx=None, nthreads=0): def cythonize(module_list, ctx=None, nthreads=0, aliases=None):
module_list = create_extension_list(module_list, ctx=ctx, aliases=aliases)
deps = create_dependency_tree(ctx) deps = create_dependency_tree(ctx)
to_compile = [] to_compile = []
for m in module_list: for m in module_list:
......
...@@ -5,12 +5,12 @@ PYTHON -c "import a" ...@@ -5,12 +5,12 @@ PYTHON -c "import a"
# TODO: Better interface... # TODO: Better interface...
from Cython.Compiler.Dependencies import create_extension_list, cythonize from Cython.Compiler.Dependencies import cythonize
from distutils.core import setup from distutils.core import setup
setup( setup(
ext_modules = cythonize(create_extension_list("*.pyx")), ext_modules = cythonize("*.pyx"),
) )
######## a.pyx ######## ######## a.pyx ########
...@@ -5,12 +5,12 @@ PYTHON -c "import a" ...@@ -5,12 +5,12 @@ PYTHON -c "import a"
# TODO: Better interface... # TODO: Better interface...
from Cython.Compiler.Dependencies import create_extension_list, cythonize from Cython.Compiler.Dependencies import cythonize
from distutils.core import setup from distutils.core import setup
setup( setup(
ext_modules = cythonize(create_extension_list("*.pyx", aliases={'MATH_LIBS': ['m']})), ext_modules = cythonize("*.pyx", aliases={'MATH_LIBS': ['m']}),
) )
######## my_lib.pxd ######## ######## my_lib.pxd ########
......
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