From c49552ffb2cbcd4a9d9873732c6f260ba5fc1b50 Mon Sep 17 00:00:00 2001 From: Dylan Baker Date: Fri, 21 Jan 2022 09:23:40 -0800 Subject: [PATCH] interpreter: use typed_pos_args for build_targets We have to allow through build.BuildTarget and build.ExtractedObjects, which is what our previous level of checking did, even though they are ignored. I've used FeatureDeprecated calls here, so that we have a clear time of "this was officially deprecated in 1.1.0" --- mesonbuild/interpreter/interpreter.py | 59 ++++++++++++++++++++++----- 1 file changed, 48 insertions(+), 11 deletions(-) diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py index 1dd07a2db..e57dc7a73 100644 --- a/mesonbuild/interpreter/interpreter.py +++ b/mesonbuild/interpreter/interpreter.py @@ -122,6 +122,8 @@ if T.TYPE_CHECKING: build.BuildTarget, build.CustomTargetIndex, build.CustomTarget, build.ExtractedObjects, build.GeneratedList, build.StructuredSources] + BuildTargetSource = T.Union[mesonlib.FileOrString, build.GeneratedTypes, build.StructuredSources] + def _project_version_validator(value: T.Union[T.List, str, mesonlib.File, None]) -> T.Optional[str]: if isinstance(value, list): @@ -1730,39 +1732,64 @@ class Interpreter(InterpreterBase, HoldableObject): @FeatureNewKwargs('executable', '0.56.0', ['win_subsystem']) @FeatureDeprecatedKwargs('executable', '0.56.0', ['gui_app'], extra_message="Use 'win_subsystem' instead.") @permittedKwargs(build.known_exe_kwargs) - def func_executable(self, node, args, kwargs): + @typed_pos_args('executable', str, varargs=(str, mesonlib.File, build.CustomTarget, build.CustomTargetIndex, build.GeneratedList, build.StructuredSources, build.ExtractedObjects, build.BuildTarget)) + def func_executable(self, node: mparser.BaseNode, + args: T.Tuple[str, T.List[BuildTargetSource]], + kwargs) -> build.Executable: return self.build_target(node, args, kwargs, build.Executable) @permittedKwargs(build.known_stlib_kwargs) - def func_static_lib(self, node, args, kwargs): + @typed_pos_args('static_library', str, varargs=(str, mesonlib.File, build.CustomTarget, build.CustomTargetIndex, build.GeneratedList, build.StructuredSources, build.ExtractedObjects, build.BuildTarget)) + def func_static_lib(self, node: mparser.BaseNode, + args: T.Tuple[str, T.List[BuildTargetSource]], + kwargs) -> build.StaticLibrary: return self.build_target(node, args, kwargs, build.StaticLibrary) @permittedKwargs(build.known_shlib_kwargs) - def func_shared_lib(self, node, args, kwargs): + @typed_pos_args('shared_library', str, varargs=(str, mesonlib.File, build.CustomTarget, build.CustomTargetIndex, build.GeneratedList, build.StructuredSources, build.ExtractedObjects, build.BuildTarget)) + def func_shared_lib(self, node: mparser.BaseNode, + args: T.Tuple[str, T.List[BuildTargetSource]], + kwargs) -> build.SharedLibrary: holder = self.build_target(node, args, kwargs, build.SharedLibrary) holder.shared_library_only = True return holder @permittedKwargs(known_library_kwargs) - def func_both_lib(self, node, args, kwargs): + @typed_pos_args('both_libraries', str, varargs=(str, mesonlib.File, build.CustomTarget, build.CustomTargetIndex, build.GeneratedList, build.StructuredSources, build.ExtractedObjects, build.BuildTarget)) + def func_both_lib(self, node: mparser.BaseNode, + args: T.Tuple[str, T.List[BuildTargetSource]], + kwargs) -> build.BothLibraries: return self.build_both_libraries(node, args, kwargs) @FeatureNew('shared_module', '0.37.0') @permittedKwargs(build.known_shmod_kwargs) - def func_shared_module(self, node, args, kwargs): + @typed_pos_args('shared_module', str, varargs=(str, mesonlib.File, build.CustomTarget, build.CustomTargetIndex, build.GeneratedList, build.StructuredSources, build.ExtractedObjects, build.BuildTarget)) + def func_shared_module(self, node: mparser.BaseNode, + args: T.Tuple[str, T.List[BuildTargetSource]], + kwargs) -> build.SharedModule: return self.build_target(node, args, kwargs, build.SharedModule) @permittedKwargs(known_library_kwargs) - def func_library(self, node, args, kwargs): + @typed_pos_args('library', str, varargs=(str, mesonlib.File, build.CustomTarget, build.CustomTargetIndex, build.GeneratedList, build.StructuredSources, build.ExtractedObjects, build.BuildTarget)) + def func_library(self, node: mparser.BaseNode, + args: T.Tuple[str, T.List[BuildTargetSource]], + kwargs) -> build.Executable: return self.build_library(node, args, kwargs) @permittedKwargs(build.known_jar_kwargs) - def func_jar(self, node, args, kwargs): + @typed_pos_args('jar', str, varargs=(str, mesonlib.File, build.CustomTarget, build.CustomTargetIndex, build.GeneratedList, build.ExtractedObjects, build.BuildTarget)) + def func_jar(self, node: mparser.BaseNode, + args: T.Tuple[str, T.List[T.Union[str, mesonlib.File, build.GeneratedTypes]]], + kwargs) -> build.Jar: return self.build_target(node, args, kwargs, build.Jar) @FeatureNewKwargs('build_target', '0.40.0', ['link_whole', 'override_options']) @permittedKwargs(known_build_target_kwargs) - def func_build_target(self, node, args, kwargs): + @typed_pos_args('build_target', str, varargs=(str, mesonlib.File, build.CustomTarget, build.CustomTargetIndex, build.GeneratedList, build.StructuredSources, build.ExtractedObjects, build.BuildTarget)) + def func_build_target(self, node: mparser.BaseNode, + args: T.Tuple[str, T.List[BuildTargetSource]], + kwargs) -> T.Union[build.Executable, build.StaticLibrary, build.SharedLibrary, + build.SharedModule, build.BothLibraries, build.Jar]: if 'target_type' not in kwargs: raise InterpreterException('Missing target_type keyword argument') target_type = kwargs.pop('target_type') @@ -3106,12 +3133,22 @@ class Interpreter(InterpreterBase, HoldableObject): build_target_decorator_caller(self, node, args, kwargs) - if not args: - raise InterpreterException('Target does not have a name.') - name, *sources = args + name, sources = args for_machine = self.machine_from_native_kwarg(kwargs) if 'sources' in kwargs: sources += listify(kwargs['sources']) + if any(isinstance(s, build.BuildTarget) for s in sources): + FeatureDeprecated.single_use('passing references to built targets as a source file', '1.1.0', self.subproject, + 'consider using `link_with` or `link_whole` if you meant to link, or dropping them as otherwise they are ignored', + node) + if any(isinstance(s, build.ExtractedObjects) for s in sources): + FeatureDeprecated.single_use('passing object files as sources', '1.1.0', self.subproject, + 'pass these to the `objects` keyword instead, they are ignored when passed as sources', + node) + # Go ahead and drop these here, since they're only allowed through for + # backwards compatibility anyway + sources = [s for s in sources + if not isinstance(s, (build.BuildTarget, build.ExtractedObjects))] sources = self.source_strings_to_files(sources) objs = extract_as_list(kwargs, 'objects') kwargs['dependencies'] = extract_as_list(kwargs, 'dependencies')