Merge pull request #3127 from bluetech/method-permitted-kwargs

pull/3219/head
Jussi Pakkanen 7 years ago committed by GitHub
commit 9ecb75670f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 107
      mesonbuild/interpreter.py
  2. 16
      mesonbuild/interpreterbase.py
  3. 10
      run_unittests.py
  4. 2
      test cases/linuxlike/9 compiler checks with dependencies/meson.build
  5. 5
      test cases/unit/23 non-permitted kwargs/meson.build

@ -25,7 +25,7 @@ from .mesonlib import FileMode, Popen_safe, listify, extract_as_list
from .dependencies import ExternalProgram from .dependencies import ExternalProgram
from .dependencies import InternalDependency, Dependency, DependencyException from .dependencies import InternalDependency, Dependency, DependencyException
from .interpreterbase import InterpreterBase from .interpreterbase import InterpreterBase
from .interpreterbase import check_stringlist, noPosargs, noKwargs, stringArgs, permittedKwargs from .interpreterbase import check_stringlist, noPosargs, noKwargs, stringArgs, permittedKwargs, permittedMethodKwargs
from .interpreterbase import InterpreterException, InvalidArguments, InvalidCode from .interpreterbase import InterpreterException, InvalidArguments, InvalidCode
from .interpreterbase import InterpreterObject, MutableInterpreterObject, Disabler from .interpreterbase import InterpreterObject, MutableInterpreterObject, Disabler
from .modules import ModuleReturnValue from .modules import ModuleReturnValue
@ -720,9 +720,11 @@ class CompilerHolder(InterpreterObject):
'symbols_have_underscore_prefix': self.symbols_have_underscore_prefix_method, 'symbols_have_underscore_prefix': self.symbols_have_underscore_prefix_method,
}) })
@permittedMethodKwargs({})
def version_method(self, args, kwargs): def version_method(self, args, kwargs):
return self.compiler.version return self.compiler.version
@permittedMethodKwargs({})
def cmd_array_method(self, args, kwargs): def cmd_array_method(self, args, kwargs):
return self.compiler.exelist return self.compiler.exelist
@ -762,6 +764,11 @@ class CompilerHolder(InterpreterObject):
deps = final_deps deps = final_deps
return deps return deps
@permittedMethodKwargs({
'prefix',
'args',
'dependencies',
})
def alignment_method(self, args, kwargs): def alignment_method(self, args, kwargs):
if len(args) != 1: if len(args) != 1:
raise InterpreterException('Alignment method takes exactly one positional argument.') raise InterpreterException('Alignment method takes exactly one positional argument.')
@ -776,6 +783,13 @@ class CompilerHolder(InterpreterObject):
mlog.log('Checking for alignment of "', mlog.bold(typename), '": ', result, sep='') mlog.log('Checking for alignment of "', mlog.bold(typename), '": ', result, sep='')
return result return result
@permittedMethodKwargs({
'name',
'no_builtin_args',
'include_directories',
'args',
'dependencies',
})
def run_method(self, args, kwargs): def run_method(self, args, kwargs):
if len(args) != 1: if len(args) != 1:
raise InterpreterException('Run method takes exactly one positional argument.') raise InterpreterException('Run method takes exactly one positional argument.')
@ -801,9 +815,11 @@ class CompilerHolder(InterpreterObject):
mlog.log('Checking if "', mlog.bold(testname), '" runs: ', h, sep='') mlog.log('Checking if "', mlog.bold(testname), '" runs: ', h, sep='')
return TryRunResultHolder(result) return TryRunResultHolder(result)
@permittedMethodKwargs({})
def get_id_method(self, args, kwargs): def get_id_method(self, args, kwargs):
return self.compiler.get_id() return self.compiler.get_id()
@permittedMethodKwargs({})
def symbols_have_underscore_prefix_method(self, args, kwargs): def symbols_have_underscore_prefix_method(self, args, kwargs):
''' '''
Check if the compiler prefixes _ (underscore) to global C symbols Check if the compiler prefixes _ (underscore) to global C symbols
@ -811,6 +827,7 @@ class CompilerHolder(InterpreterObject):
''' '''
return self.compiler.symbols_have_underscore_prefix(self.environment) return self.compiler.symbols_have_underscore_prefix(self.environment)
@permittedMethodKwargs({})
def unittest_args_method(self, args, kwargs): def unittest_args_method(self, args, kwargs):
''' '''
This function is deprecated and should not be used. This function is deprecated and should not be used.
@ -821,6 +838,13 @@ class CompilerHolder(InterpreterObject):
build_to_src = os.path.relpath(self.environment.get_source_dir(), self.environment.get_build_dir()) build_to_src = os.path.relpath(self.environment.get_source_dir(), self.environment.get_build_dir())
return self.compiler.get_feature_args({'unittest': 'true'}, build_to_src) return self.compiler.get_feature_args({'unittest': 'true'}, build_to_src)
@permittedMethodKwargs({
'prefix',
'no_builtin_args',
'include_directories',
'args',
'dependencies',
})
def has_member_method(self, args, kwargs): def has_member_method(self, args, kwargs):
if len(args) != 2: if len(args) != 2:
raise InterpreterException('Has_member takes exactly two arguments.') raise InterpreterException('Has_member takes exactly two arguments.')
@ -842,6 +866,13 @@ class CompilerHolder(InterpreterObject):
'" has member "', mlog.bold(membername), '": ', hadtxt, sep='') '" has member "', mlog.bold(membername), '": ', hadtxt, sep='')
return had return had
@permittedMethodKwargs({
'prefix',
'no_builtin_args',
'include_directories',
'args',
'dependencies',
})
def has_members_method(self, args, kwargs): def has_members_method(self, args, kwargs):
check_stringlist(args) check_stringlist(args)
typename = args[0] typename = args[0]
@ -862,6 +893,13 @@ class CompilerHolder(InterpreterObject):
'" has members ', members, ': ', hadtxt, sep='') '" has members ', members, ': ', hadtxt, sep='')
return had return had
@permittedMethodKwargs({
'prefix',
'no_builtin_args',
'include_directories',
'args',
'dependencies',
})
def has_function_method(self, args, kwargs): def has_function_method(self, args, kwargs):
if len(args) != 1: if len(args) != 1:
raise InterpreterException('Has_function takes exactly one argument.') raise InterpreterException('Has_function takes exactly one argument.')
@ -880,6 +918,13 @@ class CompilerHolder(InterpreterObject):
mlog.log('Checking for function "', mlog.bold(funcname), '": ', hadtxt, sep='') mlog.log('Checking for function "', mlog.bold(funcname), '": ', hadtxt, sep='')
return had return had
@permittedMethodKwargs({
'prefix',
'no_builtin_args',
'include_directories',
'args',
'dependencies',
})
def has_type_method(self, args, kwargs): def has_type_method(self, args, kwargs):
if len(args) != 1: if len(args) != 1:
raise InterpreterException('Has_type takes exactly one argument.') raise InterpreterException('Has_type takes exactly one argument.')
@ -898,6 +943,16 @@ class CompilerHolder(InterpreterObject):
mlog.log('Checking for type "', mlog.bold(typename), '": ', hadtxt, sep='') mlog.log('Checking for type "', mlog.bold(typename), '": ', hadtxt, sep='')
return had return had
@permittedMethodKwargs({
'prefix',
'low',
'high',
'guess',
'no_builtin_args',
'include_directories',
'args',
'dependencies',
})
def compute_int_method(self, args, kwargs): def compute_int_method(self, args, kwargs):
if len(args) != 1: if len(args) != 1:
raise InterpreterException('Compute_int takes exactly one argument.') raise InterpreterException('Compute_int takes exactly one argument.')
@ -921,6 +976,13 @@ class CompilerHolder(InterpreterObject):
mlog.log('Computing int of "%s": %d' % (expression, res)) mlog.log('Computing int of "%s": %d' % (expression, res))
return res return res
@permittedMethodKwargs({
'prefix',
'no_builtin_args',
'include_directories',
'args',
'dependencies',
})
def sizeof_method(self, args, kwargs): def sizeof_method(self, args, kwargs):
if len(args) != 1: if len(args) != 1:
raise InterpreterException('Sizeof takes exactly one argument.') raise InterpreterException('Sizeof takes exactly one argument.')
@ -935,6 +997,13 @@ class CompilerHolder(InterpreterObject):
mlog.log('Checking for size of "%s": %d' % (element, esize)) mlog.log('Checking for size of "%s": %d' % (element, esize))
return esize return esize
@permittedMethodKwargs({
'prefix',
'no_builtin_args',
'include_directories',
'args',
'dependencies',
})
def get_define_method(self, args, kwargs): def get_define_method(self, args, kwargs):
if len(args) != 1: if len(args) != 1:
raise InterpreterException('get_define() takes exactly one argument.') raise InterpreterException('get_define() takes exactly one argument.')
@ -949,6 +1018,13 @@ class CompilerHolder(InterpreterObject):
mlog.log('Fetching value of define "%s": %s' % (element, value)) mlog.log('Fetching value of define "%s": %s' % (element, value))
return value return value
@permittedMethodKwargs({
'name',
'no_builtin_args',
'include_directories',
'args',
'dependencies',
})
def compiles_method(self, args, kwargs): def compiles_method(self, args, kwargs):
if len(args) != 1: if len(args) != 1:
raise InterpreterException('compiles method takes exactly one argument.') raise InterpreterException('compiles method takes exactly one argument.')
@ -972,6 +1048,13 @@ class CompilerHolder(InterpreterObject):
mlog.log('Checking if "', mlog.bold(testname), '" compiles: ', h, sep='') mlog.log('Checking if "', mlog.bold(testname), '" compiles: ', h, sep='')
return result return result
@permittedMethodKwargs({
'name',
'no_builtin_args',
'include_directories',
'args',
'dependencies',
})
def links_method(self, args, kwargs): def links_method(self, args, kwargs):
if len(args) != 1: if len(args) != 1:
raise InterpreterException('links method takes exactly one argument.') raise InterpreterException('links method takes exactly one argument.')
@ -995,6 +1078,13 @@ class CompilerHolder(InterpreterObject):
mlog.log('Checking if "', mlog.bold(testname), '" links: ', h, sep='') mlog.log('Checking if "', mlog.bold(testname), '" links: ', h, sep='')
return result return result
@permittedMethodKwargs({
'prefix',
'no_builtin_args',
'include_directories',
'args',
'dependencies',
})
def has_header_method(self, args, kwargs): def has_header_method(self, args, kwargs):
if len(args) != 1: if len(args) != 1:
raise InterpreterException('has_header method takes exactly one argument.') raise InterpreterException('has_header method takes exactly one argument.')
@ -1013,6 +1103,13 @@ class CompilerHolder(InterpreterObject):
mlog.log('Has header "%s":' % hname, h) mlog.log('Has header "%s":' % hname, h)
return haz return haz
@permittedMethodKwargs({
'prefix',
'no_builtin_args',
'include_directories',
'args',
'dependencies',
})
def has_header_symbol_method(self, args, kwargs): def has_header_symbol_method(self, args, kwargs):
if len(args) != 2: if len(args) != 2:
raise InterpreterException('has_header_symbol method takes exactly two arguments.') raise InterpreterException('has_header_symbol method takes exactly two arguments.')
@ -1032,6 +1129,10 @@ class CompilerHolder(InterpreterObject):
mlog.log('Header <{0}> has symbol "{1}":'.format(hname, symbol), h) mlog.log('Header <{0}> has symbol "{1}":'.format(hname, symbol), h)
return haz return haz
@permittedMethodKwargs({
'required',
'dirs',
})
def find_library_method(self, args, kwargs): def find_library_method(self, args, kwargs):
# TODO add dependencies support? # TODO add dependencies support?
if len(args) != 1: if len(args) != 1:
@ -1053,6 +1154,7 @@ class CompilerHolder(InterpreterObject):
self.compiler.language) self.compiler.language)
return ExternalLibraryHolder(lib) return ExternalLibraryHolder(lib)
@permittedMethodKwargs({})
def has_argument_method(self, args, kwargs): def has_argument_method(self, args, kwargs):
args = mesonlib.stringlistify(args) args = mesonlib.stringlistify(args)
if len(args) != 1: if len(args) != 1:
@ -1065,6 +1167,7 @@ class CompilerHolder(InterpreterObject):
mlog.log('Compiler for {} supports argument {}:'.format(self.compiler.get_display_language(), args[0]), h) mlog.log('Compiler for {} supports argument {}:'.format(self.compiler.get_display_language(), args[0]), h)
return result return result
@permittedMethodKwargs({})
def has_multi_arguments_method(self, args, kwargs): def has_multi_arguments_method(self, args, kwargs):
args = mesonlib.stringlistify(args) args = mesonlib.stringlistify(args)
result = self.compiler.has_multi_arguments(args, self.environment) result = self.compiler.has_multi_arguments(args, self.environment)
@ -1078,6 +1181,7 @@ class CompilerHolder(InterpreterObject):
h) h)
return result return result
@permittedMethodKwargs({})
def get_supported_arguments_method(self, args, kwargs): def get_supported_arguments_method(self, args, kwargs):
args = mesonlib.stringlistify(args) args = mesonlib.stringlistify(args)
result = self.compiler.get_supported_arguments(args, self.environment) result = self.compiler.get_supported_arguments(args, self.environment)
@ -1093,6 +1197,7 @@ class CompilerHolder(InterpreterObject):
h) h)
return result return result
@permittedMethodKwargs({})
def first_supported_argument_method(self, args, kwargs): def first_supported_argument_method(self, args, kwargs):
for i in mesonlib.stringlistify(args): for i in mesonlib.stringlistify(args):
if self.compiler.has_argument(i, self.environment): if self.compiler.has_argument(i, self.environment):

