aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDylan Baker <dylan@pnwbakers.com>2021-06-07 10:03:55 -0700
committerDaniel Mensinger <daniel@mensinger-ka.de>2021-06-08 11:00:55 +0200
commit3f9a81e7f14e166934b6fd44a1236aa808555656 (patch)
tree114fa5f7515d8682bf8999398d08f604d14d394b
parent3e998527a350cb197ca61b59c0a98cb6681b5fdd (diff)
downloadmeson-3f9a81e7f14e166934b6fd44a1236aa808555656.zip
meson-3f9a81e7f14e166934b6fd44a1236aa808555656.tar.gz
meson-3f9a81e7f14e166934b6fd44a1236aa808555656.tar.bz2
interpreter: use typed_kwargs for the add_*_arguments family
This makes use of the new convertor and validator arguments, so that we can check that the languages passed are in fact vaild, and then convert the native boolean into a MachineChoice internally.
-rw-r--r--mesonbuild/interpreter/interpreter.py59
-rw-r--r--mesonbuild/interpreter/kwargs.py26
2 files changed, 65 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
diff --git a/mesonbuild/interpreter/kwargs.py b/mesonbuild/interpreter/kwargs.py
new file mode 100644
index 0000000..d5d9990
--- /dev/null
+++ b/mesonbuild/interpreter/kwargs.py
@@ -0,0 +1,26 @@
+# SPDX-License-Identifier: Apache-2.0
+# Copyright © 2021 The Meson Developers
+# Copyright © 2021 Intel Corporation
+
+"""Keyword Argument type annotations."""
+
+import typing as T
+
+from typing_extensions import TypedDict
+
+from ..mesonlib import MachineChoice
+
+
+class FuncAddProjectArgs(TypedDict):
+
+ """Keyword Arguments for the add_*_arguments family of arguments.
+
+ including `add_global_arguments`, `add_project_arguments`, and their
+ link variants
+
+ Because of the use of a convertor function, we get the native keyword as
+ a MachineChoice instance already.
+ """
+
+ native: MachineChoice
+ language: T.List[str]