BUGFIX: Fortran openmp

This commit is contained in:
Michael Hirsch, Ph.D 2019-02-13 14:06:15 -05:00 committed by Jussi Pakkanen
parent 22c7727ed6
commit 6b874339cc
5 changed files with 36 additions and 23 deletions

View File

@ -14,7 +14,7 @@
import abc, contextlib, enum, os.path, re, tempfile, shlex
import subprocess
from typing import List
from typing import List, Tuple
from ..linkers import StaticLinker
from .. import coredata
@ -1602,18 +1602,18 @@ class GnuCompiler(GnuLikeCompiler):
GnuCompiler represents an actual GCC in its many incarnations.
Compilers imitating GCC (Clang/Intel) should use the GnuLikeCompiler ABC.
"""
def __init__(self, compiler_type, defines):
def __init__(self, compiler_type, defines: dict):
super().__init__(compiler_type)
self.id = 'gcc'
self.defines = defines or {}
self.base_options.append('b_colorout')
def get_colorout_args(self, colortype):
def get_colorout_args(self, colortype: str) -> List[str]:
if mesonlib.version_compare(self.version, '>=4.9.0'):
return gnu_color_args[colortype][:]
return []
def get_warn_args(self, level):
def get_warn_args(self, level: str) -> list:
args = super().get_warn_args(level)
if mesonlib.version_compare(self.version, '<4.8.0') and '-Wpedantic' in args:
# -Wpedantic was added in 4.8.0
@ -1621,20 +1621,20 @@ class GnuCompiler(GnuLikeCompiler):
args[args.index('-Wpedantic')] = '-pedantic'
return args
def has_builtin_define(self, define):
def has_builtin_define(self, define: str) -> bool:
return define in self.defines
def get_builtin_define(self, define):
if define in self.defines:
return self.defines[define]
def get_optimization_args(self, optimization_level):
def get_optimization_args(self, optimization_level: str):
return gnu_optimization_args[optimization_level]
def get_pch_suffix(self):
def get_pch_suffix(self) -> str:
return 'gch'
def openmp_flags(self):
def openmp_flags(self) -> List[str]:
return ['-fopenmp']
@ -1648,7 +1648,7 @@ class PGICompiler:
'2': default_warn_args,
'3': default_warn_args}
def get_module_incdir_args(self) -> List[str]:
def get_module_incdir_args(self) -> Tuple[str]:
return ('-module', )
def get_no_warn_args(self) -> List[str]:
@ -1663,10 +1663,10 @@ class PGICompiler:
def get_buildtype_linker_args(self, buildtype: str) -> List[str]:
return pgi_buildtype_linker_args[buildtype]
def get_optimization_args(self, optimization_level: str) -> List[str]:
def get_optimization_args(self, optimization_level: str):
return clike_optimization_args[optimization_level]
def get_debug_args(self, is_debug: bool) -> List[str]:
def get_debug_args(self, is_debug: bool):
return clike_debug_args[is_debug]
def compute_parameters_with_absolute_paths(self, parameter_list: List[str], build_dir: str):
@ -1898,7 +1898,7 @@ class IntelCompiler(GnuLikeCompiler):
def get_optimization_args(self, optimization_level):
return clike_optimization_args[optimization_level]
def get_pch_suffix(self):
def get_pch_suffix(self) -> str:
return 'pchi'
def get_pch_use_args(self, pch_dir, header):
@ -1908,7 +1908,7 @@ class IntelCompiler(GnuLikeCompiler):
def get_pch_name(self, header_name):
return os.path.basename(header_name) + '.' + self.get_pch_suffix()
def openmp_flags(self):
def openmp_flags(self) -> List[str]:
if version_compare(self.version, '>=15.0.0'):
return ['-qopenmp']
else:

View File

@ -262,6 +262,12 @@ class FortranCompiler(Compiler):
def has_multi_arguments(self, args, env):
return CCompiler.has_multi_arguments(self, args, env)
def has_header(self, hname, prefix, env, *, extra_args=None, dependencies=None):
return CCompiler.has_header(self, hname, prefix, env, extra_args=extra_args, dependencies=dependencies)
def get_define(self, dname, prefix, env, extra_args, dependencies):
return CCompiler.get_define(self, dname, prefix, env, extra_args, dependencies)
@classmethod
def _get_trials_from_pattern(cls, pattern, directory, libname):
return CCompiler._get_trials_from_pattern(pattern, directory, libname)

View File

@ -308,7 +308,7 @@ class OpenMPDependency(ExternalDependency):
else:
mlog.log(mlog.yellow('WARNING:'), 'OpenMP found but omp.h missing.')
def need_openmp(self):
def need_openmp(self) -> bool:
return True

View File

@ -1,8 +1,9 @@
program main
if (omp_get_max_threads() .eq. 2) then
stop 0
else
print *, 'Max threads is', omp_get_max_threads(), 'not 2.'
stop 1
endif
end program main
use, intrinsic :: iso_fortran_env, only: stderr=>error_unit
use omp_lib
if (omp_get_max_threads() /= 2) then
write(stderr, *) 'Max Fortran threads is', omp_get_max_threads(), 'not 2.'
stop 1
endif
end program

View File

@ -43,7 +43,13 @@ if add_languages('fortran', required : false)
exef = executable('exef',
'main.f90',
dependencies : [openmp])
test('OpenMP Fortran', execpp, env : env)
test('OpenMP Fortran', exef, env : env)
openmp_f = dependency('openmp', language : 'fortran')
exe_f = executable('exe_f',
'main.f90',
dependencies : [openmp_f])
test('OpenMP Fortran-specific', exe_f, env : env)
endif
endif