diff options
author | Klaus Aehlig <klaus.aehlig@huawei.com> | 2025-05-05 16:41:37 +0200 |
---|---|---|
committer | Klaus Aehlig <klaus.aehlig@huawei.com> | 2025-05-05 16:46:38 +0200 |
commit | f249a220913f4421c58c9c6251e4f3dce67e251c (patch) | |
tree | 8e5b3017211e2815d265022c3f19e2db544e6bdf | |
parent | a3d2803ebd12dd2741a249536752418faf7b0ec5 (diff) | |
download | justbuild-f249a220913f4421c58c9c6251e4f3dce67e251c.tar.gz |
generic rule: fix conflict check
For a generic rule, it is an error if map union of various
inputs (overlayed in correct order) does not form a proper stage. To
implement this check properly, we first have to construct the map of
all inputs and only then perform the staging check and not do the check
with only the runfiles, as 5e104a526cf76fe75312d2fd288a3c88f506fb0a
accidentally did. Fix this.
-rw-r--r-- | CHANGELOG.md | 2 | ||||
-rw-r--r-- | src/buildtool/build_engine/target_map/built_in_rules.cpp | 2 |
2 files changed, 3 insertions, 1 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 6dc36275..87567ff5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,8 @@ A feature release on top of `1.5.0`, backwards compatible. and through its local CAS; this fixes a performance issue. - `just-mr` now also consideres computed roots (as no-op) when reporting progress. +- The "generic" rule now properly detects staging conflicts, taking + the full inputs into account (and not only the runfiles). ## Release `1.5.0` (2025-03-06) diff --git a/src/buildtool/build_engine/target_map/built_in_rules.cpp b/src/buildtool/build_engine/target_map/built_in_rules.cpp index c0015b29..1736f3c7 100644 --- a/src/buildtool/build_engine/target_map/built_in_rules.cpp +++ b/src/buildtool/build_engine/target_map/built_in_rules.cpp @@ -1455,10 +1455,10 @@ void GenericRuleWithDeps( for (auto const& dep : dependency_values) { inputs = ExpressionPtr{Expression::map_t{inputs, (*dep)->RunFiles()}}; } - auto inputs_conflict = BuildMaps::Target::Utils::tree_conflict(inputs); for (auto const& dep : dependency_values) { inputs = ExpressionPtr{Expression::map_t{inputs, (*dep)->Artifacts()}}; } + auto inputs_conflict = BuildMaps::Target::Utils::tree_conflict(inputs); // While syntactical conflicts are resolved in a latest wins (with artifacts // after runfiles), semantic path conclicts are an error. if (inputs_conflict) { |