fortran.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. # Copyright 2012-2017 The Meson development team
  2. # Licensed under the Apache License, Version 2.0 (the "License");
  3. # you may not use this file except in compliance with the License.
  4. # You may obtain a copy of the License at
  5. # http://www.apache.org/licenses/LICENSE-2.0
  6. # Unless required by applicable law or agreed to in writing, software
  7. # distributed under the License is distributed on an "AS IS" BASIS,
  8. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  9. # See the License for the specific language governing permissions and
  10. # limitations under the License.
  11. from .c import CCompiler
  12. from .compilers import (
  13. ICC_STANDARD,
  14. Compiler,
  15. GnuCompiler,
  16. ElbrusCompiler,
  17. IntelCompiler,
  18. )
  19. class FortranCompiler(Compiler):
  20. library_dirs_cache = CCompiler.library_dirs_cache
  21. program_dirs_cache = CCompiler.library_dirs_cache
  22. find_library_cache = CCompiler.library_dirs_cache
  23. def __init__(self, exelist, version, is_cross, exe_wrapper=None, **kwargs):
  24. self.language = 'fortran'
  25. Compiler.__init__(self, exelist, version, **kwargs)
  26. cc = CCompiler(exelist, version, is_cross, exe_wrapper, **kwargs)
  27. self.id = 'unknown'
  28. self.is_cross = cc.is_cross
  29. self.exe_wrapper = cc.exe_wrapper
  30. def get_display_language(self):
  31. return 'Fortran'
  32. def needs_static_linker(self):
  33. return CCompiler.needs_static_linker(self)
  34. def get_always_args(self):
  35. return CCompiler.get_always_args(self)
  36. def get_linker_debug_crt_args(self):
  37. return CCompiler.get_linker_debug_crt_args(self)
  38. def get_no_stdinc_args(self):
  39. return CCompiler.get_no_stdinc_args(self)
  40. def get_no_stdlib_link_args(self):
  41. return CCompiler.get_no_stdlib_link_args(self)
  42. def get_warn_args(self, level):
  43. return CCompiler.get_warn_args(self, level)
  44. def get_no_warn_args(self):
  45. return CCompiler.get_no_warn_args(self)
  46. def get_soname_args(self, *args):
  47. return CCompiler.get_soname_args(self, *args)
  48. def split_shlib_to_parts(self, fname):
  49. return CCompiler.split_shlib_to_parts(self, fname)
  50. def build_rpath_args(self, *args):
  51. return CCompiler.build_rpath_args(self, *args)
  52. def get_dependency_gen_args(self, outtarget, outfile):
  53. return []
  54. def depfile_for_object(self, objfile):
  55. return CCompiler.depfile_for_object(self, objfile)
  56. def get_depfile_suffix(self):
  57. return CCompiler.get_depfile_suffix(self)
  58. def get_exelist(self):
  59. return CCompiler.get_exelist(self)
  60. def get_linker_exelist(self):
  61. return CCompiler.get_linker_exelist(self)
  62. def get_preprocess_only_args(self):
  63. return ['-cpp'] + CCompiler.get_preprocess_only_args(self)
  64. def get_compile_only_args(self):
  65. return CCompiler.get_compile_only_args(self)
  66. def get_no_optimization_args(self):
  67. return CCompiler.get_no_optimization_args(self)
  68. def get_compiler_check_args(self):
  69. return CCompiler.get_compiler_check_args(self)
  70. def get_output_args(self, target):
  71. return CCompiler.get_output_args(self, target)
  72. def get_linker_output_args(self, outputname):
  73. return CCompiler.get_linker_output_args(self, outputname)
  74. def get_coverage_args(self):
  75. return CCompiler.get_coverage_args(self)
  76. def get_coverage_link_args(self):
  77. return CCompiler.get_coverage_link_args(self)
  78. def get_werror_args(self):
  79. return CCompiler.get_werror_args(self)
  80. def get_std_exe_link_args(self):
  81. return CCompiler.get_std_exe_link_args(self)
  82. def get_include_args(self, path, is_system):
  83. return CCompiler.get_include_args(self, path, is_system)
  84. def get_module_incdir_args(self):
  85. return ('-I', )
  86. def get_module_outdir_args(self, path):
  87. return ['-module' + path]
  88. def module_name_to_filename(self, module_name):
  89. return module_name.lower() + '.mod'
  90. def get_std_shared_lib_link_args(self):
  91. return CCompiler.get_std_shared_lib_link_args(self)
  92. def get_library_dirs_real(self):
  93. return CCompiler.get_library_dirs_real(self)
  94. def get_library_dirs(self):
  95. return CCompiler.get_library_dirs(self)
  96. def get_pic_args(self):
  97. return CCompiler.get_pic_args(self)
  98. def name_string(self):
  99. return CCompiler.name_string(self)
  100. def get_linker_search_args(self, dirname):
  101. return CCompiler.get_linker_search_args(self, dirname)
  102. def get_default_include_dirs(self):
  103. return CCompiler.get_default_include_dirs(self)
  104. def gen_export_dynamic_link_args(self, env):
  105. return CCompiler.gen_export_dynamic_link_args(self, env)
  106. def gen_import_library_args(self, implibname):
  107. return CCompiler.gen_import_library_args(self, implibname)
  108. def sanity_check(self, work_dir, environment):
  109. code = '''program main
  110. integer :: ret = 0
  111. call exit(ret)
  112. end program main'''
  113. return CCompiler.sanity_check_impl(self, work_dir, environment, 'sanitycheckf.f90', code)
  114. def _get_compiler_check_args(self, env, extra_args, dependencies, mode='compile'):
  115. return CCompiler._get_compiler_check_args(self, env, extra_args, dependencies, mode='compile')
  116. def compiles(self, code, env, extra_args=None, dependencies=None, mode='compile'):
  117. return CCompiler.compiles(self, code, env, extra_args, dependencies, mode)
  118. def _build_wrapper(self, code, env, extra_args, dependencies=None, mode='compile', want_output=False):
  119. return CCompiler._build_wrapper(self, code, env, extra_args, dependencies, mode, want_output)
  120. def links(self, code, env, extra_args=None, dependencies=None):
  121. return CCompiler.links(self, code, env, extra_args, dependencies)
  122. def run(self, code, env, extra_args=None, dependencies=None):
  123. return CCompiler.run(self, code, env, extra_args, dependencies)
  124. def get_library_naming(self, env, libtype, strict=False):
  125. return CCompiler.get_library_naming(self, env, libtype, strict)
  126. def find_library_real(self, *args):
  127. return CCompiler.find_library_real(self, *args)
  128. def find_library_impl(self, *args):
  129. return CCompiler.find_library_impl(self, *args)
  130. def find_library(self, libname, env, extra_dirs, libtype='default'):
  131. code = '''program main
  132. call exit(0)
  133. end program main'''
  134. return self.find_library_impl(libname, env, extra_dirs, code, libtype)
  135. def thread_flags(self, env):
  136. return CCompiler.thread_flags(self, env)
  137. def thread_link_flags(self, env):
  138. return CCompiler.thread_link_flags(self, env)
  139. def linker_to_compiler_args(self, args):
  140. return CCompiler.linker_to_compiler_args(self, args)
  141. def has_arguments(self, args, env, code, mode):
  142. return CCompiler.has_arguments(self, args, env, code, mode)
  143. def has_multi_arguments(self, args, env):
  144. return CCompiler.has_multi_arguments(self, args, env)
  145. class GnuFortranCompiler(GnuCompiler, FortranCompiler):
  146. def __init__(self, exelist, version, gcc_type, is_cross, exe_wrapper=None, defines=None, **kwargs):
  147. FortranCompiler.__init__(self, exelist, version, is_cross, exe_wrapper, **kwargs)
  148. GnuCompiler.__init__(self, gcc_type, defines)
  149. default_warn_args = ['-Wall']
  150. self.warn_args = {'1': default_warn_args,
  151. '2': default_warn_args + ['-Wextra'],
  152. '3': default_warn_args + ['-Wextra', '-Wpedantic']}
  153. def get_dependency_gen_args(self, outtarget, outfile):
  154. # Disabled until this is fixed:
  155. # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=62162
  156. # return ['-cpp', '-MD', '-MQ', outtarget]
  157. return []
  158. def get_module_outdir_args(self, path):
  159. return ['-J' + path]
  160. def language_stdlib_only_link_flags(self):
  161. return ['-lgfortran', '-lm', '-lquadmath']
  162. class ElbrusFortranCompiler(GnuFortranCompiler, ElbrusCompiler):
  163. def __init__(self, exelist, version, gcc_type, is_cross, exe_wrapper=None, defines=None, **kwargs):
  164. GnuFortranCompiler.__init__(self, exelist, version, gcc_type, is_cross, exe_wrapper, defines, **kwargs)
  165. ElbrusCompiler.__init__(self, gcc_type, defines)
  166. class G95FortranCompiler(FortranCompiler):
  167. def __init__(self, exelist, version, is_cross, exe_wrapper=None, **kwags):
  168. FortranCompiler.__init__(self, exelist, version, is_cross, exe_wrapper, **kwags)
  169. self.id = 'g95'
  170. default_warn_args = ['-Wall']
  171. self.warn_args = {'1': default_warn_args,
  172. '2': default_warn_args + ['-Wextra'],
  173. '3': default_warn_args + ['-Wextra', '-pedantic']}
  174. def get_module_outdir_args(self, path):
  175. return ['-fmod=' + path]
  176. def get_no_warn_args(self):
  177. # FIXME: Confirm that there's no compiler option to disable all warnings
  178. return []
  179. class SunFortranCompiler(FortranCompiler):
  180. def __init__(self, exelist, version, is_cross, exe_wrapper=None, **kwags):
  181. FortranCompiler.__init__(self, exelist, version, is_cross, exe_wrapper, **kwags)
  182. self.id = 'sun'
  183. def get_dependency_gen_args(self, outtarget, outfile):
  184. return ['-fpp']
  185. def get_always_args(self):
  186. return []
  187. def get_warn_args(self, level):
  188. return []
  189. def get_module_incdir_args(self):
  190. return ('-M', )
  191. def get_module_outdir_args(self, path):
  192. return ['-moddir=' + path]
  193. def openmp_flags(self):
  194. return ['-xopenmp']
  195. class IntelFortranCompiler(IntelCompiler, FortranCompiler):
  196. def __init__(self, exelist, version, is_cross, exe_wrapper=None, **kwags):
  197. self.file_suffixes = ('f90', 'f', 'for', 'ftn', 'fpp')
  198. FortranCompiler.__init__(self, exelist, version, is_cross, exe_wrapper, **kwags)
  199. # FIXME: Add support for OS X and Windows in detect_fortran_compiler so
  200. # we are sent the type of compiler
  201. IntelCompiler.__init__(self, ICC_STANDARD)
  202. self.id = 'intel'
  203. default_warn_args = ['-warn', 'general', '-warn', 'truncated_source']
  204. self.warn_args = {'1': default_warn_args,
  205. '2': default_warn_args + ['-warn', 'unused'],
  206. '3': ['-warn', 'all']}
  207. def get_preprocess_only_args(self):
  208. return ['-cpp', '-EP']
  209. class PathScaleFortranCompiler(FortranCompiler):
  210. def __init__(self, exelist, version, is_cross, exe_wrapper=None, **kwags):
  211. FortranCompiler.__init__(self, exelist, version, is_cross, exe_wrapper, **kwags)
  212. self.id = 'pathscale'
  213. default_warn_args = ['-fullwarn']
  214. self.warn_args = {'1': default_warn_args,
  215. '2': default_warn_args,
  216. '3': default_warn_args}
  217. def openmp_flags(self):
  218. return ['-mp']
  219. class PGIFortranCompiler(FortranCompiler):
  220. def __init__(self, exelist, version, is_cross, exe_wrapper=None, **kwags):
  221. FortranCompiler.__init__(self, exelist, version, is_cross, exe_wrapper, **kwags)
  222. self.id = 'pgi'
  223. default_warn_args = ['-Minform=inform']
  224. self.warn_args = {'1': default_warn_args,
  225. '2': default_warn_args,
  226. '3': default_warn_args}
  227. def get_module_incdir_args(self):
  228. return ('-module', )
  229. def get_no_warn_args(self):
  230. return ['-silent']
  231. def openmp_flags(self):
  232. return ['-fopenmp']
  233. class Open64FortranCompiler(FortranCompiler):
  234. def __init__(self, exelist, version, is_cross, exe_wrapper=None, **kwags):
  235. FortranCompiler.__init__(self, exelist, version, is_cross, exe_wrapper, **kwags)
  236. self.id = 'open64'
  237. default_warn_args = ['-fullwarn']
  238. self.warn_args = {'1': default_warn_args,
  239. '2': default_warn_args,
  240. '3': default_warn_args}
  241. def openmp_flags(self):
  242. return ['-mp']
  243. class NAGFortranCompiler(FortranCompiler):
  244. def __init__(self, exelist, version, is_cross, exe_wrapper=None, **kwags):
  245. FortranCompiler.__init__(self, exelist, version, is_cross, exe_wrapper, **kwags)
  246. self.id = 'nagfor'
  247. def get_warn_args(self, level):
  248. return []
  249. def get_module_outdir_args(self, path):
  250. return ['-mdir', path]
  251. def openmp_flags(self):
  252. return ['-openmp']