15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)""" 25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)Tool to run Cython files (.pyx) into .c and .cpp. 35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TODO: 55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) - Add support for dynamically selecting in-process Cython 65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) through CYTHONINPROCESS variable. 75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) - Have a CYTHONCPP option which turns on C++ in flags and 85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) changes output extension at the same time 95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)VARIABLES: 115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) - CYTHON - The path to the "cython" command line tool. 125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) - CYTHONFLAGS - Flags to pass to the "cython" command line tool. 135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)AUTHORS: 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) - David Cournapeau 165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) - Dag Sverre Seljebotn 175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)""" 195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)import SCons 205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from SCons.Builder import Builder 215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from SCons.Action import Action 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#def cython_action(target, source, env): 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# print target, source, env 255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# from Cython.Compiler.Main import compile as cython_compile 265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# res = cython_compile(str(source[0])) 275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)cythonAction = Action("$CYTHONCOM") 295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def create_builder(env): 315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) try: 325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cython = env['BUILDERS']['Cython'] 335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) except KeyError: 345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cython = SCons.Builder.Builder( 355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) action = cythonAction, 365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) emitter = {}, 375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) suffix = cython_suffix_emitter, 385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) single_source = 1) 395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) env['BUILDERS']['Cython'] = cython 405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return cython 425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def cython_suffix_emitter(env, source): 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return "$CYTHONCFILESUFFIX" 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def generate(env): 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) env["CYTHON"] = "cython" 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) env["CYTHONCOM"] = "$CYTHON $CYTHONFLAGS -o $TARGET $SOURCE" 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) env["CYTHONCFILESUFFIX"] = ".c" 505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) c_file, cxx_file = SCons.Tool.createCFileBuilders(env) 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) c_file.suffix['.pyx'] = cython_suffix_emitter 545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) c_file.add_action('.pyx', cythonAction) 555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) c_file.suffix['.py'] = cython_suffix_emitter 575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) c_file.add_action('.py', cythonAction) 585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) create_builder(env) 605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def exists(env): 625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) try: 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# import Cython 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return True 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) except ImportError: 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return False 67