summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKlaus Aehlig <klaus.aehlig@huawei.com>2024-08-22 16:39:12 +0200
committerKlaus Aehlig <klaus.aehlig@huawei.com>2024-09-09 12:49:47 +0200
commit87a240bbfcd2bc3db02a70224d47e52a4da0e47e (patch)
tree75c495a0c44672d17c4fa7656b9010f9f566fc73 /src
parenta2d2cf6b3120205e7916b8fc7370127409d7f306 (diff)
downloadjustbuild-87a240bbfcd2bc3db02a70224d47e52a4da0e47e.tar.gz
When creating actions, normalize paths in the action definition
... and also perform conflict check on the normalized paths. Still, the the output of the "ACTION" funtion be keyed by the representation of the paths as originally described, to allow the author of a rule to use non-normalized paths as well. (cherry-picked from 74a5fbc9644eda7f105d2d2c672a41fa5c34c6a8)
Diffstat (limited to 'src')
-rw-r--r--src/buildtool/build_engine/target_map/built_in_rules.cpp4
-rw-r--r--src/buildtool/build_engine/target_map/target_map.cpp35
2 files changed, 26 insertions, 13 deletions
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 6d58e900..66a355a0 100644
--- a/src/buildtool/build_engine/target_map/built_in_rules.cpp
+++ b/src/buildtool/build_engine/target_map/built_in_rules.cpp
@@ -1113,7 +1113,7 @@ void GenericRuleWithDeps(
true);
return;
}
- outs.emplace_back(x->String());
+ outs.emplace_back(ToNormalPath(x->String()).string());
}
}
}
@@ -1144,7 +1144,7 @@ void GenericRuleWithDeps(
true);
return;
}
- out_dirs.emplace_back(x->String());
+ out_dirs.emplace_back(ToNormalPath(x->String()).string());
}
}
}
diff --git a/src/buildtool/build_engine/target_map/target_map.cpp b/src/buildtool/build_engine/target_map/target_map.cpp
index a4a08c40..4e84ec03 100644
--- a/src/buildtool/build_engine/target_map/target_map.cpp
+++ b/src/buildtool/build_engine/target_map/target_map.cpp
@@ -552,16 +552,29 @@ void withDependencies(
throw Evaluator::EvaluationError{
"either outs or out_dirs must be specified for ACTION"};
}
-
- sort_and_deduplicate(&outputs);
- sort_and_deduplicate(&output_dirs);
+ ActionDescription::outputs_t outputs_norm{};
+ ActionDescription::outputs_t output_dirs_norm{};
+ outputs_norm.reserve(outputs.size());
+ output_dirs_norm.reserve(output_dirs.size());
+ std::for_each(
+ outputs.begin(), outputs.end(), [&outputs_norm](auto p) {
+ outputs_norm.emplace_back(ToNormalPath(p));
+ });
+ std::for_each(output_dirs.begin(),
+ output_dirs.end(),
+ [&output_dirs_norm](auto p) {
+ output_dirs_norm.emplace_back(ToNormalPath(p));
+ });
+
+ sort_and_deduplicate(&outputs_norm);
+ sort_and_deduplicate(&output_dirs_norm);
// find entries present on both fields
std::vector<std::string> dups{};
- std::set_intersection(outputs.begin(),
- outputs.end(),
- output_dirs.begin(),
- output_dirs.end(),
+ std::set_intersection(outputs_norm.begin(),
+ outputs_norm.end(),
+ output_dirs_norm.begin(),
+ output_dirs_norm.end(),
std::back_inserter(dups));
if (not dups.empty()) {
throw Evaluator::EvaluationError{
@@ -691,8 +704,8 @@ void withDependencies(
}
}
auto action = BuildMaps::Target::Utils::createAction(
- outputs,
- output_dirs,
+ outputs_norm,
+ output_dirs_norm,
std::move(cmd),
env_exp,
may_fail,
@@ -706,12 +719,12 @@ void withDependencies(
for (auto const& out : outputs) {
result.emplace(out,
ExpressionPtr{ArtifactDescription{
- action_id, std::filesystem::path{out}}});
+ action_id, ToNormalPath(out)}});
}
for (auto const& out : output_dirs) {
result.emplace(out,
ExpressionPtr{ArtifactDescription{
- action_id, std::filesystem::path{out}}});
+ action_id, ToNormalPath(out)}});
}
return ExpressionPtr{Expression::map_t{result}};