summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2025-11-18 12:28:36 +0100
committerPaolo Bonzini <pbonzini@redhat.com>2025-12-22 12:01:05 +0100
commit8d2676a49bdce134e3ee9d97f00e627b442dfa40 (patch)
tree432fbce714395f6a36278095b4318fa54704d25d
parentc2cbb7001129ee92d966f5060fbf0459eaa29550 (diff)
downloadmeson-8d2676a49bdce134e3ee9d97f00e627b442dfa40.tar.gz
modules: rust: add package.override_dependency method
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
-rw-r--r--docs/markdown/Rust-module.md27
-rw-r--r--mesonbuild/cargo/interpreter.py11
-rw-r--r--mesonbuild/modules/__init__.py17
-rw-r--r--mesonbuild/modules/rust.py14
-rw-r--r--test cases/rust/32 rust.workspace workspace/more/meson.build2
5 files changed, 61 insertions, 10 deletions
diff --git a/docs/markdown/Rust-module.md b/docs/markdown/Rust-module.md
index 5ee7b7da9..0c576ece6 100644
--- a/docs/markdown/Rust-module.md
+++ b/docs/markdown/Rust-module.md
@@ -416,6 +416,33 @@ Builds a proc-macro crate for a workspace package.
Accepts all keyword arguments from [[shared_library]].
+#### package.override_dependency()
+
+```meson
+pkg.override_dependency(dep[, rust_abi: abi])
+```
+
+Keyword arguments:
+- `rust_abi`: (`str`, optional) The ABI to use for the dependency. Valid values are
+ `'rust'`, `'c'`, or `'proc-macro'`; the value must match the crate types and is
+ mandatory if more than one ABI is exposed by the crate.
+
+Make the crate available as a dependency to other crates. This is the same
+as calling `meson.override_dependency`, but it computes the correct dependency
+name from `pkg`'s name, API version and ABI (Rust vs. C).
+
+It is typically used with `library() or `proc_macro()`, for example:
+
+```meson
+lib_pkg = cargo_ws.package('myproject-lib')
+lib = lib_pkg.library(install: false)
+lib_pkg.override_dependency(declare_dependency(link_with: lib))
+
+# Declares myproject-lib as a dependency in Cargo.toml
+exe_pkg = cargo_ws.package()
+exe_pkg.executable(install: true)
+```
+
#### package.executable()
```meson
diff --git a/mesonbuild/cargo/interpreter.py b/mesonbuild/cargo/interpreter.py
index fcae28d27..5b003c6b4 100644
--- a/mesonbuild/cargo/interpreter.py
+++ b/mesonbuild/cargo/interpreter.py
@@ -813,9 +813,6 @@ class Interpreter:
'rust_args': build.identifier(_extra_args_varname()),
}
- depname_suffix = '' if lib_type == 'c' else '-rs'
- depname = _dependency_name(pkg.manifest.package.name, pkg.manifest.package.api, depname_suffix)
-
if lib_type == 'proc-macro':
lib = build.method('proc_macro', build.identifier('pkg_obj'), posargs, kwargs)
else:
@@ -843,11 +840,9 @@ class Interpreter:
),
build.method(
'override_dependency',
- build.identifier('meson'),
- [
- build.string(depname),
- build.identifier('dep'),
- ],
+ build.identifier('pkg_obj'),
+ [build.identifier('dep')],
+ {'rust_abi': build.string(lib_type)}
),
]
diff --git a/mesonbuild/modules/__init__.py b/mesonbuild/modules/__init__.py
index 8c6ed2fec..0df85faf1 100644
--- a/mesonbuild/modules/__init__.py
+++ b/mesonbuild/modules/__init__.py
@@ -7,7 +7,7 @@ from __future__ import annotations
import dataclasses
import typing as T
-from .. import build, dependencies, mesonlib
+from .. import build, dependencies, mesonlib, mlog
from ..options import OptionKey
from ..build import IncludeDirs
from ..interpreterbase.decorators import noKwargs, noPosargs
@@ -15,6 +15,7 @@ from ..mesonlib import relpath, HoldableObject, MachineChoice
from ..programs import ExternalProgram
if T.TYPE_CHECKING:
+ from ..dependencies.base import DependencyObjectKWs
from ..interpreter import Interpreter
from ..interpreter.interpreter import ProgramVersionFunc
from ..interpreterbase import TYPE_var, TYPE_kwargs
@@ -110,6 +111,20 @@ class ModuleState:
# Normal program lookup
return self.find_program(name, required=required, wanted=wanted)
+ def override_dependency(self, depname: str, dep: Dependency, static: T.Optional[bool] = None,
+ for_machine: MachineChoice = MachineChoice.HOST) -> None:
+ kwargs: DependencyObjectKWs = {}
+ if static is not None:
+ kwargs['static'] = static
+ identifier = dependencies.get_dep_identifier(depname, kwargs)
+ override = self.dependency_overrides[for_machine].get(identifier)
+ if override:
+ m = 'Tried to override dependency {!r} which has already been resolved or overridden at {}'
+ location = mlog.get_error_location_string(override.node.filename, override.node.lineno)
+ raise mesonlib.MesonException(m.format(depname, location))
+ self.dependency_overrides[for_machine][identifier] = \
+ build.DependencyOverride(dep, self._interpreter.current_node)
+
def overridden_dependency(self, depname: str, for_machine: MachineChoice = MachineChoice.HOST) -> Dependency:
identifier = dependencies.get_dep_identifier(depname, {})
try:
diff --git a/mesonbuild/modules/rust.py b/mesonbuild/modules/rust.py
index 606065176..783df1865 100644
--- a/mesonbuild/modules/rust.py
+++ b/mesonbuild/modules/rust.py
@@ -250,6 +250,7 @@ class RustPackage(RustCrate):
'proc_macro': self.proc_macro_method,
'shared_module': self.shared_module_method,
'executable': self.executable_method,
+ 'override_dependency': self.override_dependency_method,
})
@noPosargs
@@ -362,6 +363,19 @@ class RustPackage(RustCrate):
result = self._library_method(state, args, kwargs, shared=True, static=False)
return T.cast('SharedLibrary', result)
+ @typed_pos_args('package.override_dependency', Dependency)
+ @typed_kwargs('package.override_dependency',
+ KwargInfo('rust_abi', (str, NoneType), default=None, validator=in_set_validator({'rust', 'c', 'proc-macro'})))
+ def override_dependency_method(self, state: ModuleState, args: T.Tuple[Dependency], kwargs: FuncDependency) -> None:
+ dep = args[0]
+ rust_abi = self.package.abi_resolve_default(kwargs['rust_abi'])
+ depname = self.package.get_dependency_name(rust_abi)
+ state.override_dependency(depname, dep)
+ if self.package.abi_has_static(rust_abi):
+ state.override_dependency(depname, dep, static=True)
+ if self.package.abi_has_shared(rust_abi):
+ state.override_dependency(depname, dep, static=False)
+
@typed_pos_args('package.library', optargs=[(str, StructuredSources), StructuredSources])
@typed_kwargs(
'package.library',
diff --git a/test cases/rust/32 rust.workspace workspace/more/meson.build b/test cases/rust/32 rust.workspace workspace/more/meson.build
index 37ae51604..4baf09a29 100644
--- a/test cases/rust/32 rust.workspace workspace/more/meson.build
+++ b/test cases/rust/32 rust.workspace workspace/more/meson.build
@@ -9,4 +9,4 @@ l = static_library('more', 'src/lib.rs',
rust_dependency_map: more_pkg.rust_dependency_map(),
)
more_dep = declare_dependency(link_with: l)
-meson.override_dependency('more-0.1-rs', more_dep)
+more_pkg.override_dependency(more_dep)