quality / test: Fortran type hinting
enhance fortran args tests
This commit is contained in:
parent
df5113252b
commit
5b4ebb5641
|
@ -142,14 +142,15 @@ class FortranCompiler(CLikeCompiler, Compiler):
|
||||||
return filename
|
return filename
|
||||||
|
|
||||||
def find_library(self, libname, env, extra_dirs, libtype: LibType = LibType.PREFER_SHARED):
|
def find_library(self, libname, env, extra_dirs, libtype: LibType = LibType.PREFER_SHARED):
|
||||||
code = '''stop; end program'''
|
code = 'stop; end program'
|
||||||
return self.find_library_impl(libname, env, extra_dirs, code, libtype)
|
return self.find_library_impl(libname, env, extra_dirs, code, libtype)
|
||||||
|
|
||||||
def has_multi_arguments(self, args, env):
|
def has_multi_arguments(self, args: T.Sequence[str], env):
|
||||||
for arg in args[:]:
|
for arg in args[:]:
|
||||||
# some compilers, e.g. GCC, don't warn for unsupported warning-disable
|
# some compilers, e.g. GCC, don't warn for unsupported warning-disable
|
||||||
# flags, so when we are testing a flag like "-Wno-forgotten-towel", also
|
# flags, so when we are testing a flag like "-Wno-forgotten-towel", also
|
||||||
# check the equivalent enable flag too "-Wforgotten-towel"
|
# check the equivalent enable flag too "-Wforgotten-towel"
|
||||||
|
# GCC does error for "-fno-foobar"
|
||||||
if arg.startswith('-Wno-'):
|
if arg.startswith('-Wno-'):
|
||||||
args.append('-W' + arg[5:])
|
args.append('-W' + arg[5:])
|
||||||
if arg.startswith('-Wl,'):
|
if arg.startswith('-Wl,'):
|
||||||
|
@ -197,16 +198,16 @@ class GnuFortranCompiler(GnuCompiler, FortranCompiler):
|
||||||
args.append('-std=' + std.value)
|
args.append('-std=' + std.value)
|
||||||
return args
|
return args
|
||||||
|
|
||||||
def get_dependency_gen_args(self, outtarget, outfile):
|
def get_dependency_gen_args(self, outtarget, outfile) -> T.List[str]:
|
||||||
# Disabled until this is fixed:
|
# Disabled until this is fixed:
|
||||||
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=62162
|
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=62162
|
||||||
# return ['-cpp', '-MD', '-MQ', outtarget]
|
# return ['-cpp', '-MD', '-MQ', outtarget]
|
||||||
return []
|
return []
|
||||||
|
|
||||||
def get_module_outdir_args(self, path):
|
def get_module_outdir_args(self, path: str) -> T.List[str]:
|
||||||
return ['-J' + path]
|
return ['-J' + path]
|
||||||
|
|
||||||
def language_stdlib_only_link_flags(self):
|
def language_stdlib_only_link_flags(self) -> T.List[str]:
|
||||||
return ['-lgfortran', '-lm']
|
return ['-lgfortran', '-lm']
|
||||||
|
|
||||||
class ElbrusFortranCompiler(GnuFortranCompiler, ElbrusCompiler):
|
class ElbrusFortranCompiler(GnuFortranCompiler, ElbrusCompiler):
|
||||||
|
@ -233,7 +234,7 @@ class G95FortranCompiler(FortranCompiler):
|
||||||
'2': default_warn_args + ['-Wextra'],
|
'2': default_warn_args + ['-Wextra'],
|
||||||
'3': default_warn_args + ['-Wextra', '-pedantic']}
|
'3': default_warn_args + ['-Wextra', '-pedantic']}
|
||||||
|
|
||||||
def get_module_outdir_args(self, path):
|
def get_module_outdir_args(self, path: str) -> T.List[str]:
|
||||||
return ['-fmod=' + path]
|
return ['-fmod=' + path]
|
||||||
|
|
||||||
def get_no_warn_args(self):
|
def get_no_warn_args(self):
|
||||||
|
@ -251,7 +252,7 @@ class SunFortranCompiler(FortranCompiler):
|
||||||
FortranCompiler.__init__(self, exelist, version, for_machine, is_cross, info, exe_wrapper, **kwargs)
|
FortranCompiler.__init__(self, exelist, version, for_machine, is_cross, info, exe_wrapper, **kwargs)
|
||||||
self.id = 'sun'
|
self.id = 'sun'
|
||||||
|
|
||||||
def get_dependency_gen_args(self, outtarget, outfile):
|
def get_dependency_gen_args(self, outtarget, outfile) -> T.List[str]:
|
||||||
return ['-fpp']
|
return ['-fpp']
|
||||||
|
|
||||||
def get_always_args(self):
|
def get_always_args(self):
|
||||||
|
@ -263,10 +264,10 @@ class SunFortranCompiler(FortranCompiler):
|
||||||
def get_module_incdir_args(self):
|
def get_module_incdir_args(self):
|
||||||
return ('-M', )
|
return ('-M', )
|
||||||
|
|
||||||
def get_module_outdir_args(self, path):
|
def get_module_outdir_args(self, path: str) -> T.List[str]:
|
||||||
return ['-moddir=' + path]
|
return ['-moddir=' + path]
|
||||||
|
|
||||||
def openmp_flags(self):
|
def openmp_flags(self) -> T.List[str]:
|
||||||
return ['-xopenmp']
|
return ['-xopenmp']
|
||||||
|
|
||||||
|
|
||||||
|
@ -304,7 +305,7 @@ class IntelFortranCompiler(IntelGnuLikeCompiler, FortranCompiler):
|
||||||
args.append('-stand=' + stds[std.value])
|
args.append('-stand=' + stds[std.value])
|
||||||
return args
|
return args
|
||||||
|
|
||||||
def get_preprocess_only_args(self):
|
def get_preprocess_only_args(self) -> T.List[str]:
|
||||||
return ['-cpp', '-EP']
|
return ['-cpp', '-EP']
|
||||||
|
|
||||||
def get_always_args(self):
|
def get_always_args(self):
|
||||||
|
@ -313,7 +314,7 @@ class IntelFortranCompiler(IntelGnuLikeCompiler, FortranCompiler):
|
||||||
val.remove('-pipe')
|
val.remove('-pipe')
|
||||||
return val
|
return val
|
||||||
|
|
||||||
def language_stdlib_only_link_flags(self):
|
def language_stdlib_only_link_flags(self) -> T.List[str]:
|
||||||
return ['-lifcore', '-limf']
|
return ['-lifcore', '-limf']
|
||||||
|
|
||||||
def get_dependency_gen_args(self, outtarget: str, outfile: str) -> T.List[str]:
|
def get_dependency_gen_args(self, outtarget: str, outfile: str) -> T.List[str]:
|
||||||
|
@ -371,7 +372,7 @@ class PathScaleFortranCompiler(FortranCompiler):
|
||||||
'2': default_warn_args,
|
'2': default_warn_args,
|
||||||
'3': default_warn_args}
|
'3': default_warn_args}
|
||||||
|
|
||||||
def openmp_flags(self):
|
def openmp_flags(self) -> T.List[str]:
|
||||||
return ['-mp']
|
return ['-mp']
|
||||||
|
|
||||||
|
|
||||||
|
@ -423,7 +424,7 @@ class Open64FortranCompiler(FortranCompiler):
|
||||||
'2': default_warn_args,
|
'2': default_warn_args,
|
||||||
'3': default_warn_args}
|
'3': default_warn_args}
|
||||||
|
|
||||||
def openmp_flags(self):
|
def openmp_flags(self) -> T.List[str]:
|
||||||
return ['-mp']
|
return ['-mp']
|
||||||
|
|
||||||
|
|
||||||
|
@ -438,8 +439,8 @@ class NAGFortranCompiler(FortranCompiler):
|
||||||
def get_warn_args(self, level):
|
def get_warn_args(self, level):
|
||||||
return []
|
return []
|
||||||
|
|
||||||
def get_module_outdir_args(self, path):
|
def get_module_outdir_args(self, path) -> T.List[str]:
|
||||||
return ['-mdir', path]
|
return ['-mdir', path]
|
||||||
|
|
||||||
def openmp_flags(self):
|
def openmp_flags(self) -> T.List[str]:
|
||||||
return ['-openmp']
|
return ['-openmp']
|
||||||
|
|
|
@ -319,7 +319,7 @@ class CLikeCompiler:
|
||||||
cargs += self.get_compiler_args_for_mode(mode)
|
cargs += self.get_compiler_args_for_mode(mode)
|
||||||
return cargs, largs
|
return cargs, largs
|
||||||
|
|
||||||
def _get_compiler_check_args(self, env, extra_args, dependencies, mode='compile'):
|
def _get_compiler_check_args(self, env, extra_args: list, dependencies, mode: str = 'compile') -> T.List[str]:
|
||||||
if extra_args is None:
|
if extra_args is None:
|
||||||
extra_args = []
|
extra_args = []
|
||||||
else:
|
else:
|
||||||
|
@ -354,11 +354,13 @@ class CLikeCompiler:
|
||||||
args = cargs + extra_args + largs
|
args = cargs + extra_args + largs
|
||||||
return args
|
return args
|
||||||
|
|
||||||
def compiles(self, code, env, *, extra_args=None, dependencies=None, mode='compile', disable_cache=False):
|
def compiles(self, code: str, env, *,
|
||||||
|
extra_args: T.Sequence[T.Union[T.Sequence[str], str]] = None,
|
||||||
|
dependencies=None, mode: str = 'compile', disable_cache=False) -> T.Tuple[bool, bool]:
|
||||||
with self._build_wrapper(code, env, extra_args, dependencies, mode, disable_cache=disable_cache) as p:
|
with self._build_wrapper(code, env, extra_args, dependencies, mode, disable_cache=disable_cache) as p:
|
||||||
return p.returncode == 0, p.cached
|
return p.returncode == 0, p.cached
|
||||||
|
|
||||||
def _build_wrapper(self, code, env, extra_args, dependencies=None, mode='compile', want_output=False, disable_cache=False, temp_dir=None):
|
def _build_wrapper(self, code: str, env, extra_args, dependencies=None, mode: str = 'compile', want_output: bool = False, disable_cache: bool = False, temp_dir=None) -> T.Tuple[bool, bool]:
|
||||||
args = self._get_compiler_check_args(env, extra_args, dependencies, mode)
|
args = self._get_compiler_check_args(env, extra_args, dependencies, mode)
|
||||||
if disable_cache or want_output:
|
if disable_cache or want_output:
|
||||||
return self.compile(code, extra_args=args, mode=mode, want_output=want_output, temp_dir=env.scratch_dir)
|
return self.compile(code, extra_args=args, mode=mode, want_output=want_output, temp_dir=env.scratch_dir)
|
||||||
|
@ -1074,7 +1076,7 @@ class CLikeCompiler:
|
||||||
def linker_to_compiler_args(self, args):
|
def linker_to_compiler_args(self, args):
|
||||||
return args
|
return args
|
||||||
|
|
||||||
def has_arguments(self, args, env, code, mode):
|
def has_arguments(self, args: T.Sequence[str], env, code: str, mode: str) -> T.Tuple[bool, bool]:
|
||||||
return self.compiles(code, env, extra_args=args, mode=mode)
|
return self.compiles(code, env, extra_args=args, mode=mode)
|
||||||
|
|
||||||
def has_multi_arguments(self, args, env):
|
def has_multi_arguments(self, args, env):
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Copyright 2012-2018 The Meson development team
|
# Copyright 2012-2019 The Meson development team
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
# you may not use this file except in compliance with the License.
|
# you may not use this file except in compliance with the License.
|
||||||
# You may obtain a copy of the License at
|
# You may obtain a copy of the License at
|
||||||
|
@ -1621,14 +1621,14 @@ class CompilerHolder(InterpreterObject):
|
||||||
return ExternalLibraryHolder(lib, self.subproject)
|
return ExternalLibraryHolder(lib, self.subproject)
|
||||||
|
|
||||||
@permittedKwargs({})
|
@permittedKwargs({})
|
||||||
def has_argument_method(self, args, kwargs):
|
def has_argument_method(self, args: T.Sequence[str], kwargs) -> bool:
|
||||||
args = mesonlib.stringlistify(args)
|
args = mesonlib.stringlistify(args)
|
||||||
if len(args) != 1:
|
if len(args) != 1:
|
||||||
raise InterpreterException('has_argument takes exactly one argument.')
|
raise InterpreterException('has_argument takes exactly one argument.')
|
||||||
return self.has_multi_arguments_method(args, kwargs)
|
return self.has_multi_arguments_method(args, kwargs)
|
||||||
|
|
||||||
@permittedKwargs({})
|
@permittedKwargs({})
|
||||||
def has_multi_arguments_method(self, args, kwargs):
|
def has_multi_arguments_method(self, args: T.Sequence[str], kwargs: dict):
|
||||||
args = mesonlib.stringlistify(args)
|
args = mesonlib.stringlistify(args)
|
||||||
result, cached = self.compiler.has_multi_arguments(args, self.environment)
|
result, cached = self.compiler.has_multi_arguments(args, self.environment)
|
||||||
if result:
|
if result:
|
||||||
|
@ -1653,11 +1653,11 @@ class CompilerHolder(InterpreterObject):
|
||||||
return supported_args
|
return supported_args
|
||||||
|
|
||||||
@permittedKwargs({})
|
@permittedKwargs({})
|
||||||
def first_supported_argument_method(self, args, kwargs):
|
def first_supported_argument_method(self, args: T.Sequence[str], kwargs: dict) -> T.List[str]:
|
||||||
for i in mesonlib.stringlistify(args):
|
for arg in mesonlib.stringlistify(args):
|
||||||
if self.has_argument_method(i, kwargs):
|
if self.has_argument_method(arg, kwargs):
|
||||||
mlog.log('First supported argument:', mlog.bold(i))
|
mlog.log('First supported argument:', mlog.bold(arg))
|
||||||
return [i]
|
return [arg]
|
||||||
mlog.log('First supported argument:', mlog.red('None'))
|
mlog.log('First supported argument:', mlog.red('None'))
|
||||||
return []
|
return []
|
||||||
|
|
||||||
|
@ -3601,7 +3601,7 @@ external dependencies (including libraries) must go to "dependencies".''')
|
||||||
if 'input' not in kwargs or 'output' not in kwargs:
|
if 'input' not in kwargs or 'output' not in kwargs:
|
||||||
raise InterpreterException('Keyword arguments input and output must exist')
|
raise InterpreterException('Keyword arguments input and output must exist')
|
||||||
if 'fallback' not in kwargs:
|
if 'fallback' not in kwargs:
|
||||||
FeatureNew('T.Optional fallback in vcs_tag', '0.41.0').use(self.subproject)
|
FeatureNew('Optional fallback in vcs_tag', '0.41.0').use(self.subproject)
|
||||||
fallback = kwargs.pop('fallback', self.project_version)
|
fallback = kwargs.pop('fallback', self.project_version)
|
||||||
if not isinstance(fallback, str):
|
if not isinstance(fallback, str):
|
||||||
raise InterpreterException('Keyword argument fallback must be a string.')
|
raise InterpreterException('Keyword argument fallback must be a string.')
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
i = 3
|
||||||
|
end program
|
|
@ -24,3 +24,23 @@ l2 = fc.first_supported_argument(isnt_arg, isnt_arg, isnt_arg)
|
||||||
assert(l1.length() == 1, 'First supported returned wrong result.')
|
assert(l1.length() == 1, 'First supported returned wrong result.')
|
||||||
assert(l1.get(0) == is_arg, 'First supported returned wrong argument.')
|
assert(l1.get(0) == is_arg, 'First supported returned wrong argument.')
|
||||||
assert(l2.length() == 0, 'First supported did not return empty array.')
|
assert(l2.length() == 0, 'First supported did not return empty array.')
|
||||||
|
|
||||||
|
# --- test with an actual program, here for implicit none
|
||||||
|
|
||||||
|
in0 = fc.first_supported_argument('-fimplicit-none', '-Mdclchk', '/warn:declarations', '-warn').get(0, '')
|
||||||
|
impnone = {
|
||||||
|
'intel-cl': '/warn:declarations',
|
||||||
|
'intel': '-warn',
|
||||||
|
'gcc': '-fimplicit-none',
|
||||||
|
'pgi': '-Mdclchk',
|
||||||
|
}
|
||||||
|
|
||||||
|
arg = impnone.get(fc.get_id(), '')
|
||||||
|
if arg != ''
|
||||||
|
assert(in0 == arg, 'implicit none argument ' + arg + ' not matching ' + in0)
|
||||||
|
endif
|
||||||
|
|
||||||
|
in1 = fc.get_supported_arguments('-fimplicit-none', '/warn:declarations', '/warn:errors', '-Mdclchk')
|
||||||
|
if in1.length() > 0
|
||||||
|
assert(not fc.compiles(files('main.f90'), args: in1, name:'will fail implicit none'), 'implicit none should have failed')
|
||||||
|
endif
|
||||||
|
|
Loading…
Reference in New Issue