summaryrefslogtreecommitdiff
path: root/mesonbuild/modules
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 /mesonbuild/modules
parentc2cbb7001129ee92d966f5060fbf0459eaa29550 (diff)
downloadmeson-8d2676a49bdce134e3ee9d97f00e627b442dfa40.tar.gz
modules: rust: add package.override_dependency method
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'mesonbuild/modules')
-rw-r--r--mesonbuild/modules/__init__.py17
-rw-r--r--mesonbuild/modules/rust.py14
2 files changed, 30 insertions, 1 deletions
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',