fix regression that broke type checking of CustomTarget outputs

We validate a few things here, such as the non-presence of '@INPUT' in
an output name. These got moved out of the CustomTarget constructor in
commit 11f9638035 and into KwargInfo, but
only for kwargs that took multiple values. This caused configure_file()
and unstable_rust.bindgen() to stop checking for this.

Add a shared single-output KW and use it in both places. This now
dispatches to _output_validator.

configure_file now validates subdirectories in output names the same way
we do elsewhere, directly in the typed_kwargs and by specifying the
erroring kwarg.
pull/10167/head
Eli Schwartz 3 years ago
parent ae0b40945b
commit e3d70d89b1
No known key found for this signature in database
GPG Key ID: CEB167EFB5722BD6
  1. 5
      mesonbuild/interpreter/interpreter.py
  2. 7
      mesonbuild/interpreter/type_checking.py
  3. 4
      mesonbuild/modules/unstable_rust.py
  4. 2
      test cases/failing/26 output subdir/test.json

@ -58,6 +58,7 @@ from .type_checking import (
CT_INPUT_KW, CT_INPUT_KW,
CT_INSTALL_DIR_KW, CT_INSTALL_DIR_KW,
CT_OUTPUT_KW, CT_OUTPUT_KW,
OUTPUT_KW,
DEFAULT_OPTIONS, DEFAULT_OPTIONS,
DEPENDS_KW, DEPENDS_KW,
DEPEND_FILES_KW, DEPEND_FILES_KW,
@ -2392,7 +2393,7 @@ class Interpreter(InterpreterBase, HoldableObject):
KwargInfo('install', (bool, NoneType), since='0.50.0'), KwargInfo('install', (bool, NoneType), since='0.50.0'),
KwargInfo('install_dir', (str, bool), default='', KwargInfo('install_dir', (str, bool), default='',
validator=lambda x: 'must be `false` if boolean' if x is True else None), validator=lambda x: 'must be `false` if boolean' if x is True else None),
KwargInfo('output', str, required=True), OUTPUT_KW,
KwargInfo('output_format', str, default='c', since='0.47.0', KwargInfo('output_format', str, default='c', since='0.47.0',
validator=in_set_validator({'c', 'nasm'})), validator=in_set_validator({'c', 'nasm'})),
) )
@ -2448,8 +2449,6 @@ class Interpreter(InterpreterBase, HoldableObject):
mlog.warning('Output file', mlog.bold(ofile_rpath, True), 'for configure_file() at', current_call, 'overwrites configure_file() output at', first_call) mlog.warning('Output file', mlog.bold(ofile_rpath, True), 'for configure_file() at', current_call, 'overwrites configure_file() output at', first_call)
else: else:
self.configure_file_outputs[ofile_rpath] = self.current_lineno self.configure_file_outputs[ofile_rpath] = self.current_lineno
if os.path.dirname(output) != '':
raise InterpreterException('Output file name must not contain a subdirectory.')
(ofile_path, ofile_fname) = os.path.split(os.path.join(self.subdir, output)) (ofile_path, ofile_fname) = os.path.split(os.path.join(self.subdir, output))
ofile_abs = os.path.join(self.environment.build_dir, ofile_path, ofile_fname) ofile_abs = os.path.join(self.environment.build_dir, ofile_path, ofile_fname)

@ -277,6 +277,13 @@ CT_OUTPUT_KW: KwargInfo[T.List[str]] = KwargInfo(
validator=_output_validator, validator=_output_validator,
) )
OUTPUT_KW: KwargInfo[str] = KwargInfo(
'output',
str,
required=True,
validator=lambda x: _output_validator([x])
)
CT_INPUT_KW: KwargInfo[T.List[T.Union[str, File, ExternalProgram, BuildTarget, CustomTarget, CustomTargetIndex, ExtractedObjects, GeneratedList]]] = KwargInfo( CT_INPUT_KW: KwargInfo[T.List[T.Union[str, File, ExternalProgram, BuildTarget, CustomTarget, CustomTargetIndex, ExtractedObjects, GeneratedList]]] = KwargInfo(
'input', 'input',
ContainerTypeInfo(list, (str, File, ExternalProgram, BuildTarget, CustomTarget, CustomTargetIndex, ExtractedObjects, GeneratedList)), ContainerTypeInfo(list, (str, File, ExternalProgram, BuildTarget, CustomTarget, CustomTargetIndex, ExtractedObjects, GeneratedList)),

@ -19,7 +19,7 @@ from . import ExtensionModule, ModuleReturnValue
from .. import mlog from .. import mlog
from ..build import BothLibraries, BuildTarget, CustomTargetIndex, Executable, ExtractedObjects, GeneratedList, IncludeDirs, CustomTarget, StructuredSources from ..build import BothLibraries, BuildTarget, CustomTargetIndex, Executable, ExtractedObjects, GeneratedList, IncludeDirs, CustomTarget, StructuredSources
from ..dependencies import Dependency, ExternalLibrary from ..dependencies import Dependency, ExternalLibrary
from ..interpreter.interpreter import TEST_KWARGS from ..interpreter.interpreter import TEST_KWARGS, OUTPUT_KW
from ..interpreterbase import ContainerTypeInfo, InterpreterException, KwargInfo, FeatureNew, typed_kwargs, typed_pos_args, noPosargs from ..interpreterbase import ContainerTypeInfo, InterpreterException, KwargInfo, FeatureNew, typed_kwargs, typed_pos_args, noPosargs
from ..mesonlib import File from ..mesonlib import File
@ -173,7 +173,7 @@ class RustModule(ExtensionModule):
listify=True, listify=True,
required=True, required=True,
), ),
KwargInfo('output', str, required=True), OUTPUT_KW,
) )
def bindgen(self, state: 'ModuleState', args: T.List, kwargs: 'FuncBindgen') -> ModuleReturnValue: def bindgen(self, state: 'ModuleState', args: T.List, kwargs: 'FuncBindgen') -> ModuleReturnValue:
"""Wrapper around bindgen to simplify it's use. """Wrapper around bindgen to simplify it's use.

@ -1,7 +1,7 @@
{ {
"stdout": [ "stdout": [
{ {
"line": "test cases/failing/26 output subdir/meson.build:3:0: ERROR: Output file name must not contain a subdirectory." "line": "test cases/failing/26 output subdir/meson.build:3:0: ERROR: configure_file keyword argument \"output\" Output 'subdir/foo' must not contain a path segment."
} }
] ]
} }

Loading…
Cancel
Save