cython dependency scanner
This commit is contained in:
parent
da3da25051
commit
b54a68d140
|
@ -1,18 +1,52 @@
|
||||||
|
import re
|
||||||
import SCons
|
import SCons
|
||||||
from SCons.Action import Action
|
from SCons.Action import Action
|
||||||
|
from SCons.Scanner import Scanner
|
||||||
|
|
||||||
|
pyx_from_import_re = re.compile(r'^from\s+(\S+)\s+cimport', re.M)
|
||||||
|
pyx_import_re = re.compile(r'^cimport\s+(\S+)', re.M)
|
||||||
|
cdef_import_re = re.compile(r'^cdef extern from\s+.(\S+).:', re.M)
|
||||||
|
|
||||||
|
|
||||||
|
def pyx_scan(node, env, path, arg=None):
|
||||||
|
contents = node.get_text_contents()
|
||||||
|
|
||||||
|
# from <module> cimport ...
|
||||||
|
matches = pyx_from_import_re.findall(contents)
|
||||||
|
# cimport <module>
|
||||||
|
matches += pyx_import_re.findall(contents)
|
||||||
|
|
||||||
|
# Modules can be either .pxd or .pyx files
|
||||||
|
files = [m.replace('.', '/') + '.pxd' for m in matches]
|
||||||
|
files += [m.replace('.', '/') + '.pyx' for m in matches]
|
||||||
|
|
||||||
|
# cdef extern from <file>
|
||||||
|
files += cdef_import_re.findall(contents)
|
||||||
|
|
||||||
|
# Handle relative imports
|
||||||
|
cur_dir = str(node.get_dir())
|
||||||
|
files = [cur_dir + f if f.startswith('/') else f for f in files]
|
||||||
|
|
||||||
|
# Filter out non-existing files (probably system imports)
|
||||||
|
files = [f for f in files if env.File(f).exists()]
|
||||||
|
return env.File(files)
|
||||||
|
|
||||||
|
|
||||||
|
pyxscanner = Scanner(function=pyx_scan, skeys=['.pyx', '.pxd'], recursive=True)
|
||||||
cythonAction = Action("$CYTHONCOM")
|
cythonAction = Action("$CYTHONCOM")
|
||||||
|
|
||||||
|
|
||||||
def create_builder(env):
|
def create_builder(env):
|
||||||
try:
|
try:
|
||||||
cython = env['BUILDERS']['Cython']
|
cython = env['BUILDERS']['Cython']
|
||||||
except KeyError:
|
except KeyError:
|
||||||
cython = SCons.Builder.Builder(
|
cython = SCons.Builder.Builder(
|
||||||
action = cythonAction,
|
action=cythonAction,
|
||||||
emitter = {},
|
emitter={},
|
||||||
suffix = cython_suffix_emitter,
|
suffix=cython_suffix_emitter,
|
||||||
single_source = 1
|
single_source=1
|
||||||
)
|
)
|
||||||
|
env.Append(SCANNERS=pyxscanner)
|
||||||
env['BUILDERS']['Cython'] = cython
|
env['BUILDERS']['Cython'] = cython
|
||||||
return cython
|
return cython
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue