Aliases for inline dependencies (e.g. numpy_include_dirs).
authorRobert Bradshaw <robertwb@math.washington.edu>
Tue, 14 Sep 2010 04:29:53 +0000 (21:29 -0700)
committerRobert Bradshaw <robertwb@math.washington.edu>
Tue, 14 Sep 2010 04:29:53 +0000 (21:29 -0700)
Cython/Compiler/Dependencies.py
tests/build/inline_distutils.srctree

index a784a05907490dd743e28b195a5184b4cc8c30b6..ffe166ed50ad6c36c2ec93a3cbaf13b08fcbcad2 100644 (file)
@@ -68,24 +68,25 @@ def line_iter(source):
 
 class DistutilsInfo(object):
     
-    def __init__(self, source):
+    def __init__(self, source=None):
         self.values = {}
-        for line in line_iter(source):
-            line = line.strip()
-            if line != '' and line[0] != '#':
-                break
-            line = line[1:].strip()
-            if line[:10] == 'distutils:':
-                line = line[10:]
-                ix = line.index('=')
-                key = str(line[:ix].strip())
-                value = line[ix+1:].strip()
-                type = distutils_settings[key]
-                if type in (list, transitive_list):
-                    value = parse_list(value)
-                    if key == 'define_macros':
-                        value = [tuple(macro.split('=')) for macro in value]
-                self.values[key] = value
+        if source is not None:
+            for line in line_iter(source):
+                line = line.strip()
+                if line != '' and line[0] != '#':
+                    break
+                line = line[1:].strip()
+                if line[:10] == 'distutils:':
+                    line = line[10:]
+                    ix = line.index('=')
+                    key = str(line[:ix].strip())
+                    value = line[ix+1:].strip()
+                    type = distutils_settings[key]
+                    if type in (list, transitive_list):
+                        value = parse_list(value)
+                        if key == 'define_macros':
+                            value = [tuple(macro.split('=')) for macro in value]
+                    self.values[key] = value
     
     def merge(self, other):
         for key, value in other.values.items():
@@ -101,6 +102,28 @@ class DistutilsInfo(object):
                 else:
                     self.values[key] = value
         return self
+    
+    def subs(self, aliases):
+        if aliases is None:
+            return self
+        resolved = DistutilsInfo()
+        for key, value in self.values.items():
+            type = distutils_settings[key]
+            if type in [list, transitive_list]:
+                new_value_list = []
+                for v in value:
+                    if v in aliases:
+                        v = aliases[v]
+                    if isinstance(v, list):
+                        new_value_list += v
+                    else:
+                        new_value_list.append(v)
+                value = new_value_list
+            else:
+                if value in aliases:
+                    value = aliases[value]
+            resolved.values[key] = value
+        return resolved
 
 
 def strip_string_literals(code, prefix='__Pyx_L'):
@@ -280,8 +303,8 @@ class DependencyTree(object):
     def distutils_info0(self, filename):
         return self.parse_dependencies(filename)[3]
     
-    def distutils_info(self, filename):
-        return self.transitive_merge(filename, self.distutils_info0, DistutilsInfo.merge)
+    def distutils_info(self, filename, aliases):
+        return self.transitive_merge(filename, self.distutils_info0, DistutilsInfo.merge).subs(aliases)
     
     def transitive_merge(self, node, extract, merge):
         try:
@@ -328,7 +351,7 @@ 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):
+def create_extension_list(filepatterns, ctx=None, aliases=None):
     deps = create_dependency_tree(ctx)
     if isinstance(filepatterns, str):
         filepatterns = [filepatterns]
@@ -337,7 +360,7 @@ def create_extension_list(filepatterns, ctx=None):
         for file in glob(pattern):
             pkg = deps.package(file)
             name = deps.fully_qualifeid_name(file)
-            module_list.append(Extension(name=name, sources=[file], **deps.distutils_info(file).values))
+            module_list.append(Extension(name=name, sources=[file], **deps.distutils_info(file, aliases).values))
     return module_list
 
 def cythonize(module_list, ctx=None, nthreads=0):
index 436676dddb4498518ffbcd85e12bb6853dcada94..2f1fba8d926796f45c7f44b72890aa5d15edb77c 100644 (file)
@@ -10,12 +10,13 @@ from Cython.Compiler.Dependencies import create_extension_list, cythonize
 from distutils.core import setup
 
 setup(
-  ext_modules = cythonize(create_extension_list("*.pyx")),
+  ext_modules = cythonize(create_extension_list("*.pyx", aliases={'MATH_LIBS': ['m']})),
 )
 
 ######## my_lib.pxd ########
 
-# distutils: language=c++
+# distutils: language = c++
+# distutils: libraries = MATH_LIBS
 
 cdef extern from "my_lib_helper.cpp" namespace "A":
     int x