summaryrefslogtreecommitdiff
path: root/mesonbuild/cargo/interpreter.py
diff options
context:
space:
mode:
authorXavier Claessens <xclaessens@netflix.com>2025-10-27 16:42:21 +0000
committerXavier Claessens <xclaesse@gmail.com>2025-10-28 17:44:16 +0100
commit44ce04537d0853f4c1565a7c7a7519f4e290c4ba (patch)
tree52c922be5cec5b4c2549f92dac2de719ff7bf337 /mesonbuild/cargo/interpreter.py
parent1c620b2b783e0f53e7aafaee2fbdfdb72a0b9781 (diff)
downloadmeson-44ce04537d0853f4c1565a7c7a7519f4e290c4ba.tar.gz
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.
Diffstat (limited to 'mesonbuild/cargo/interpreter.py')
-rw-r--r--mesonbuild/cargo/interpreter.py15
1 files changed, 12 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),
]