diff options
author | Dylan Baker <dylan@pnwbakers.com> | 2021-06-01 21:13:38 -0700 |
---|---|---|
committer | Dylan Baker <dylan@pnwbakers.com> | 2021-06-15 12:48:53 -0700 |
commit | 35bdaada1dfb64366f1533a79fea670502f69732 (patch) | |
tree | e334647e95426a6505b6365ab1cba58ddbd2ecd7 /mesonbuild/interpreter/interpreter.py | |
parent | 491c756dc99fa4b126ddcbbee7de149d47c9199f (diff) | |
download | meson-35bdaada1dfb64366f1533a79fea670502f69732.zip meson-35bdaada1dfb64366f1533a79fea670502f69732.tar.gz meson-35bdaada1dfb64366f1533a79fea670502f69732.tar.bz2 |
interpreter|build: Do Generator keyword argument checking in the interpreter
For qt we already have all of the necissary checking in place. Now in
the interpreter we have the same, the intrperter does all of the
checking, then passed the arguments to the Generator initializer, which
just assigns the passed values. This is nice, neat, and clean and fixes
the layering violatino between build and interpreter.
Diffstat (limited to 'mesonbuild/interpreter/interpreter.py')
-rw-r--r-- | mesonbuild/interpreter/interpreter.py | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py index f2b1bd9..dce0391 100644 --- a/mesonbuild/interpreter/interpreter.py +++ b/mesonbuild/interpreter/interpreter.py @@ -1959,15 +1959,27 @@ This will become a hard error in the future.''' % kwargs['input'], location=self 'generator', KwargInfo('arguments', ContainerTypeInfo(list, str, allow_empty=False), required=True, listify=True), KwargInfo('output', ContainerTypeInfo(list, str, allow_empty=False), required=True, listify=True), - KwargInfo('depfile', str), + KwargInfo('depfile', str, validator=lambda x: 'Depfile must be a plain filename with a subdirectory' if has_path_sep(x) else None), KwargInfo('capture', bool, default=False, since='0.43.0'), KwargInfo('depends', ContainerTypeInfo(list, (BuildTargetHolder, CustomTargetHolder)), default=[], listify=True), ) def func_generator(self, node: mparser.FunctionNode, args: T.Tuple[T.Union[ExecutableHolder, ExternalProgramHolder]], kwargs: 'kwargs.FuncGenerator') -> GeneratorHolder: - gen = build.Generator(args[0].held_object, kwargs) - holder = GeneratorHolder(self, gen, self) + for rule in kwargs['output']: + if '@BASENAME@' not in rule and '@PLAINNAME@' not in rule: + raise InvalidArguments('Every element of "output" must contain @BASENAME@ or @PLAINNAME@.') + if has_path_sep(rule): + raise InvalidArguments('"output" must not contain a directory separator.') + if len(kwargs['output']) > 1: + for o in kwargs['output']: + if '@OUTPUT@' in o: + raise InvalidArguments('Tried to use @OUTPUT@ in a rule with more than one output.') + + depends = [d.held_object for d in kwargs.pop('depends')] + + gen = build.Generator(args[0].held_object, depends=depends, **kwargs) + holder = GeneratorHolder(gen, self) self.generators.append(holder) return holder |