@ -80,6 +80,22 @@ class permittedKwargs:
return wrapped return wrapped
class permittedMethodKwargs:
def __init__(self, permitted):
self.permitted = permitted
def __call__(self, f):
@wraps(f)
def wrapped(obj, args, kwargs):
for k in kwargs:
if k not in self.permitted:
mlog.warning('''Passed invalid keyword argument "{}".'''.format(k))
mlog.warning('This will become a hard error in the future.')
return f(obj, args, kwargs)
return wrapped
class InterpreterException(mesonlib.MesonException): class InterpreterException(mesonlib.MesonException):
pass pass

@ -1781,6 +1781,16 @@ int main(int argc, char **argv) {
]: ]:
self.assertRegex(out, re.escape(expected)) self.assertRegex(out, re.escape(expected))
def test_permitted_method_kwargs(self):
tdir = os.path.join(self.unit_test_dir, '23 non-permitted kwargs')
out = self.init(tdir)
for expected in [
r'WARNING: Passed invalid keyword argument "prefixxx".',
r'WARNING: Passed invalid keyword argument "argsxx".',
r'WARNING: Passed invalid keyword argument "invalidxx".',
]:
self.assertRegex(out, re.escape(expected))
def test_templates(self): def test_templates(self):
ninja = detect_ninja() ninja = detect_ninja()
if ninja is None: if ninja is None:

@ -26,7 +26,7 @@ int main(int argc, char *argv[]) {
return ptr == 0; return ptr == 0;
} }
''' '''
assert (cc.has_function('deflate', prefix : '#include<zlib.h>', dependencies : zlib, name : 'Test for function in zlib'), 'has_function test failed.') assert (cc.has_function('deflate', prefix : '#include<zlib.h>', dependencies : zlib), 'has_function test failed.')
assert (cc.links(linkcode, dependencies : zlib, name : 'Test link against zlib'), 'Linking test failed against zlib.') assert (cc.links(linkcode, dependencies : zlib, name : 'Test link against zlib'), 'Linking test failed against zlib.')
endif endif

@ -0,0 +1,5 @@
project('non-permitted kwargs', 'c')
cc = meson.get_compiler('c')
cc.has_header_symbol('stdio.h', 'printf', prefixxx: '#define XXX')
cc.links('int main(){}', argsxx: '')
cc.get_id(invalidxx: '')
Loading…
Cancel
Save