From c9ad98ef5ef8dd1931735f07015bf8ad199cd456 Mon Sep 17 00:00:00 2001 From: Laurin-Luis Lehning <65224843+e820@users.noreply.github.com> Date: Thu, 17 Jun 2021 21:02:51 +0200 Subject: interprter: Add required kwarg to add_(project|global)_arguments To avoid manual compiler support checks add_project_arguments and add_global_arguments receive a new keyword argument to perform them automatically. --- docs/markdown/snippets/required_project_arguments.md | 8 ++++++++ mesonbuild/interpreter/interpreter.py | 18 ++++++++++++++++-- mesonbuild/interpreter/kwargs.py | 1 + .../failing/115 required project arguments/meson.build | 3 +++ .../failing/115 required project arguments/test.json | 7 +++++++ 5 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 docs/markdown/snippets/required_project_arguments.md create mode 100644 test cases/failing/115 required project arguments/meson.build create mode 100644 test cases/failing/115 required project arguments/test.json diff --git a/docs/markdown/snippets/required_project_arguments.md b/docs/markdown/snippets/required_project_arguments.md new file mode 100644 index 0000000..e5dae70 --- /dev/null +++ b/docs/markdown/snippets/required_project_arguments.md @@ -0,0 +1,8 @@ +# Required project & global arguments + +The `add_global_arguments` & `add_project_arguments` functions now +support an optional keyword argument named `required`. Setting it +to `true` will cause Meson to perform compiler support checks on +each of the passed arguments as if by calling `has_argument`, which +means manual checks can now be avoided and instead expressed more +tersely. diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py index be17c9a..6679aaf 100644 --- a/mesonbuild/interpreter/interpreter.py +++ b/mesonbuild/interpreter/interpreter.py @@ -2321,8 +2321,9 @@ This will become a hard error in the future.''' % kwargs['input'], location=self self.build.test_setups[setup_name] = build.TestSetup(exe_wrapper, gdb, timeout_multiplier, env, exclude_suites) + @FeatureNewKwargs('add_global_arguments', '0.59.0', ['required']) @typed_pos_args('add_global_arguments', varargs=str) - @typed_kwargs('add_global_arguments', _NATIVE_KW, _LANGUAGE_KW) + @typed_kwargs('add_global_arguments', _NATIVE_KW, _LANGUAGE_KW, KwargInfo('required', bool, default=False)) 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) @@ -2331,8 +2332,9 @@ This will become a hard error in the future.''' % kwargs['input'], location=self 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) + @FeatureNewKwargs('add_project_arguments', '0.59.0', ['required']) @typed_pos_args('add_project_arguments', varargs=str) - @typed_kwargs('add_global_arguments', _NATIVE_KW, _LANGUAGE_KW) + @typed_kwargs('add_project_arguments', _NATIVE_KW, _LANGUAGE_KW, KwargInfo('required', bool, default=False)) 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) @@ -2398,6 +2400,18 @@ This will become a hard error in the future.''' % kwargs['input'], location=self self._warn_about_builtin_args(args) + try: + if kwargs['required']: + compilers = self.coredata.compilers.build.values() if kwargs['native'] \ + else self.coredata.compilers.host.values() + + for c in compilers: + for arg in args: + if not c.has_multi_arguments([arg], self.environment)[0]: + raise mesonlib.MesonException(f'C compiler does not support "{arg}"') + except KeyError: + pass + for lang in kwargs['language']: argsdict[lang] = argsdict.get(lang, []) + args diff --git a/mesonbuild/interpreter/kwargs.py b/mesonbuild/interpreter/kwargs.py index 1cc2082..e1ff2a8 100644 --- a/mesonbuild/interpreter/kwargs.py +++ b/mesonbuild/interpreter/kwargs.py @@ -27,6 +27,7 @@ class FuncAddProjectArgs(TypedDict): native: MachineChoice language: T.List[str] + required: bool class BaseTest(TypedDict): diff --git a/test cases/failing/115 required project arguments/meson.build b/test cases/failing/115 required project arguments/meson.build new file mode 100644 index 0000000..a871cdf --- /dev/null +++ b/test cases/failing/115 required project arguments/meson.build @@ -0,0 +1,3 @@ +project('add_project_arguments test', 'c') + +add_project_arguments('-meson-goober-arg-for-testing', language : 'c', required : true) diff --git a/test cases/failing/115 required project arguments/test.json b/test cases/failing/115 required project arguments/test.json new file mode 100644 index 0000000..e7e0c60 --- /dev/null +++ b/test cases/failing/115 required project arguments/test.json @@ -0,0 +1,7 @@ +{ + "stdout": [ + { + "line": "test cases/failing/115 required project arguments/meson.build:3:0: ERROR: C compiler does not support \"-meson-goober-arg-for-testing\"" + } + ] +} -- cgit v1.1 From e44587fc735f096eff179cd292015eb8999e1fe3 Mon Sep 17 00:00:00 2001 From: Laurin-Luis Lehning <65224843+e820@users.noreply.github.com> Date: Thu, 17 Jun 2021 21:22:26 +0200 Subject: interpreter: Consider the compiler language before checking arguments --- mesonbuild/interpreter/interpreter.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py index 6679aaf..95537fd 100644 --- a/mesonbuild/interpreter/interpreter.py +++ b/mesonbuild/interpreter/interpreter.py @@ -2402,10 +2402,13 @@ This will become a hard error in the future.''' % kwargs['input'], location=self try: if kwargs['required']: - compilers = self.coredata.compilers.build.values() if kwargs['native'] \ + compilers = self.coredata.compilers.build.values() if kwargs['native'] == MachineChoice.BUILD \ else self.coredata.compilers.host.values() for c in compilers: + if not c.language in kwargs['language']: + continue + for arg in args: if not c.has_multi_arguments([arg], self.environment)[0]: raise mesonlib.MesonException(f'C compiler does not support "{arg}"') -- cgit v1.1 From 377adfb6fbf526c56b595ef09840d5b59168162a Mon Sep 17 00:00:00 2001 From: Laurin-Luis Lehning <65224843+e820@users.noreply.github.com> Date: Thu, 17 Jun 2021 22:11:51 +0200 Subject: docs: Fix snippet heading for required project arguments --- docs/markdown/snippets/required_project_arguments.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/markdown/snippets/required_project_arguments.md b/docs/markdown/snippets/required_project_arguments.md index e5dae70..40af830 100644 --- a/docs/markdown/snippets/required_project_arguments.md +++ b/docs/markdown/snippets/required_project_arguments.md @@ -1,4 +1,4 @@ -# Required project & global arguments +## Required project & global arguments The `add_global_arguments` & `add_project_arguments` functions now support an optional keyword argument named `required`. Setting it -- cgit v1.1 From d5ed8f61a5cd7a5d384ccd59abc219154a00d42c Mon Sep 17 00:00:00 2001 From: Laurin-Luis Lehning <65224843+e820@users.noreply.github.com> Date: Fri, 18 Jun 2021 01:42:57 +0200 Subject: interpreter: Move argument checks from add_*_arguments to compiler.get_supported_arguments --- .../markdown/snippets/compiler_argument_checking.md | 6 ++++++ .../markdown/snippets/required_project_arguments.md | 8 -------- mesonbuild/interpreter/compiler.py | 19 ++++++++++++++++--- mesonbuild/interpreter/interpreter.py | 21 ++------------------- mesonbuild/interpreter/kwargs.py | 1 - .../115 compiler argument checking/meson.build | 4 ++++ .../115 compiler argument checking/test.json | 7 +++++++ .../115 required project arguments/meson.build | 3 --- .../115 required project arguments/test.json | 7 ------- 9 files changed, 35 insertions(+), 41 deletions(-) create mode 100644 docs/markdown/snippets/compiler_argument_checking.md delete mode 100644 docs/markdown/snippets/required_project_arguments.md create mode 100644 test cases/failing/115 compiler argument checking/meson.build create mode 100644 test cases/failing/115 compiler argument checking/test.json delete mode 100644 test cases/failing/115 required project arguments/meson.build delete mode 100644 test cases/failing/115 required project arguments/test.json diff --git a/docs/markdown/snippets/compiler_argument_checking.md b/docs/markdown/snippets/compiler_argument_checking.md new file mode 100644 index 0000000..0e038ec --- /dev/null +++ b/docs/markdown/snippets/compiler_argument_checking.md @@ -0,0 +1,6 @@ +## Compiler argument checking for `get_supported_arguments` + +The compiler method `get_supported_arguments` now supports +a new keyword argument named `checked` that can be set to +one of `warn`, `require` or `off` (defaults to `off`) to +enforce argument checks. diff --git a/docs/markdown/snippets/required_project_arguments.md b/docs/markdown/snippets/required_project_arguments.md deleted file mode 100644 index 40af830..0000000 --- a/docs/markdown/snippets/required_project_arguments.md +++ /dev/null @@ -1,8 +0,0 @@ -## Required project & global arguments - -The `add_global_arguments` & `add_project_arguments` functions now -support an optional keyword argument named `required`. Setting it -to `true` will cause Meson to perform compiler support checks on -each of the passed arguments as if by calling `has_argument`, which -means manual checks can now be avoided and instead expressed more -tersely. diff --git a/mesonbuild/interpreter/compiler.py b/mesonbuild/interpreter/compiler.py index bf32be3..9a6beeb 100644 --- a/mesonbuild/interpreter/compiler.py +++ b/mesonbuild/interpreter/compiler.py @@ -1,4 +1,5 @@ import functools +from mesonbuild.interpreterbase.decorators import typed_kwargs, KwargInfo from .interpreterobjects import (extract_required_kwarg, extract_search_dirs) @@ -684,12 +685,24 @@ class CompilerHolder(ObjectHolder['Compiler']): return result @FeatureNew('compiler.get_supported_arguments', '0.43.0') - @permittedKwargs({}) - def get_supported_arguments_method(self, args, kwargs): + @FeatureNewKwargs('compiler.get_supported_arguments', '0.59.0', ['checked']) + @typed_kwargs('compiler.get_supported_arguments', KwargInfo('checked', str, default='off')) + def get_supported_arguments_method(self, args: T.Sequence[str], kwargs: T.Dict[str, T.Any]): args = mesonlib.stringlistify(args) supported_args = [] + checked = kwargs.pop('checked') + + if checked not in ['warn', 'require', 'off']: + raise mesonlib.MesonException('"checked" kwarg must be one of "warn", "require" or "off"') + for arg in args: - if self.has_argument_method(arg, kwargs): + if not self.has_argument_method(arg, kwargs): + msg = f'Compiler for {self.compiler.get_display_language()} does not support "{arg}"' + if checked == 'warn': + mlog.warning(msg) + elif checked == 'require': + raise mesonlib.MesonException(msg) + else: supported_args.append(arg) return supported_args diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py index 95537fd..5be99b4 100644 --- a/mesonbuild/interpreter/interpreter.py +++ b/mesonbuild/interpreter/interpreter.py @@ -2321,9 +2321,8 @@ This will become a hard error in the future.''' % kwargs['input'], location=self self.build.test_setups[setup_name] = build.TestSetup(exe_wrapper, gdb, timeout_multiplier, env, exclude_suites) - @FeatureNewKwargs('add_global_arguments', '0.59.0', ['required']) @typed_pos_args('add_global_arguments', varargs=str) - @typed_kwargs('add_global_arguments', _NATIVE_KW, _LANGUAGE_KW, KwargInfo('required', bool, default=False)) + @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) @@ -2332,9 +2331,8 @@ This will become a hard error in the future.''' % kwargs['input'], location=self 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) - @FeatureNewKwargs('add_project_arguments', '0.59.0', ['required']) @typed_pos_args('add_project_arguments', varargs=str) - @typed_kwargs('add_project_arguments', _NATIVE_KW, _LANGUAGE_KW, KwargInfo('required', bool, default=False)) + @typed_kwargs('add_project_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) @@ -2400,21 +2398,6 @@ This will become a hard error in the future.''' % kwargs['input'], location=self self._warn_about_builtin_args(args) - try: - if kwargs['required']: - compilers = self.coredata.compilers.build.values() if kwargs['native'] == MachineChoice.BUILD \ - else self.coredata.compilers.host.values() - - for c in compilers: - if not c.language in kwargs['language']: - continue - - for arg in args: - if not c.has_multi_arguments([arg], self.environment)[0]: - raise mesonlib.MesonException(f'C compiler does not support "{arg}"') - except KeyError: - pass - for lang in kwargs['language']: argsdict[lang] = argsdict.get(lang, []) + args diff --git a/mesonbuild/interpreter/kwargs.py b/mesonbuild/interpreter/kwargs.py index e1ff2a8..1cc2082 100644 --- a/mesonbuild/interpreter/kwargs.py +++ b/mesonbuild/interpreter/kwargs.py @@ -27,7 +27,6 @@ class FuncAddProjectArgs(TypedDict): native: MachineChoice language: T.List[str] - required: bool class BaseTest(TypedDict): diff --git a/test cases/failing/115 compiler argument checking/meson.build b/test cases/failing/115 compiler argument checking/meson.build new file mode 100644 index 0000000..bb1f447 --- /dev/null +++ b/test cases/failing/115 compiler argument checking/meson.build @@ -0,0 +1,4 @@ +project('compiler argument checking test', 'c') + +cc = meson.get_compiler('c') +add_project_arguments(cc.get_supported_arguments('-meson-goober-arg-for-testing', checked : 'require'), language : 'c') diff --git a/test cases/failing/115 compiler argument checking/test.json b/test cases/failing/115 compiler argument checking/test.json new file mode 100644 index 0000000..93f9476 --- /dev/null +++ b/test cases/failing/115 compiler argument checking/test.json @@ -0,0 +1,7 @@ +{ + "stdout": [ + { + "line": "test cases/failing/115 compiler argument checking/meson.build:4:0: ERROR: Compiler for C does not support \"-meson-goober-arg-for-testing\"" + } + ] +} diff --git a/test cases/failing/115 required project arguments/meson.build b/test cases/failing/115 required project arguments/meson.build deleted file mode 100644 index a871cdf..0000000 --- a/test cases/failing/115 required project arguments/meson.build +++ /dev/null @@ -1,3 +0,0 @@ -project('add_project_arguments test', 'c') - -add_project_arguments('-meson-goober-arg-for-testing', language : 'c', required : true) diff --git a/test cases/failing/115 required project arguments/test.json b/test cases/failing/115 required project arguments/test.json deleted file mode 100644 index e7e0c60..0000000 --- a/test cases/failing/115 required project arguments/test.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "stdout": [ - { - "line": "test cases/failing/115 required project arguments/meson.build:3:0: ERROR: C compiler does not support \"-meson-goober-arg-for-testing\"" - } - ] -} -- cgit v1.1 From 281f5abee342b7b53ea50dd8280df4a410382f75 Mon Sep 17 00:00:00 2001 From: Laurin-Luis Lehning <65224843+e820@users.noreply.github.com> Date: Tue, 22 Jun 2021 07:59:08 +0200 Subject: interpreter: Replace manual kwarg validation in compiler.get_supported_arguments with @typed_kwargs --- mesonbuild/interpreter/compiler.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/mesonbuild/interpreter/compiler.py b/mesonbuild/interpreter/compiler.py index 9a6beeb..b1eef2f 100644 --- a/mesonbuild/interpreter/compiler.py +++ b/mesonbuild/interpreter/compiler.py @@ -1,5 +1,6 @@ import functools -from mesonbuild.interpreterbase.decorators import typed_kwargs, KwargInfo + +from ..interpreterbase.decorators import typed_kwargs, KwargInfo from .interpreterobjects import (extract_required_kwarg, extract_search_dirs) @@ -685,16 +686,16 @@ class CompilerHolder(ObjectHolder['Compiler']): return result @FeatureNew('compiler.get_supported_arguments', '0.43.0') - @FeatureNewKwargs('compiler.get_supported_arguments', '0.59.0', ['checked']) - @typed_kwargs('compiler.get_supported_arguments', KwargInfo('checked', str, default='off')) + @typed_kwargs( + 'compiler.get_supported_arguments', + KwargInfo('checked', str, default='off', since='0.59.0', + validator=lambda s: 'must be one of "warn", "require" or "off"' if s not in ['warn', 'require', 'off'] else None) + ) def get_supported_arguments_method(self, args: T.Sequence[str], kwargs: T.Dict[str, T.Any]): args = mesonlib.stringlistify(args) supported_args = [] checked = kwargs.pop('checked') - if checked not in ['warn', 'require', 'off']: - raise mesonlib.MesonException('"checked" kwarg must be one of "warn", "require" or "off"') - for arg in args: if not self.has_argument_method(arg, kwargs): msg = f'Compiler for {self.compiler.get_display_language()} does not support "{arg}"' -- cgit v1.1