diff options
Diffstat (limited to 'mesonbuild/interpreter/interpreter.py')
-rw-r--r-- | mesonbuild/interpreter/interpreter.py | 59 |
1 files changed, 39 insertions, 20 deletions
diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py index 38ab22f..6f613a1 100644 --- a/mesonbuild/interpreter/interpreter.py +++ b/mesonbuild/interpreter/interpreter.py @@ -25,7 +25,7 @@ from ..mesonlib import FileMode, MachineChoice, OptionKey, listify, extract_as_l from ..programs import ExternalProgram, NonExistingExternalProgram from ..dependencies import Dependency, NotFoundDependency, DependencyException from ..depfile import DepFile -from ..interpreterbase import InterpreterBase, typed_pos_args +from ..interpreterbase import ContainerTypeInfo, InterpreterBase, KwargInfo, typed_kwargs, typed_pos_args from ..interpreterbase import noPosargs, noKwargs, stringArgs, permittedKwargs, noArgsFlattening from ..interpreterbase import InterpreterException, InvalidArguments, InvalidCode, SubdirDoneRequest from ..interpreterbase import InterpreterObject, Disabler, disablerIfNotFound @@ -60,9 +60,7 @@ import typing as T import importlib if T.TYPE_CHECKING: - from ..compilers import Compiler - from ..envconfig import MachineInfo - from ..environment import Environment + from . import kwargs # Input source types passed to Targets SourceInputs = T.Union[mesonlib.File, GeneratedListHolder, TargetHolder, @@ -72,6 +70,31 @@ if T.TYPE_CHECKING: build.BuildTarget, build.CustomTargetIndex, build.GeneratedList] + +def _language_validator(l: T.List[str]) -> T.Optional[str]: + """Validate language keyword argument. + + Particularly for functions like `add_compiler()`, and `add_*_args()` + """ + diff = {a.lower() for a in l}.difference(compilers.all_languages) + if diff: + return f'unknown languages: {", ".join(diff)}' + return None + + +_NATIVE_KW = KwargInfo( + 'native', bool, + default=False, + convertor=lambda n: MachineChoice.BUILD if n else MachineChoice.HOST) + +_LANGUAGE_KW = KwargInfo( + 'language', ContainerTypeInfo(list, str, allow_empty=False), + listify=True, + required=True, + validator=_language_validator, + convertor=lambda x: [i.lower() for i in x]) + + def stringifyUserArguments(args, quote=False): if isinstance(args, list): return '[%s]' % ', '.join([stringifyUserArguments(x, True) for x in args]) @@ -2530,29 +2553,25 @@ This warning will become a hard error in a future Meson release. self.build.test_setups[setup_name] = build.TestSetup(exe_wrapper, gdb, timeout_multiplier, env, exclude_suites) - @permittedKwargs({'language', 'native'}) @typed_pos_args('add_global_arguments', varargs=str) - def func_add_global_arguments(self, node: mparser.FunctionNode, args: T.Tuple[T.List[str]], kwargs): - for_machine = self.machine_from_native_kwarg(kwargs) - self.add_global_arguments(node, self.build.global_args[for_machine], args[0], kwargs) + @typed_kwargs('add_global_arguments', _NATIVE_KW, _LANGUAGE_KW) + def func_add_global_arguments(self, node: mparser.FunctionNode, args: T.Tuple[T.List[str]], kwargs: 'kwargs.FuncAddProjectArgs') -> None: + self.add_global_arguments(node, self.build.global_args[kwargs['native']], args[0], kwargs) - @permittedKwargs({'language', 'native'}) @typed_pos_args('add_global_link_arguments', varargs=str) - def func_add_global_link_arguments(self, node: mparser.FunctionNode, args: T.Tuple[T.List[str]], kwargs): - for_machine = self.machine_from_native_kwarg(kwargs) - self.add_global_arguments(node, self.build.global_link_args[for_machine], args[0], kwargs) + @typed_kwargs('add_global_arguments', _NATIVE_KW, _LANGUAGE_KW) + def func_add_global_link_arguments(self, node: mparser.FunctionNode, args: T.Tuple[T.List[str]], kwargs: 'kwargs.FuncAddProjectArgs') -> None: + self.add_global_arguments(node, self.build.global_link_args[kwargs['native']], args[0], kwargs) - @permittedKwargs({'language', 'native'}) @typed_pos_args('add_project_arguments', varargs=str) - def func_add_project_arguments(self, node: mparser.FunctionNode, args: T.Tuple[T.List[str]], kwargs): - for_machine = self.machine_from_native_kwarg(kwargs) - self.add_project_arguments(node, self.build.projects_args[for_machine], args[0], kwargs) + @typed_kwargs('add_global_arguments', _NATIVE_KW, _LANGUAGE_KW) + def func_add_project_arguments(self, node: mparser.FunctionNode, args: T.Tuple[T.List[str]], kwargs: 'kwargs.FuncAddProjectArgs') -> None: + self.add_project_arguments(node, self.build.projects_args[kwargs['native']], args[0], kwargs) - @permittedKwargs({'language', 'native'}) @typed_pos_args('add_project_link_arguments', varargs=str) - def func_add_project_link_arguments(self, node: mparser.FunctionNode, args: T.Tuple[T.List[str]], kwargs): - for_machine = self.machine_from_native_kwarg(kwargs) - self.add_project_arguments(node, self.build.projects_link_args[for_machine], args[0], kwargs) + @typed_kwargs('add_global_arguments', _NATIVE_KW, _LANGUAGE_KW) + def func_add_project_link_arguments(self, node: mparser.FunctionNode, args: T.Tuple[T.List[str]], kwargs: 'kwargs.FuncAddProjectArgs') -> None: + self.add_project_arguments(node, self.build.projects_link_args[kwargs['native']], args[0], kwargs) def warn_about_builtin_args(self, args): # -Wpedantic is deliberately not included, since some people want to use it but not use -Wextra |