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