Simplify cythonize api.
authorRobert Bradshaw <robertwb@math.washington.edu>
Tue, 14 Sep 2010 05:06:25 +0000 (22:06 -0700)
committerRobert Bradshaw <robertwb@math.washington.edu>
Tue, 14 Sep 2010 05:06:25 +0000 (22:06 -0700)
Cython/Compiler/Dependencies.py
tests/build/basic_cythonize.srctree
tests/build/inline_distutils.srctree

index ffe166ed50ad6c36c2ec93a3cbaf13b08fcbcad2..1832ceafb68c8d008459077bc8ad4d084236cacc 100644 (file)
@@ -1,6 +1,12 @@
 from glob import glob
 import re, os, sys
 
+try:
+    set
+except NameError:
+    # Python 2.3
+    from sets import Set as set
+
 from distutils.extension import Extension
 
 from Cython import Utils
@@ -68,7 +74,7 @@ def line_iter(source):
 
 class DistutilsInfo(object):
     
-    def __init__(self, source=None):
+    def __init__(self, source=None, exn=None):
         self.values = {}
         if source is not None:
             for line in line_iter(source):
@@ -87,8 +93,17 @@ class DistutilsInfo(object):
                         if key == 'define_macros':
                             value = [tuple(macro.split('=')) for macro in 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):
+        if other is None:
+            return self
         for key, value in other.values.items():
             type = distutils_settings[key]
             if type is transitive_str and key not in self.values:
@@ -303,8 +318,10 @@ class DependencyTree(object):
     def distutils_info0(self, filename):
         return self.parse_dependencies(filename)[3]
     
-    def distutils_info(self, filename, aliases):
-        return self.transitive_merge(filename, self.distutils_info0, DistutilsInfo.merge).subs(aliases)
+    def distutils_info(self, filename, aliases=None, base=None):
+        return (self.transitive_merge(filename, self.distutils_info0, DistutilsInfo.merge)
+            .subs(aliases)
+            .merge(base))
     
     def transitive_merge(self, node, extract, merge):
         try:
@@ -351,19 +368,38 @@ def create_dependency_tree(ctx=None):
 
 # TODO: Take common options.
 # 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)
-    if isinstance(filepatterns, str):
-        filepatterns = [filepatterns]
+    if not isinstance(patterns, list):
+        patterns = [patterns]
     module_list = []
-    for pattern in filepatterns:
-        for file in glob(pattern):
+    for pattern in patterns:
+        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)
-            name = deps.fully_qualifeid_name(file)
-            module_list.append(Extension(name=name, sources=[file], **deps.distutils_info(file, aliases).values))
+            if name == '*':
+                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
 
-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)
     to_compile = []
     for m in module_list:
index 8acf6633004de485221bdb02e1feaf4872224a00..3e6b4029faf397f81f24e6d99a70f673d6e58120 100644 (file)
@@ -5,12 +5,12 @@ PYTHON -c "import a"
 
 
 # TODO: Better interface...
-from Cython.Compiler.Dependencies import create_extension_list, cythonize
+from Cython.Compiler.Dependencies import cythonize
 
 from distutils.core import setup
 
 setup(
-  ext_modules = cythonize(create_extension_list("*.pyx")),
+  ext_modules = cythonize("*.pyx"),
 )
 
 ######## a.pyx ########
index 2f1fba8d926796f45c7f44b72890aa5d15edb77c..70f2bb47f00d2de2325cc87acb2256e2a2f5561c 100644 (file)
@@ -5,12 +5,12 @@ PYTHON -c "import a"
 
 
 # TODO: Better interface...
-from Cython.Compiler.Dependencies import create_extension_list, cythonize
+from Cython.Compiler.Dependencies import cythonize
 
 from distutils.core import setup
 
 setup(
-  ext_modules = cythonize(create_extension_list("*.pyx", aliases={'MATH_LIBS': ['m']})),
+  ext_modules = cythonize("*.pyx", aliases={'MATH_LIBS': ['m']}),
 )
 
 ######## my_lib.pxd ########