From dcf3af6b4e755a5da76eeea91332ca3dce17810f Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Tue, 28 Oct 2025 13:33:09 +0100 Subject: modules: rust: invoke subprojects automatically from dependencies() Signed-off-by: Paolo Bonzini --- mesonbuild/modules/__init__.py | 1 + mesonbuild/modules/rust.py | 10 +++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) (limited to 'mesonbuild/modules') diff --git a/mesonbuild/modules/__init__.py b/mesonbuild/modules/__init__.py index 8639fa827..8c6ed2fec 100644 --- a/mesonbuild/modules/__init__.py +++ b/mesonbuild/modules/__init__.py @@ -36,6 +36,7 @@ class ModuleState: self.source_root = interpreter.environment.get_source_dir() self.build_to_src = relpath(interpreter.environment.get_source_dir(), interpreter.environment.get_build_dir()) + self.subproject_dir = interpreter.subproject_dir self.subproject = interpreter.subproject self.subdir = interpreter.subdir self.root_subdir = interpreter.root_subdir diff --git a/mesonbuild/modules/rust.py b/mesonbuild/modules/rust.py index c1fcf049d..974d50ae6 100644 --- a/mesonbuild/modules/rust.py +++ b/mesonbuild/modules/rust.py @@ -23,7 +23,7 @@ from ..interpreter.type_checking import ( ) from ..interpreterbase import ContainerTypeInfo, InterpreterException, KwargInfo, typed_kwargs, typed_pos_args, noKwargs, noPosargs, permittedKwargs from ..interpreter.interpreterobjects import Doctest -from ..mesonlib import File, MachineChoice, MesonException, PerMachine +from ..mesonlib import (is_parent_path, File, MachineChoice, MesonException, PerMachine) from ..programs import ExternalProgram, NonExistingExternalProgram if T.TYPE_CHECKING: @@ -116,6 +116,10 @@ class RustWorkspace(ModuleObject): 'subproject': self.subproject_method, }) + @property + def subdir(self) -> str: + return self.ws.subdir + @noPosargs @noKwargs def packages_method(self, state: ModuleState, args: T.List, kwargs: TYPE_kwargs) -> T.List[str]: @@ -245,6 +249,10 @@ class RustPackage(RustCrate): if kwargs['dependencies']: for dep_key, dep_pkg in cfg.dep_packages.items(): if dep_pkg.manifest.lib: + if dep_pkg.ws_subdir != self.rust_ws.subdir or \ + is_parent_path(os.path.join(self.rust_ws.subdir, state.subproject_dir), + dep_pkg.path): + self.rust_ws._do_subproject(dep_pkg) # Get the dependency name for this package depname = dep_pkg.get_dependency_name(None) dependency = state.overridden_dependency(depname) -- cgit v1.2.3