From 44ce04537d0853f4c1565a7c7a7519f4e290c4ba Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Mon, 27 Oct 2025 16:42:21 +0000 Subject: cargo: Add library API version into its name It is required to have unique library names for rust_dependency_map to work. In the case we have foo crate in multiple versions, we have to make sure their .rlib file have a different name. --- mesonbuild/cargo/interpreter.py | 15 ++++++++++++--- test cases/rust/31 cargo multiple versions/meson.build | 3 +++ .../31 cargo multiple versions/subprojects/foo-1-rs.wrap | 2 ++ .../subprojects/foo-1-rs/Cargo.toml | 6 ++++++ .../subprojects/foo-1-rs/lib.rs | 3 +++ .../31 cargo multiple versions/subprojects/foo-2-rs.wrap | 2 ++ .../subprojects/foo-2-rs/Cargo.toml | 6 ++++++ .../subprojects/foo-2-rs/lib.rs | 3 +++ .../rust/31 cargo multiple versions/subprojects/main.wrap | 2 ++ .../subprojects/main/Cargo.toml | 9 +++++++++ .../31 cargo multiple versions/subprojects/main/lib.rs | 6 ++++++ 11 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 test cases/rust/31 cargo multiple versions/meson.build create mode 100644 test cases/rust/31 cargo multiple versions/subprojects/foo-1-rs.wrap create mode 100644 test cases/rust/31 cargo multiple versions/subprojects/foo-1-rs/Cargo.toml create mode 100644 test cases/rust/31 cargo multiple versions/subprojects/foo-1-rs/lib.rs create mode 100644 test cases/rust/31 cargo multiple versions/subprojects/foo-2-rs.wrap create mode 100644 test cases/rust/31 cargo multiple versions/subprojects/foo-2-rs/Cargo.toml create mode 100644 test cases/rust/31 cargo multiple versions/subprojects/foo-2-rs/lib.rs create mode 100644 test cases/rust/31 cargo multiple versions/subprojects/main.wrap create mode 100644 test cases/rust/31 cargo multiple versions/subprojects/main/Cargo.toml create mode 100644 test cases/rust/31 cargo multiple versions/subprojects/main/lib.rs 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() +} -- cgit v1.2.3