Chris@87
|
1 """distutils.extension
|
Chris@87
|
2
|
Chris@87
|
3 Provides the Extension class, used to describe C/C++ extension
|
Chris@87
|
4 modules in setup scripts.
|
Chris@87
|
5
|
Chris@87
|
6 Overridden to support f2py.
|
Chris@87
|
7
|
Chris@87
|
8 """
|
Chris@87
|
9 from __future__ import division, absolute_import, print_function
|
Chris@87
|
10
|
Chris@87
|
11 import sys
|
Chris@87
|
12 import re
|
Chris@87
|
13 from distutils.extension import Extension as old_Extension
|
Chris@87
|
14
|
Chris@87
|
15 if sys.version_info[0] >= 3:
|
Chris@87
|
16 basestring = str
|
Chris@87
|
17
|
Chris@87
|
18
|
Chris@87
|
19 cxx_ext_re = re.compile(r'.*[.](cpp|cxx|cc)\Z', re.I).match
|
Chris@87
|
20 fortran_pyf_ext_re = re.compile(r'.*[.](f90|f95|f77|for|ftn|f|pyf)\Z', re.I).match
|
Chris@87
|
21
|
Chris@87
|
22 class Extension(old_Extension):
|
Chris@87
|
23 def __init__ (self, name, sources,
|
Chris@87
|
24 include_dirs=None,
|
Chris@87
|
25 define_macros=None,
|
Chris@87
|
26 undef_macros=None,
|
Chris@87
|
27 library_dirs=None,
|
Chris@87
|
28 libraries=None,
|
Chris@87
|
29 runtime_library_dirs=None,
|
Chris@87
|
30 extra_objects=None,
|
Chris@87
|
31 extra_compile_args=None,
|
Chris@87
|
32 extra_link_args=None,
|
Chris@87
|
33 export_symbols=None,
|
Chris@87
|
34 swig_opts=None,
|
Chris@87
|
35 depends=None,
|
Chris@87
|
36 language=None,
|
Chris@87
|
37 f2py_options=None,
|
Chris@87
|
38 module_dirs=None,
|
Chris@87
|
39 extra_f77_compile_args=None,
|
Chris@87
|
40 extra_f90_compile_args=None,
|
Chris@87
|
41 ):
|
Chris@87
|
42 old_Extension.__init__(self, name, [],
|
Chris@87
|
43 include_dirs,
|
Chris@87
|
44 define_macros,
|
Chris@87
|
45 undef_macros,
|
Chris@87
|
46 library_dirs,
|
Chris@87
|
47 libraries,
|
Chris@87
|
48 runtime_library_dirs,
|
Chris@87
|
49 extra_objects,
|
Chris@87
|
50 extra_compile_args,
|
Chris@87
|
51 extra_link_args,
|
Chris@87
|
52 export_symbols)
|
Chris@87
|
53 # Avoid assert statements checking that sources contains strings:
|
Chris@87
|
54 self.sources = sources
|
Chris@87
|
55
|
Chris@87
|
56 # Python 2.4 distutils new features
|
Chris@87
|
57 self.swig_opts = swig_opts or []
|
Chris@87
|
58 # swig_opts is assumed to be a list. Here we handle the case where it
|
Chris@87
|
59 # is specified as a string instead.
|
Chris@87
|
60 if isinstance(self.swig_opts, basestring):
|
Chris@87
|
61 import warnings
|
Chris@87
|
62 msg = "swig_opts is specified as a string instead of a list"
|
Chris@87
|
63 warnings.warn(msg, SyntaxWarning)
|
Chris@87
|
64 self.swig_opts = self.swig_opts.split()
|
Chris@87
|
65
|
Chris@87
|
66 # Python 2.3 distutils new features
|
Chris@87
|
67 self.depends = depends or []
|
Chris@87
|
68 self.language = language
|
Chris@87
|
69
|
Chris@87
|
70 # numpy_distutils features
|
Chris@87
|
71 self.f2py_options = f2py_options or []
|
Chris@87
|
72 self.module_dirs = module_dirs or []
|
Chris@87
|
73 self.extra_f77_compile_args = extra_f77_compile_args or []
|
Chris@87
|
74 self.extra_f90_compile_args = extra_f90_compile_args or []
|
Chris@87
|
75
|
Chris@87
|
76 return
|
Chris@87
|
77
|
Chris@87
|
78 def has_cxx_sources(self):
|
Chris@87
|
79 for source in self.sources:
|
Chris@87
|
80 if cxx_ext_re(str(source)):
|
Chris@87
|
81 return True
|
Chris@87
|
82 return False
|
Chris@87
|
83
|
Chris@87
|
84 def has_f2py_sources(self):
|
Chris@87
|
85 for source in self.sources:
|
Chris@87
|
86 if fortran_pyf_ext_re(source):
|
Chris@87
|
87 return True
|
Chris@87
|
88 return False
|
Chris@87
|
89
|
Chris@87
|
90 # class Extension
|