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