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