1#!/usr/bin/env python 2import sys, os 3 4def cythonize(source, 5 output=None, 6 includes=(), 7 destdir_c=None, 8 destdir_h=None, 9 wdir=None): 10 import cyautodoc 11 from Cython.Compiler.Main import \ 12 CompilationOptions, default_options, \ 13 compile, \ 14 PyrexError 15 from Cython.Compiler import Options 16 cwd = os.getcwd() 17 try: 18 if output is None: 19 name, _ = os.path.splitext(source) 20 output = name + '.c' 21 else: 22 name, _ = os.path.splitext(output) 23 outputs_c = [output] 24 outputs_h = [name + '.h', name + '_api.h'] 25 # change working directory 26 if wdir: 27 os.chdir(wdir) 28 # run Cython on source 29 options = CompilationOptions(default_options) 30 if Options.directive_types['language_level'] is str: 31 options.language_level = '3str' 32 options.output_file = outputs_c[0] 33 options.include_path = list(includes) 34 Options.generate_cleanup_code = 3 35 any_failures = 0 36 try: 37 result = compile(source, options) 38 if result.num_errors > 0: 39 any_failures = 1 40 except (EnvironmentError, PyrexError): 41 e = sys.exc_info()[1] 42 sys.stderr.write(str(e) + '\n') 43 any_failures = 1 44 if any_failures: 45 for output in outputs_c + outputs_h: 46 try: 47 os.remove(output) 48 except OSError: 49 pass 50 return 1 51 # move ouputs 52 for destdir, outputs in ( 53 (destdir_c, outputs_c), 54 (destdir_h, outputs_h)): 55 if destdir is None: continue 56 for output in outputs: 57 dest = os.path.join( 58 destdir, os.path.basename(output)) 59 try: 60 os.remove(dest) 61 except OSError: 62 pass 63 os.rename(output, dest) 64 # 65 return 0 66 # 67 finally: 68 os.chdir(cwd) 69 70if __name__ == "__main__": 71 sys.exit( 72 cythonize('mpi4py/MPI.pyx', 'mpi4py.MPI.c', 73 destdir_h=os.path.join('mpi4py', 'include', 'mpi4py'), 74 wdir='src') 75 ) 76