diff options
| -rw-r--r-- | mesonbuild/build.py | 28 | ||||
| -rw-r--r-- | mesonbuild/interpreter/interpreter.py | 2 | ||||
| -rw-r--r-- | mesonbuild/interpreter/kwargs.py | 1 | ||||
| -rw-r--r-- | mesonbuild/interpreter/type_checking.py | 4 | ||||
| -rw-r--r-- | test cases/common/287 invalid dependency arguments/lib.c | 1 | ||||
| -rw-r--r-- | test cases/common/287 invalid dependency arguments/main.c (renamed from test cases/failing/124 subproject object as a dependency/main.c) | 0 | ||||
| -rw-r--r-- | test cases/common/287 invalid dependency arguments/meson.build | 11 | ||||
| -rw-r--r-- | test cases/common/287 invalid dependency arguments/subprojects/sub/meson.build (renamed from test cases/failing/124 subproject object as a dependency/subprojects/sub/meson.build) | 0 | ||||
| -rw-r--r-- | test cases/failing/124 subproject object as a dependency/meson.build | 4 | ||||
| -rw-r--r-- | test cases/failing/124 subproject object as a dependency/test.json | 7 |
10 files changed, 22 insertions, 36 deletions
diff --git a/mesonbuild/build.py b/mesonbuild/build.py index 37a437812..ae6770be2 100644 --- a/mesonbuild/build.py +++ b/mesonbuild/build.py @@ -22,7 +22,7 @@ from . import programs from .mesonlib import ( HoldableObject, SecondLevelHolder, File, MesonException, MachineChoice, PerMachine, OrderedSet, listify, - extract_as_list, classify_unity_sources, + classify_unity_sources, get_filenames_templates_dict, substitute_values, has_path_sep, is_parent_path, relpath, PerMachineDefaultable, MesonBugException, EnvironmentVariables, pickle_load, lazy_property, @@ -1287,8 +1287,7 @@ class BuildTarget(Target): # internal deps (added inside self.add_deps()) to override them. self.add_include_dirs(kwargs.get('include_directories', [])) # Add dependencies (which also have include_directories) - deplist = extract_as_list(kwargs, 'dependencies') - self.add_deps(deplist) + self.add_deps(kwargs.get('dependencies', [])) # If an item in this list is False, the output corresponding to # the list index of that item will not be installed self.install_dir = kwargs.get('install_dir', []) @@ -1418,8 +1417,7 @@ class BuildTarget(Target): def get_include_dirs(self) -> T.List['IncludeDirs']: return self.include_dirs - def add_deps(self, deps): - deps = listify(deps) + def add_deps(self, deps: T.List[dependencies.Dependency]) -> None: for dep in deps: if dep in self.added_deps: # Prefer to add dependencies to added_deps which have a name @@ -1447,29 +1445,11 @@ class BuildTarget(Target): self.external_deps.append(extpart) # Deps of deps. self.add_deps(dep.ext_deps) - elif isinstance(dep, dependencies.Dependency): + else: if dep not in self.external_deps: self.external_deps.append(dep) self.process_sourcelist(dep.get_sources()) self.add_deps(dep.ext_deps) - elif isinstance(dep, BuildTarget): - raise InvalidArguments(f'Tried to use a build target {dep.name} as a dependency of target {self.name}.\n' - 'You probably should put it in link_with instead.') - else: - # This is a bit of a hack. We do not want Build to know anything - # about the interpreter so we can't import it and use isinstance. - # This should be reliable enough. - if hasattr(dep, 'held_object'): - # FIXME: subproject is not a real ObjectHolder so we have to do this by hand - dep = dep.held_object - if hasattr(dep, 'project_args_frozen') or hasattr(dep, 'global_args_frozen'): - raise InvalidArguments('Tried to use subproject object as a dependency.\n' - 'You probably wanted to use a dependency declared in it instead.\n' - 'Access it by calling get_variable() on the subproject object.') - raise InvalidArguments(f'Argument is of an unacceptable type {type(dep).__name__!r}.\nMust be ' - 'either an external dependency (returned by find_library() or ' - 'dependency()) or an internal dependency (returned by ' - 'declare_dependency()).') dep_d_features = dep.d_features diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py index 3a0cae041..3b87f48ea 100644 --- a/mesonbuild/interpreter/interpreter.py +++ b/mesonbuild/interpreter/interpreter.py @@ -3559,7 +3559,7 @@ class Interpreter(InterpreterBase, HoldableObject): for l in target.compilers.keys(): dep = self.build.stdlibs[target.for_machine].get(l, None) if dep: - target.add_deps(dep) + target.add_deps([dep]) def check_sources_exist(self, subdir, sources): for s in sources: diff --git a/mesonbuild/interpreter/kwargs.py b/mesonbuild/interpreter/kwargs.py index c08ceb759..1dee9a65c 100644 --- a/mesonbuild/interpreter/kwargs.py +++ b/mesonbuild/interpreter/kwargs.py @@ -337,6 +337,7 @@ class _BaseBuildTarget(TypedDict): build_by_default: bool build_rpath: str + dependencies: T.List[Dependency] extra_files: T.List[FileOrString] gnu_symbol_visibility: str include_directories: T.List[build.IncludeDirs] diff --git a/mesonbuild/interpreter/type_checking.py b/mesonbuild/interpreter/type_checking.py index 478924828..7515cbcef 100644 --- a/mesonbuild/interpreter/type_checking.py +++ b/mesonbuild/interpreter/type_checking.py @@ -426,6 +426,9 @@ DEPENDENCIES_KW: KwargInfo[T.List[Dependency]] = KwargInfo( ContainerTypeInfo(list, (Dependency, InternalDependency)), listify=True, default=[], + extra_types={ + BuildTarget: lambda arg: f'Tried to use a build_target "{T.cast("BuildTarget", arg).name}" as a dependency. This should be in `link_with` or `link_whole` instead.', + }, ) D_MODULE_VERSIONS_KW: KwargInfo[T.List[T.Union[str, int]]] = KwargInfo( @@ -721,6 +724,7 @@ _BUILD_TARGET_KWS: T.List[KwargInfo] = [ *_LANGUAGE_KWS, BT_SOURCES_KW, INCLUDE_DIRECTORIES.evolve(since_values={ContainerTypeInfo(list, str): '0.50.0'}), + DEPENDENCIES_KW, INCLUDE_DIRECTORIES.evolve(name='d_import_dirs'), _NAME_PREFIX_KW, _NAME_PREFIX_KW.evolve(name='name_suffix', validator=_name_suffix_validator), diff --git a/test cases/common/287 invalid dependency arguments/lib.c b/test cases/common/287 invalid dependency arguments/lib.c new file mode 100644 index 000000000..a324dca21 --- /dev/null +++ b/test cases/common/287 invalid dependency arguments/lib.c @@ -0,0 +1 @@ +int func(void) { return 0; } diff --git a/test cases/failing/124 subproject object as a dependency/main.c b/test cases/common/287 invalid dependency arguments/main.c index 78f2de106..78f2de106 100644 --- a/test cases/failing/124 subproject object as a dependency/main.c +++ b/test cases/common/287 invalid dependency arguments/main.c diff --git a/test cases/common/287 invalid dependency arguments/meson.build b/test cases/common/287 invalid dependency arguments/meson.build new file mode 100644 index 000000000..e85f181c1 --- /dev/null +++ b/test cases/common/287 invalid dependency arguments/meson.build @@ -0,0 +1,11 @@ +project('test', 'c') + +testcase expect_error('executable keyword argument \'dependencies\' was of type array[SubprojectHolder] but should have been array[Dependency | InternalDependency]') + executable('main', 'main.c', dependencies: subproject('sub')) +endtestcase + +lib = static_library('lib', 'lib.c') + +testcase expect_error('executable keyword argument \'dependencies\' was of type array[StaticLibrary] but should have been array[Dependency | InternalDependency]. Tried to use a build_target "lib" as a dependency. This should be in `link_with` or `link_whole` instead.') + executable('main', 'main.c', dependencies : lib) +endtestcase diff --git a/test cases/failing/124 subproject object as a dependency/subprojects/sub/meson.build b/test cases/common/287 invalid dependency arguments/subprojects/sub/meson.build index 0adfd6a6e..0adfd6a6e 100644 --- a/test cases/failing/124 subproject object as a dependency/subprojects/sub/meson.build +++ b/test cases/common/287 invalid dependency arguments/subprojects/sub/meson.build diff --git a/test cases/failing/124 subproject object as a dependency/meson.build b/test cases/failing/124 subproject object as a dependency/meson.build deleted file mode 100644 index 0114b9a31..000000000 --- a/test cases/failing/124 subproject object as a dependency/meson.build +++ /dev/null @@ -1,4 +0,0 @@ -project('test', 'c') - -executable( - 'main', 'main.c', dependencies: subproject('sub')) diff --git a/test cases/failing/124 subproject object as a dependency/test.json b/test cases/failing/124 subproject object as a dependency/test.json deleted file mode 100644 index a0eea225f..000000000 --- a/test cases/failing/124 subproject object as a dependency/test.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "stdout": [ - { - "line": "test cases/failing/124 subproject object as a dependency/meson.build:3:0: ERROR: Tried to use subproject object as a dependency." - } - ] -} |
