xref: /petsc/src/binding/petsc4py/conf/cythonize.py (revision a9c71d4584a869546cada8bf43e0e152380cd379)
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