summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mesonbuild/cargo/interpreter.py15
-rw-r--r--test cases/rust/31 cargo multiple versions/meson.build3
-rw-r--r--test cases/rust/31 cargo multiple versions/subprojects/foo-1-rs.wrap2
-rw-r--r--test cases/rust/31 cargo multiple versions/subprojects/foo-1-rs/Cargo.toml6
-rw-r--r--test cases/rust/31 cargo multiple versions/subprojects/foo-1-rs/lib.rs3
-rw-r--r--test cases/rust/31 cargo multiple versions/subprojects/foo-2-rs.wrap2
-rw-r--r--test cases/rust/31 cargo multiple versions/subprojects/foo-2-rs/Cargo.toml6
-rw-r--r--test cases/rust/31 cargo multiple versions/subprojects/foo-2-rs/lib.rs3
-rw-r--r--test cases/rust/31 cargo multiple versions/subprojects/main.wrap2
-rw-r--r--test cases/rust/31 cargo multiple versions/subprojects/main/Cargo.toml9
-rw-r--r--test cases/rust/31 cargo multiple versions/subprojects/main/lib.rs6
11 files changed, 54 insertions, 3 deletions
diff --git a/mesonbuild/cargo/interpreter.py b/mesonbuild/cargo/interpreter.py
index 6af7469ae..8fae44b91 100644
--- a/mesonbuild/cargo/interpreter.py
+++ b/mesonbuild/cargo/interpreter.py
@@ -43,6 +43,15 @@ def _dependency_varname(dep: Dependency) -> str:
return f'{fixup_meson_varname(dep.package)}_{(dep.api.replace(".", "_"))}_dep'
+def _library_name(name: str, api: str, lib_type: Literal['rust', 'c', 'proc-macro'] = 'rust') -> str:
+ # Add the API version to the library name to avoid conflicts when multiple
+ # versions of the same crate are used. The Ninja backend removed everything
+ # after the + to form the crate name.
+ if lib_type == 'c':
+ return name
+ return f'{name}+{api.replace(".", "_")}'
+
+
def _extra_args_varname() -> str:
return 'extra_args'
@@ -652,8 +661,8 @@ class Interpreter:
dependencies.append(build.identifier(_dependency_varname(dep)))
if name != dep.package:
dep_pkg = self._dep_package(pkg, dep)
- dep_lib_name = dep_pkg.manifest.lib.name
- dependency_map[build.string(fixup_meson_varname(dep_lib_name))] = build.string(name)
+ dep_lib_name = _library_name(dep_pkg.manifest.lib.name, dep_pkg.manifest.package.api)
+ dependency_map[build.string(dep_lib_name)] = build.string(name)
for name, sys_dep in pkg.manifest.system_dependencies.items():
if sys_dep.enabled(pkg.features):
dependencies.append(build.identifier(f'{fixup_meson_varname(name)}_system_dep'))
@@ -673,7 +682,7 @@ class Interpreter:
}
posargs: T.List[mparser.BaseNode] = [
- build.string(fixup_meson_varname(pkg.manifest.lib.name)),
+ build.string(_library_name(pkg.manifest.lib.name, pkg.manifest.package.api, lib_type)),
build.string(pkg.manifest.lib.path),
]
diff --git a/test cases/rust/31 cargo multiple versions/meson.build b/test cases/rust/31 cargo multiple versions/meson.build
new file mode 100644
index 000000000..dd11508ae
--- /dev/null
+++ b/test cases/rust/31 cargo multiple versions/meson.build
@@ -0,0 +1,3 @@
+project('cargo multiple crate versions')
+
+subproject('main')
diff --git a/test cases/rust/31 cargo multiple versions/subprojects/foo-1-rs.wrap b/test cases/rust/31 cargo multiple versions/subprojects/foo-1-rs.wrap
new file mode 100644
index 000000000..5133599d2
--- /dev/null
+++ b/test cases/rust/31 cargo multiple versions/subprojects/foo-1-rs.wrap
@@ -0,0 +1,2 @@
+[wrap-file]
+method=cargo
diff --git a/test cases/rust/31 cargo multiple versions/subprojects/foo-1-rs/Cargo.toml b/test cases/rust/31 cargo multiple versions/subprojects/foo-1-rs/Cargo.toml
new file mode 100644
index 000000000..41de66978
--- /dev/null
+++ b/test cases/rust/31 cargo multiple versions/subprojects/foo-1-rs/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "foo"
+version = "1.0"
+
+[lib]
+path = "lib.rs"
diff --git a/test cases/rust/31 cargo multiple versions/subprojects/foo-1-rs/lib.rs b/test cases/rust/31 cargo multiple versions/subprojects/foo-1-rs/lib.rs
new file mode 100644
index 000000000..f3662d5cc
--- /dev/null
+++ b/test cases/rust/31 cargo multiple versions/subprojects/foo-1-rs/lib.rs
@@ -0,0 +1,3 @@
+pub fn foo1() -> i32 {
+ 1
+}
diff --git a/test cases/rust/31 cargo multiple versions/subprojects/foo-2-rs.wrap b/test cases/rust/31 cargo multiple versions/subprojects/foo-2-rs.wrap
new file mode 100644
index 000000000..5133599d2
--- /dev/null
+++ b/test cases/rust/31 cargo multiple versions/subprojects/foo-2-rs.wrap
@@ -0,0 +1,2 @@
+[wrap-file]
+method=cargo
diff --git a/test cases/rust/31 cargo multiple versions/subprojects/foo-2-rs/Cargo.toml b/test cases/rust/31 cargo multiple versions/subprojects/foo-2-rs/Cargo.toml
new file mode 100644
index 000000000..ce55217e4
--- /dev/null
+++ b/test cases/rust/31 cargo multiple versions/subprojects/foo-2-rs/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "foo"
+version = "2.0"
+
+[lib]
+path = "lib.rs"
diff --git a/test cases/rust/31 cargo multiple versions/subprojects/foo-2-rs/lib.rs b/test cases/rust/31 cargo multiple versions/subprojects/foo-2-rs/lib.rs
new file mode 100644
index 000000000..afbf386e0
--- /dev/null
+++ b/test cases/rust/31 cargo multiple versions/subprojects/foo-2-rs/lib.rs
@@ -0,0 +1,3 @@
+pub fn foo2() -> i32 {
+ 1
+}
diff --git a/test cases/rust/31 cargo multiple versions/subprojects/main.wrap b/test cases/rust/31 cargo multiple versions/subprojects/main.wrap
new file mode 100644
index 000000000..5133599d2
--- /dev/null
+++ b/test cases/rust/31 cargo multiple versions/subprojects/main.wrap
@@ -0,0 +1,2 @@
+[wrap-file]
+method=cargo
diff --git a/test cases/rust/31 cargo multiple versions/subprojects/main/Cargo.toml b/test cases/rust/31 cargo multiple versions/subprojects/main/Cargo.toml
new file mode 100644
index 000000000..0401a5958
--- /dev/null
+++ b/test cases/rust/31 cargo multiple versions/subprojects/main/Cargo.toml
@@ -0,0 +1,9 @@
+[package]
+name = "main"
+
+[dependencies]
+foo1 = { package="foo", version="1" }
+foo2 = { package="foo", version="2" }
+
+[lib]
+path = "lib.rs"
diff --git a/test cases/rust/31 cargo multiple versions/subprojects/main/lib.rs b/test cases/rust/31 cargo multiple versions/subprojects/main/lib.rs
new file mode 100644
index 000000000..5029a27e5
--- /dev/null
+++ b/test cases/rust/31 cargo multiple versions/subprojects/main/lib.rs
@@ -0,0 +1,6 @@
+extern crate foo1;
+extern crate foo2;
+
+pub fn func() -> i32 {
+ foo1::foo1() + foo2::foo2()
+}