|
|
|
@ -1,18 +1,52 @@ |
|
|
|
|
import re |
|
|
|
|
import SCons |
|
|
|
|
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") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def create_builder(env): |
|
|
|
|
try: |
|
|
|
|
cython = env['BUILDERS']['Cython'] |
|
|
|
|
except KeyError: |
|
|
|
|
cython = SCons.Builder.Builder( |
|
|
|
|
action = cythonAction, |
|
|
|
|
emitter = {}, |
|
|
|
|
suffix = cython_suffix_emitter, |
|
|
|
|
single_source = 1 |
|
|
|
|
) |
|
|
|
|
action=cythonAction, |
|
|
|
|
emitter={}, |
|
|
|
|
suffix=cython_suffix_emitter, |
|
|
|
|
single_source=1 |
|
|
|
|
) |
|
|
|
|
env.Append(SCANNERS=pyxscanner) |
|
|
|
|
env['BUILDERS']['Cython'] = cython |
|
|
|
|
return cython |
|
|
|
|
|
|
|
|
|