cython dependency scanner

This commit is contained in:
Adeeb Shihadeh 2021-01-11 14:16:02 -08:00
parent da3da25051
commit b54a68d140
1 changed files with 39 additions and 5 deletions

View File

@ -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