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