pg.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. # http://www.pgroup.com
  2. from __future__ import division, absolute_import, print_function
  3. import sys
  4. from numpy.distutils.fcompiler import FCompiler, dummy_fortran_file
  5. from sys import platform
  6. from os.path import join, dirname, normpath
  7. compilers = ['PGroupFCompiler', 'PGroupFlangCompiler']
  8. class PGroupFCompiler(FCompiler):
  9. compiler_type = 'pg'
  10. description = 'Portland Group Fortran Compiler'
  11. version_pattern = r'\s*pg(f77|f90|hpf|fortran) (?P<version>[\d.-]+).*'
  12. if platform == 'darwin':
  13. executables = {
  14. 'version_cmd': ["<F77>", "-V"],
  15. 'compiler_f77': ["pgfortran", "-dynamiclib"],
  16. 'compiler_fix': ["pgfortran", "-Mfixed", "-dynamiclib"],
  17. 'compiler_f90': ["pgfortran", "-dynamiclib"],
  18. 'linker_so': ["libtool"],
  19. 'archiver': ["ar", "-cr"],
  20. 'ranlib': ["ranlib"]
  21. }
  22. pic_flags = ['']
  23. else:
  24. executables = {
  25. 'version_cmd': ["<F77>", "-V"],
  26. 'compiler_f77': ["pgfortran"],
  27. 'compiler_fix': ["pgfortran", "-Mfixed"],
  28. 'compiler_f90': ["pgfortran"],
  29. 'linker_so': ["pgfortran"],
  30. 'archiver': ["ar", "-cr"],
  31. 'ranlib': ["ranlib"]
  32. }
  33. pic_flags = ['-fpic']
  34. module_dir_switch = '-module '
  35. module_include_switch = '-I'
  36. def get_flags(self):
  37. opt = ['-Minform=inform', '-Mnosecond_underscore']
  38. return self.pic_flags + opt
  39. def get_flags_opt(self):
  40. return ['-fast']
  41. def get_flags_debug(self):
  42. return ['-g']
  43. if platform == 'darwin':
  44. def get_flags_linker_so(self):
  45. return ["-dynamic", '-undefined', 'dynamic_lookup']
  46. else:
  47. def get_flags_linker_so(self):
  48. return ["-shared", '-fpic']
  49. def runtime_library_dir_option(self, dir):
  50. return '-R%s' % dir
  51. if sys.version_info >= (3, 5):
  52. import functools
  53. class PGroupFlangCompiler(FCompiler):
  54. compiler_type = 'flang'
  55. description = 'Portland Group Fortran LLVM Compiler'
  56. version_pattern = r'\s*(flang|clang) version (?P<version>[\d.-]+).*'
  57. ar_exe = 'lib.exe'
  58. possible_executables = ['flang']
  59. executables = {
  60. 'version_cmd': ["<F77>", "--version"],
  61. 'compiler_f77': ["flang"],
  62. 'compiler_fix': ["flang"],
  63. 'compiler_f90': ["flang"],
  64. 'linker_so': [None],
  65. 'archiver': [ar_exe, "/verbose", "/OUT:"],
  66. 'ranlib': None
  67. }
  68. library_switch = '/OUT:' # No space after /OUT:!
  69. module_dir_switch = '-module ' # Don't remove ending space!
  70. def get_libraries(self):
  71. opt = FCompiler.get_libraries(self)
  72. opt.extend(['flang', 'flangrti', 'ompstub'])
  73. return opt
  74. @functools.lru_cache(maxsize=128)
  75. def get_library_dirs(self):
  76. """List of compiler library directories."""
  77. opt = FCompiler.get_library_dirs(self)
  78. flang_dir = dirname(self.executables['compiler_f77'][0])
  79. opt.append(normpath(join(flang_dir, '..', 'lib')))
  80. return opt
  81. def get_flags(self):
  82. return []
  83. def get_flags_free(self):
  84. return []
  85. def get_flags_debug(self):
  86. return ['-g']
  87. def get_flags_opt(self):
  88. return ['-O3']
  89. def get_flags_arch(self):
  90. return []
  91. def runtime_library_dir_option(self, dir):
  92. raise NotImplementedError
  93. else:
  94. from numpy.distutils.fcompiler import CompilerNotFound
  95. # No point in supporting on older Pythons because not ABI compatible
  96. class PGroupFlangCompiler(FCompiler):
  97. compiler_type = 'flang'
  98. description = 'Portland Group Fortran LLVM Compiler'
  99. def get_version(self):
  100. raise CompilerNotFound('Flang unsupported on Python < 3.5')
  101. if __name__ == '__main__':
  102. from distutils import log
  103. log.set_verbosity(2)
  104. from numpy.distutils import customized_fcompiler
  105. if 'flang' in sys.argv:
  106. print(customized_fcompiler(compiler='flang').get_version())
  107. else:
  108. print(customized_fcompiler(compiler='pg').get_version())