From bde1c23b4f3eb9eb63e835b722bb9bbcccc4c8c1 Mon Sep 17 00:00:00 2001 From: Dylan Baker Date: Mon, 8 Dec 2025 10:53:08 -0800 Subject: interpreter|build: Use typed_kwargs for build_target(dependencies) What is basically impossible is to handle `SubprojectHolder`, because it's not a true holder but an interpreter object. Well, impossible without changing SubprojectHolder into a true holder, because it's avoiding the circular import becomes extremely convoluted otherwise, and refactoring is difficult because the held object is itself an Interpreter. It's a rather complex problem to solve gracefully. I've punted to avoid the complexity, it does mean that the error message is somewhat less exact. I don't think this is actually a huge problem because we've really guided people away from using `subproject()` and to instead use dependency fallbacks, which don't have this problem to begin with. This removes validation from the build layer, and puts it in interpreter. For code sharing reasons this means that `internal_dependency` also gets more fine grained error messages. The test case for this has been modified to use the `testcase expect_error` construct, and thus has been moved to the common tests directory. It's also been extended to cover both the library case, which gives coverage for the `extra_types` in `KwargInfo` --- test cases/common/287 invalid dependency arguments/lib.c | 1 + test cases/common/287 invalid dependency arguments/main.c | 1 + .../common/287 invalid dependency arguments/meson.build | 11 +++++++++++ .../subprojects/sub/meson.build | 1 + .../failing/124 subproject object as a dependency/main.c | 1 - .../failing/124 subproject object as a dependency/meson.build | 4 ---- .../subprojects/sub/meson.build | 1 - .../failing/124 subproject object as a dependency/test.json | 7 ------- 8 files changed, 14 insertions(+), 13 deletions(-) create mode 100644 test cases/common/287 invalid dependency arguments/lib.c create mode 100644 test cases/common/287 invalid dependency arguments/main.c create mode 100644 test cases/common/287 invalid dependency arguments/meson.build create mode 100644 test cases/common/287 invalid dependency arguments/subprojects/sub/meson.build delete mode 100644 test cases/failing/124 subproject object as a dependency/main.c delete mode 100644 test cases/failing/124 subproject object as a dependency/meson.build delete mode 100644 test cases/failing/124 subproject object as a dependency/subprojects/sub/meson.build delete mode 100644 test cases/failing/124 subproject object as a dependency/test.json (limited to 'test cases') 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/common/287 invalid dependency arguments/main.c b/test cases/common/287 invalid dependency arguments/main.c new file mode 100644 index 000000000..78f2de106 --- /dev/null +++ b/test cases/common/287 invalid dependency arguments/main.c @@ -0,0 +1 @@ +int main(void) { return 0; } 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/common/287 invalid dependency arguments/subprojects/sub/meson.build b/test cases/common/287 invalid dependency arguments/subprojects/sub/meson.build new file mode 100644 index 000000000..0adfd6a6e --- /dev/null +++ b/test cases/common/287 invalid dependency arguments/subprojects/sub/meson.build @@ -0,0 +1 @@ +project('sub') diff --git a/test cases/failing/124 subproject object as a dependency/main.c b/test cases/failing/124 subproject object as a dependency/main.c deleted file mode 100644 index 78f2de106..000000000 --- a/test cases/failing/124 subproject object as a dependency/main.c +++ /dev/null @@ -1 +0,0 @@ -int main(void) { return 0; } 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/subprojects/sub/meson.build b/test cases/failing/124 subproject object as a dependency/subprojects/sub/meson.build deleted file mode 100644 index 0adfd6a6e..000000000 --- a/test cases/failing/124 subproject object as a dependency/subprojects/sub/meson.build +++ /dev/null @@ -1 +0,0 @@ -project('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." - } - ] -} -- cgit v1.2.3