summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2025-10-27 14:21:20 +0100
committerDylan Baker <dylan@pnwbakers.com>2025-10-29 11:34:19 -0700
commitfd3416f0799bedaa143c7a8ad6996dc220e53c96 (patch)
tree4d5a0f1a2675b60ff251e6aa64f193b6951074ee
parent940361f4596b5b12d10df28de2cca0f892135746 (diff)
downloadmeson-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.py10
-rw-r--r--test cases/rust/30 cargo workspace/subprojects/foo/Cargo.toml2
-rw-r--r--test cases/rust/30 cargo workspace/subprojects/foo/subprojects/member2-1-rs.wrap6
-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.wrap2
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