summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXavier Claessens <xavier.claessens@collabora.com>2024-02-27 14:51:25 -0500
committerXavier Claessens <xclaesse@gmail.com>2024-02-29 11:35:28 -0500
commitaee941559c4b88a062e88186819a820c69c200ae (patch)
treedb731fd57ddc9a5718d6a444472c3189357f7843
parent937d1c639a9a83e0671e7e4cd3686ca3e8c9566b (diff)
downloadmeson-aee941559c4b88a062e88186819a820c69c200ae.tar.gz
rust: recursively pull proc-macro dependencies as well
When the proc-macro rlib is in a different subdir, it would miss the needed -L argument and rustc would not find it. Meson was assuming that proc-macros are only needed when building libraries that uses it, but it turns out that was wrong, as show by the unit test.
-rw-r--r--mesonbuild/build.py2
-rw-r--r--test cases/rust/18 proc-macro/lib.rs8
-rw-r--r--test cases/rust/18 proc-macro/meson.build11
-rw-r--r--test cases/rust/18 proc-macro/subdir/meson.build1
-rw-r--r--test cases/rust/18 proc-macro/transitive-proc-macro.rs7
5 files changed, 27 insertions, 2 deletions
diff --git a/mesonbuild/build.py b/mesonbuild/build.py
index 8e41f0bb0..3c9d3a06c 100644
--- a/mesonbuild/build.py
+++ b/mesonbuild/build.py
@@ -1295,8 +1295,6 @@ class BuildTarget(Target):
for t in self.link_targets:
if t in result:
continue
- if t.rust_crate_type == 'proc-macro':
- continue
if include_internals or not t.is_internal():
result.add(t)
if isinstance(t, StaticLibrary):
diff --git a/test cases/rust/18 proc-macro/lib.rs b/test cases/rust/18 proc-macro/lib.rs
new file mode 100644
index 000000000..5242886cc
--- /dev/null
+++ b/test cases/rust/18 proc-macro/lib.rs
@@ -0,0 +1,8 @@
+extern crate proc_macro_examples;
+use proc_macro_examples::make_answer;
+
+make_answer!();
+
+pub fn func() -> u32 {
+ answer()
+}
diff --git a/test cases/rust/18 proc-macro/meson.build b/test cases/rust/18 proc-macro/meson.build
index c5f0dfc82..e8b28eda1 100644
--- a/test cases/rust/18 proc-macro/meson.build
+++ b/test cases/rust/18 proc-macro/meson.build
@@ -31,3 +31,14 @@ main = executable(
)
test('main_test2', main)
+
+subdir('subdir')
+
+staticlib = static_library('staticlib', 'lib.rs',
+ link_with: pm_in_subdir,
+ rust_dependency_map : {'proc_macro_examples3' : 'proc_macro_examples'}
+)
+
+executable('transitive-proc-macro', 'transitive-proc-macro.rs',
+ link_with: staticlib,
+)
diff --git a/test cases/rust/18 proc-macro/subdir/meson.build b/test cases/rust/18 proc-macro/subdir/meson.build
new file mode 100644
index 000000000..04842c431
--- /dev/null
+++ b/test cases/rust/18 proc-macro/subdir/meson.build
@@ -0,0 +1 @@
+pm_in_subdir = rust.proc_macro('proc_macro_examples3', '../proc.rs')
diff --git a/test cases/rust/18 proc-macro/transitive-proc-macro.rs b/test cases/rust/18 proc-macro/transitive-proc-macro.rs
new file mode 100644
index 000000000..4c804b3b6
--- /dev/null
+++ b/test cases/rust/18 proc-macro/transitive-proc-macro.rs
@@ -0,0 +1,7 @@
+extern crate staticlib;
+use staticlib::func;
+
+
+fn main() {
+ assert_eq!(42, func());
+}