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
)
env . Append ( SCANNERS = pyxscanner )
env [ ' BUILDERS ' ] [ ' Cython ' ] = cython
return cython
def cython_suffix_emitter ( env , source ) :
return " $CYTHONCFILESUFFIX "
def generate ( env ) :
env [ " CYTHON " ] = " cythonize "
env [ " CYTHONCOM " ] = " $CYTHON $CYTHONFLAGS $SOURCE "
env [ " CYTHONCFILESUFFIX " ] = " .cpp "
c_file , _ = SCons . Tool . createCFileBuilders ( env )
c_file . suffix [ ' .pyx ' ] = cython_suffix_emitter
c_file . add_action ( ' .pyx ' , cythonAction )
c_file . suffix [ ' .py ' ] = cython_suffix_emitter
c_file . add_action ( ' .py ' , cythonAction )
create_builder ( env )
def exists ( env ) :
return True