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