From: Robert Bradshaw Date: Tue, 14 Sep 2010 04:29:53 +0000 (-0700) Subject: Aliases for inline dependencies (e.g. numpy_include_dirs). X-Git-Tag: 0.14.alpha0~313 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=5266d1f9272925d576fbccbd31841870f012a275;p=cython.git Aliases for inline dependencies (e.g. numpy_include_dirs). --- diff --git a/Cython/Compiler/Dependencies.py b/Cython/Compiler/Dependencies.py index a784a059..ffe166ed 100644 --- a/Cython/Compiler/Dependencies.py +++ b/Cython/Compiler/Dependencies.py @@ -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): diff --git a/tests/build/inline_distutils.srctree b/tests/build/inline_distutils.srctree index 436676dd..2f1fba8d 100644 --- a/tests/build/inline_distutils.srctree +++ b/tests/build/inline_distutils.srctree @@ -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