Skip to content

Commit 91335b2

Browse files
committed
modules: rust: add package.override_dependency method
Signed-off-by: Paolo Bonzini <[email protected]>
1 parent 2a3c9c5 commit 91335b2

File tree

5 files changed

+59
-7
lines changed

5 files changed

+59
-7
lines changed

docs/markdown/Rust-module.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,33 @@ Builds a proc-macro crate for a workspace package.
421421

422422
Accepts all keyword arguments from [[shared_library]].
423423

424+
#### package.override_dependency()
425+
426+
```meson
427+
pkg.override_dependency(dep[, rust_abi: abi])
428+
```
429+
430+
Keyword arguments:
431+
- `rust_abi`: (`str`, optional) The ABI to use for the dependency. Valid values are
432+
`'rust'`, `'c'`, or `'proc-macro'`; the value must match the crate types and is
433+
mandatory if more than one ABI is exposed by the crate.
434+
435+
Make the crate available as a dependency to other crates. This is the same
436+
as calling `meson.override_dependency`, but it computes the correct dependency
437+
name from `pkg`'s name, API version and ABI (Rust vs. C).
438+
439+
It is typically used with `library() or `proc_macro()`, for example:
440+
441+
```meson
442+
lib_pkg = cargo.package('myproject-lib')
443+
lib = lib_pkg.library(install: false)
444+
lib_pkg.override_dependency(declare_dependency(link_with: lib))
445+
446+
# Declares myproject-lib as a dependency in Cargo.toml
447+
exe_pkg = cargo.package()
448+
exe_pkg.executable(install: true)
449+
```
450+
424451
#### package.executable()
425452

426453
```meson

mesonbuild/cargo/interpreter.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -813,9 +813,6 @@ def _create_lib(self, pkg: PackageState, build: builder.Builder, subdir: str,
813813
'rust_args': build.identifier(_extra_args_varname()),
814814
}
815815

816-
depname_suffix = '' if lib_type == 'c' else '-rs'
817-
depname = _dependency_name(pkg.manifest.package.name, pkg.manifest.package.api, depname_suffix)
818-
819816
if lib_type == 'proc-macro':
820817
lib = build.method('proc_macro', build.identifier('pkg_obj'), posargs, kwargs)
821818
else:
@@ -843,9 +840,8 @@ def _create_lib(self, pkg: PackageState, build: builder.Builder, subdir: str,
843840
),
844841
build.method(
845842
'override_dependency',
846-
build.identifier('meson'),
843+
build.identifier('pkg_obj'),
847844
[
848-
build.string(depname),
849845
build.identifier('dep'),
850846
],
851847
),

mesonbuild/modules/__init__.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,15 @@
77
import dataclasses
88
import typing as T
99

10-
from .. import build, dependencies, mesonlib
10+
from .. import build, dependencies, mesonlib, mlog
1111
from ..options import OptionKey
1212
from ..build import IncludeDirs
1313
from ..interpreterbase.decorators import noKwargs, noPosargs
1414
from ..mesonlib import relpath, HoldableObject, MachineChoice
1515
from ..programs import ExternalProgram
1616

1717
if T.TYPE_CHECKING:
18+
from ..dependencies.base import DependencyObjectKWs
1819
from ..interpreter import Interpreter
1920
from ..interpreter.interpreter import ProgramVersionFunc
2021
from ..interpreterbase import TYPE_var, TYPE_kwargs
@@ -110,6 +111,20 @@ def find_tool(self, name: str, depname: str, varname: str, required: bool = True
110111
# Normal program lookup
111112
return self.find_program(name, required=required, wanted=wanted)
112113

114+
def override_dependency(self, depname: str, dep: Dependency, static: T.Optional[bool] = None,
115+
for_machine: MachineChoice = MachineChoice.HOST) -> None:
116+
kwargs: DependencyObjectKWs = {}
117+
if static is not None:
118+
kwargs['static'] = static
119+
identifier = dependencies.get_dep_identifier(depname, kwargs)
120+
override = self.dependency_overrides[for_machine].get(identifier)
121+
if override:
122+
m = 'Tried to override dependency {!r} which has already been resolved or overridden at {}'
123+
location = mlog.get_error_location_string(override.node.filename, override.node.lineno)
124+
raise mesonlib.MesonException(m.format(depname, location))
125+
self.dependency_overrides[for_machine][identifier] = \
126+
build.DependencyOverride(dep, self._interpreter.current_node)
127+
113128
def overridden_dependency(self, depname: str, for_machine: MachineChoice = MachineChoice.HOST) -> Dependency:
114129
identifier = dependencies.get_dep_identifier(depname, {})
115130
try:

mesonbuild/modules/rust.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,7 @@ def __init__(self, rust_ws: RustWorkspace, package: cargo.PackageState) -> None:
250250
'proc_macro': self.proc_macro_method,
251251
'shared_module': self.shared_module_method,
252252
'executable': self.executable_method,
253+
'override_dependency': self.override_dependency_method,
253254
})
254255

255256
@noPosargs
@@ -362,6 +363,19 @@ def _proc_macro_method(self, state: 'ModuleState', args: T.Tuple[
362363
result = self._library_method(state, args, kwargs, shared=True, static=False)
363364
return T.cast('SharedLibrary', result)
364365

366+
@typed_pos_args('package.override_dependency', Dependency)
367+
@typed_kwargs('package.override_dependency',
368+
KwargInfo('rust_abi', (str, NoneType), default=None, validator=in_set_validator({'rust', 'c', 'proc-macro'})))
369+
def override_dependency_method(self, state: ModuleState, args: T.Tuple[Dependency], kwargs: FuncDependency) -> None:
370+
dep = args[0]
371+
rust_abi = self.package.abi_resolve_default(kwargs['rust_abi'])
372+
depname = self.package.get_dependency_name(rust_abi)
373+
state.override_dependency(depname, dep)
374+
if self.package.abi_has_static(rust_abi):
375+
state.override_dependency(depname, dep, static=True)
376+
if self.package.abi_has_shared(rust_abi):
377+
state.override_dependency(depname, dep, static=False)
378+
365379
@typed_pos_args('package.library', optargs=[(str, StructuredSources), StructuredSources])
366380
@typed_kwargs(
367381
'package.library',

test cases/rust/32 rust.workspace workspace/more/meson.build

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,4 @@ l = static_library('more', 'src/lib.rs',
99
rust_dependency_map: more_pkg.rust_dependency_map(),
1010
)
1111
more_dep = declare_dependency(link_with: l)
12-
meson.override_dependency('more-0.1-rs', more_dep)
12+
more_pkg.override_dependency(more_dep)

0 commit comments

Comments
 (0)