Skip to content

Commit 441989a

Browse files
committed
fix: transitive path deps resolve relative to parent dep's root
Path dependencies of transitive deps were resolved relative to the main project root, which fails for workspace members when greeter depends on core via path = "../core" but the build target is apps/hello. Fix: add resolveRoot to WorkItem so child deps resolve relative to their parent dep's directory. Also fix CI to pick the newest built mcpp binary (avoids stale cached binaries from different fingerprints).
1 parent e1ebd22 commit 441989a

1 file changed

Lines changed: 10 additions & 6 deletions

File tree

src/cli.cppm

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1210,6 +1210,7 @@ prepare_build(bool print_fingerprint,
12101210
std::string requestedBy; // who asked for it
12111211
std::string originalConstraint; // spec.version BEFORE pinning (for SemVer merge)
12121212
std::size_t consumerDepIndex; // dep_manifests slot of who pushed this child; kMainConsumer for main
1213+
std::filesystem::path resolveRoot; // base dir for relative path deps (empty = use project root)
12131214
};
12141215
std::deque<WorkItem> worklist;
12151216

@@ -1454,12 +1455,12 @@ prepare_build(bool print_fingerprint,
14541455
// caller wants them; they're never propagated transitively.
14551456
const std::string mainPkgLabel = m->package.name;
14561457
for (auto& [n, s] : m->dependencies) {
1457-
worklist.push_back({n, s, mainPkgLabel, s.version, kMainConsumer});
1458+
worklist.push_back({n, s, mainPkgLabel, s.version, kMainConsumer, {}});
14581459
}
14591460
if (includeDevDeps) {
14601461
for (auto& [n, s] : m->devDependencies) {
14611462
worklist.push_back({n, s, mainPkgLabel + " (dev-dep)",
1462-
s.version, kMainConsumer});
1463+
s.version, kMainConsumer, {}});
14631464
}
14641465
}
14651466

@@ -1708,7 +1709,7 @@ prepare_build(bool print_fingerprint,
17081709
dep_manifests[it->second.depIndex]->dependencies) {
17091710
worklist.push_back({child_name, child_spec, newLabel,
17101711
child_spec.version,
1711-
it->second.depIndex});
1712+
it->second.depIndex, {}});
17121713
}
17131714
continue;
17141715
}
@@ -1720,9 +1721,12 @@ prepare_build(bool print_fingerprint,
17201721
std::filesystem::path dep_root;
17211722

17221723
if (spec.isPath()) {
1723-
// Path-based: resolve relative to project root.
1724+
// Path-based: resolve relative to the consumer's root dir.
1725+
// For top-level deps this is the project root; for transitive
1726+
// deps it's the parent dep's directory (stored in resolveRoot).
17241727
dep_root = spec.path;
1725-
if (dep_root.is_relative()) dep_root = *root / dep_root;
1728+
auto base = item.resolveRoot.empty() ? *root : item.resolveRoot;
1729+
if (dep_root.is_relative()) dep_root = base / dep_root;
17261730
dep_root = std::filesystem::weakly_canonical(dep_root);
17271731
} else if (spec.isGit()) {
17281732
// Git-based (M4 #5): clone into ~/.mcpp/git/<hash>/<rev>/
@@ -1857,7 +1861,7 @@ prepare_build(bool print_fingerprint,
18571861
const std::size_t selfIdx = dep_manifests.size() - 1;
18581862
for (auto& [child_name, child_spec] : dep_manifests.back()->dependencies) {
18591863
worklist.push_back({child_name, child_spec, thisDepLabel,
1860-
child_spec.version, selfIdx});
1864+
child_spec.version, selfIdx, dep_root});
18611865
}
18621866
}
18631867

0 commit comments

Comments
 (0)