15808f684SSatish Balay#!/usr/bin/env python 25808f684SSatish Balayimport sys, os 35808f684SSatish Balay 45808f684SSatish Balaydef cythonize(source, 5*a9c71d45SLisandro Dalcin output=None, 65808f684SSatish Balay includes=(), 75808f684SSatish Balay destdir_c=None, 85808f684SSatish Balay destdir_h=None, 95808f684SSatish Balay wdir=None): 105808f684SSatish Balay from Cython.Compiler.Main import \ 115808f684SSatish Balay CompilationOptions, default_options, \ 125808f684SSatish Balay compile, \ 135808f684SSatish Balay PyrexError 145808f684SSatish Balay from Cython.Compiler import Options 155808f684SSatish Balay cwd = os.getcwd() 165808f684SSatish Balay try: 17*a9c71d45SLisandro Dalcin if output is None: 18*a9c71d45SLisandro Dalcin name, _ = os.path.splitext(source) 19*a9c71d45SLisandro Dalcin output = name + '.c' 20*a9c71d45SLisandro Dalcin else: 21*a9c71d45SLisandro Dalcin name, _ = os.path.splitext(output) 22*a9c71d45SLisandro Dalcin outputs_c = [output] 235808f684SSatish Balay outputs_h = [name + '.h', name + '_api.h'] 245808f684SSatish Balay # change working directory 255808f684SSatish Balay if wdir: 265808f684SSatish Balay os.chdir(wdir) 275808f684SSatish Balay # run Cython on source 285808f684SSatish Balay options = CompilationOptions(default_options) 29*a9c71d45SLisandro Dalcin if Options.directive_types['language_level'] is str: 30*a9c71d45SLisandro Dalcin options.language_level = '3str' 315808f684SSatish Balay options.output_file = outputs_c[0] 325808f684SSatish Balay options.include_path = list(includes) 335808f684SSatish Balay Options.generate_cleanup_code = 3 345808f684SSatish Balay any_failures = 0 355808f684SSatish Balay try: 365808f684SSatish Balay result = compile(source, options) 375808f684SSatish Balay if result.num_errors > 0: 385808f684SSatish Balay any_failures = 1 395808f684SSatish Balay except (EnvironmentError, PyrexError): 405808f684SSatish Balay e = sys.exc_info()[1] 415808f684SSatish Balay sys.stderr.write(str(e) + '\n') 425808f684SSatish Balay any_failures = 1 435808f684SSatish Balay if any_failures: 445808f684SSatish Balay for output in outputs_c + outputs_h: 455808f684SSatish Balay try: 465808f684SSatish Balay os.remove(output) 475808f684SSatish Balay except OSError: 485808f684SSatish Balay pass 495808f684SSatish Balay return 1 505808f684SSatish Balay # move ouputs 515808f684SSatish Balay for destdir, outputs in ( 525808f684SSatish Balay (destdir_c, outputs_c), 535808f684SSatish Balay (destdir_h, outputs_h)): 545808f684SSatish Balay if destdir is None: continue 555808f684SSatish Balay for output in outputs: 565808f684SSatish Balay dest = os.path.join( 575808f684SSatish Balay destdir, os.path.basename(output)) 585808f684SSatish Balay try: 595808f684SSatish Balay os.remove(dest) 605808f684SSatish Balay except OSError: 615808f684SSatish Balay pass 625808f684SSatish Balay os.rename(output, dest) 635808f684SSatish Balay # 645808f684SSatish Balay return 0 655808f684SSatish Balay # 665808f684SSatish Balay finally: 675808f684SSatish Balay os.chdir(cwd) 685808f684SSatish Balay 695808f684SSatish Balay 705808f684SSatish Balayif __name__ == "__main__": 715808f684SSatish Balay sys.exit( 725808f684SSatish Balay cythonize('petsc4py.PETSc.pyx', 73*a9c71d45SLisandro Dalcin 'petsc4py.PETSc.c', 745808f684SSatish Balay includes=['include'], 755808f684SSatish Balay destdir_h=os.path.join('include', 'petsc4py'), 765808f684SSatish Balay wdir='src') 775808f684SSatish Balay or 785808f684SSatish Balay cythonize(os.path.join('libpetsc4py', 'libpetsc4py.pyx'), 795808f684SSatish Balay includes=['include'], 805808f684SSatish Balay wdir='src') 815808f684SSatish Balay ) 82