diff options
author | Klaus Aehlig <klaus.aehlig@huawei.com> | 2024-08-22 16:39:12 +0200 |
---|---|---|
committer | Klaus Aehlig <klaus.aehlig@huawei.com> | 2024-08-23 11:44:04 +0200 |
commit | 74a5fbc9644eda7f105d2d2c672a41fa5c34c6a8 (patch) | |
tree | 53cb6c473de1921ca8851a41b7984027782fee44 /src/buildtool/build_engine/target_map/target_map.cpp | |
parent | 4fd4686b785a8c96ac99a0c5ebfc41625bca85a7 (diff) | |
download | justbuild-74a5fbc9644eda7f105d2d2c672a41fa5c34c6a8.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.
Diffstat (limited to 'src/buildtool/build_engine/target_map/target_map.cpp')
-rw-r--r-- | src/buildtool/build_engine/target_map/target_map.cpp | 35 |
1 files changed, 24 insertions, 11 deletions
diff --git a/src/buildtool/build_engine/target_map/target_map.cpp b/src/buildtool/build_engine/target_map/target_map.cpp index ab6461e3..26935f09 100644 --- a/src/buildtool/build_engine/target_map/target_map.cpp +++ b/src/buildtool/build_engine/target_map/target_map.cpp @@ -556,16 +556,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{ @@ -709,8 +722,8 @@ void withDependencies( } } auto action = BuildMaps::Target::Utils::createAction( - outputs, - output_dirs, + outputs_norm, + output_dirs_norm, std::move(cmd), cwd_exp->String(), env_exp, @@ -726,13 +739,13 @@ void withDependencies( result.emplace( out, ExpressionPtr{ArtifactDescription::CreateAction( - action_id, std::filesystem::path{out})}); + action_id, ToNormalPath(out))}); } for (auto const& out : output_dirs) { result.emplace( out, ExpressionPtr{ArtifactDescription::CreateAction( - action_id, std::filesystem::path{out})}); + action_id, ToNormalPath(out))}); } return ExpressionPtr{Expression::map_t{result}}; |