From fd3416f0799bedaa143c7a8ad6996dc220e53c96 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Mon, 27 Oct 2025 14:21:20 +0100 Subject: cargo: use subproject() if a workspace member is in subprojects/ Signed-off-by: Paolo Bonzini --- mesonbuild/cargo/interpreter.py | 10 +++++++++- test cases/rust/30 cargo workspace/subprojects/foo/Cargo.toml | 2 +- .../30 cargo workspace/subprojects/foo/src/member2/Cargo.toml | 9 --------- .../30 cargo workspace/subprojects/foo/src/member2/src/lib.rs | 5 ----- .../subprojects/foo/subprojects/member2-1-rs.wrap | 6 ++++++ .../subprojects/foo/subprojects/member2-1.0/Cargo.toml | 9 +++++++++ .../subprojects/foo/subprojects/member2-1.0/src/lib.rs | 5 +++++ test cases/rust/30 cargo workspace/subprojects/member2.wrap | 2 ++ 8 files changed, 32 insertions(+), 16 deletions(-) delete mode 100644 test cases/rust/30 cargo workspace/subprojects/foo/src/member2/Cargo.toml delete mode 100644 test cases/rust/30 cargo workspace/subprojects/foo/src/member2/src/lib.rs create mode 100644 test cases/rust/30 cargo workspace/subprojects/foo/subprojects/member2-1-rs.wrap create mode 100644 test cases/rust/30 cargo workspace/subprojects/foo/subprojects/member2-1.0/Cargo.toml create mode 100644 test cases/rust/30 cargo workspace/subprojects/foo/subprojects/member2-1.0/src/lib.rs create mode 100644 test cases/rust/30 cargo workspace/subprojects/member2.wrap diff --git a/mesonbuild/cargo/interpreter.py b/mesonbuild/cargo/interpreter.py index dc8bf4bdf..a40b5ec65 100644 --- a/mesonbuild/cargo/interpreter.py +++ b/mesonbuild/cargo/interpreter.py @@ -13,6 +13,7 @@ from __future__ import annotations import dataclasses import functools import os +import pathlib import collections import urllib.parse import typing as T @@ -21,7 +22,7 @@ from . import builder, version from .cfg import eval_cfg from .toml import load_toml from .manifest import Manifest, CargoLock, CargoLockPackage, Workspace, fixup_meson_varname -from ..mesonlib import MesonException, MachineChoice, version_compare +from ..mesonlib import is_parent_path, MesonException, MachineChoice, version_compare from .. import coredata, mlog from ..wrap.wrap import PackageDefinition @@ -199,6 +200,7 @@ class WorkspaceState: class Interpreter: def __init__(self, env: Environment, subdir: str, subprojects_dir: str) -> None: self.environment = env + self.subprojects_dir = subprojects_dir # Map Cargo.toml's subdir to loaded manifest. self.manifests: T.Dict[str, T.Union[Manifest, Workspace]] = {} # Map of cargo package (name + api) to its state @@ -298,6 +300,9 @@ class Interpreter: _process_member(dep_member) if member == '.': ast.extend(self._create_package(pkg, build, subdir)) + elif is_parent_path(self.subprojects_dir, member): + depname = _dependency_name(pkg.manifest.package.name, pkg.manifest.package.api) + ast.append(build.function('subproject', [build.string(depname)])) else: ast.append(build.function('subdir', [build.string(member)])) processed_members[member] = pkg @@ -426,6 +431,9 @@ class Interpreter: if dep.path: ws = self.workspaces[pkg.ws_subdir] dep_member = os.path.normpath(os.path.join(pkg.ws_member, dep.path)) + if is_parent_path(self.subprojects_dir, dep_member): + if len(pathlib.PurePath(dep_member).parts) != 2: + raise MesonException('found "{self.subprojects_dir}" in path but it is not a valid subproject path') self._load_workspace_member(ws, dep_member) dep_pkg = self._require_workspace_member(ws, dep_member) elif dep.git: diff --git a/test cases/rust/30 cargo workspace/subprojects/foo/Cargo.toml b/test cases/rust/30 cargo workspace/subprojects/foo/Cargo.toml index 54fff4815..52f28d821 100644 --- a/test cases/rust/30 cargo workspace/subprojects/foo/Cargo.toml +++ b/test cases/rust/30 cargo workspace/subprojects/foo/Cargo.toml @@ -12,4 +12,4 @@ version = "1.0.0" [workspace.dependencies] member1 = { path="./src/member1" } -member2 = { path="src/member2", features = ["f1"] } +member2 = { path="subprojects/member2-1.0", features = ["f1"] } diff --git a/test cases/rust/30 cargo workspace/subprojects/foo/src/member2/Cargo.toml b/test cases/rust/30 cargo workspace/subprojects/foo/src/member2/Cargo.toml deleted file mode 100644 index 059120a1e..000000000 --- a/test cases/rust/30 cargo workspace/subprojects/foo/src/member2/Cargo.toml +++ /dev/null @@ -1,9 +0,0 @@ -[package] -name = "member2" -edition.workspace = true -version.workspace = true - -[features] -default = [] -f1 = [] -f2 = [] diff --git a/test cases/rust/30 cargo workspace/subprojects/foo/src/member2/src/lib.rs b/test cases/rust/30 cargo workspace/subprojects/foo/src/member2/src/lib.rs deleted file mode 100644 index 75703a957..000000000 --- a/test cases/rust/30 cargo workspace/subprojects/foo/src/member2/src/lib.rs +++ /dev/null @@ -1,5 +0,0 @@ -#[cfg(feature = "f1")] -#[cfg(feature = "f2")] -pub fn member2() -> i32 { - 1 -} diff --git a/test cases/rust/30 cargo workspace/subprojects/foo/subprojects/member2-1-rs.wrap b/test cases/rust/30 cargo workspace/subprojects/foo/subprojects/member2-1-rs.wrap new file mode 100644 index 000000000..57ae2faa6 --- /dev/null +++ b/test cases/rust/30 cargo workspace/subprojects/foo/subprojects/member2-1-rs.wrap @@ -0,0 +1,6 @@ +[wrap-file] +directory=member2-1.0 +method=cargo + +[provide] +dependency_names=member2-1-rs diff --git a/test cases/rust/30 cargo workspace/subprojects/foo/subprojects/member2-1.0/Cargo.toml b/test cases/rust/30 cargo workspace/subprojects/foo/subprojects/member2-1.0/Cargo.toml new file mode 100644 index 000000000..059120a1e --- /dev/null +++ b/test cases/rust/30 cargo workspace/subprojects/foo/subprojects/member2-1.0/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "member2" +edition.workspace = true +version.workspace = true + +[features] +default = [] +f1 = [] +f2 = [] diff --git a/test cases/rust/30 cargo workspace/subprojects/foo/subprojects/member2-1.0/src/lib.rs b/test cases/rust/30 cargo workspace/subprojects/foo/subprojects/member2-1.0/src/lib.rs new file mode 100644 index 000000000..75703a957 --- /dev/null +++ b/test cases/rust/30 cargo workspace/subprojects/foo/subprojects/member2-1.0/src/lib.rs @@ -0,0 +1,5 @@ +#[cfg(feature = "f1")] +#[cfg(feature = "f2")] +pub fn member2() -> i32 { + 1 +} diff --git a/test cases/rust/30 cargo workspace/subprojects/member2.wrap b/test cases/rust/30 cargo workspace/subprojects/member2.wrap new file mode 100644 index 000000000..3d43da646 --- /dev/null +++ b/test cases/rust/30 cargo workspace/subprojects/member2.wrap @@ -0,0 +1,2 @@ +[wrap-redirect] +filename = foo/subprojects/member2-1-rs.wrap -- cgit v1.2.3