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