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