diff options
| author | Paolo Bonzini <pbonzini@redhat.com> | 2025-10-27 14:21:20 +0100 |
|---|---|---|
| committer | Dylan Baker <dylan@pnwbakers.com> | 2025-10-29 11:34:19 -0700 |
| commit | fd3416f0799bedaa143c7a8ad6996dc220e53c96 (patch) | |
| tree | 4d5a0f1a2675b60ff251e6aa64f193b6951074ee | |
| parent | 940361f4596b5b12d10df28de2cca0f892135746 (diff) | |
| download | meson-fd3416f0799bedaa143c7a8ad6996dc220e53c96.tar.gz | |
cargo: use subproject() if a workspace member is in subprojects/
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
| -rw-r--r-- | mesonbuild/cargo/interpreter.py | 10 | ||||
| -rw-r--r-- | test cases/rust/30 cargo workspace/subprojects/foo/Cargo.toml | 2 | ||||
| -rw-r--r-- | test cases/rust/30 cargo workspace/subprojects/foo/subprojects/member2-1-rs.wrap | 6 | ||||
| -rw-r--r-- | test cases/rust/30 cargo workspace/subprojects/foo/subprojects/member2-1.0/Cargo.toml (renamed from test cases/rust/30 cargo workspace/subprojects/foo/src/member2/Cargo.toml) | 0 | ||||
| -rw-r--r-- | test cases/rust/30 cargo workspace/subprojects/foo/subprojects/member2-1.0/src/lib.rs (renamed from test cases/rust/30 cargo workspace/subprojects/foo/src/member2/src/lib.rs) | 0 | ||||
| -rw-r--r-- | test cases/rust/30 cargo workspace/subprojects/member2.wrap | 2 |
6 files changed, 18 insertions, 2 deletions
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/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/src/member2/Cargo.toml b/test cases/rust/30 cargo workspace/subprojects/foo/subprojects/member2-1.0/Cargo.toml index 059120a1e..059120a1e 100644 --- a/test cases/rust/30 cargo workspace/subprojects/foo/src/member2/Cargo.toml +++ b/test cases/rust/30 cargo workspace/subprojects/foo/subprojects/member2-1.0/Cargo.toml 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/subprojects/member2-1.0/src/lib.rs index 75703a957..75703a957 100644 --- a/test cases/rust/30 cargo workspace/subprojects/foo/src/member2/src/lib.rs +++ b/test cases/rust/30 cargo workspace/subprojects/foo/subprojects/member2-1.0/src/lib.rs 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 |
