extension.py 3.5 KB

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