diff options
13 files changed, 80 insertions, 7 deletions
diff --git a/src/buildtool/build_engine/analysed_target/TARGETS b/src/buildtool/build_engine/analysed_target/TARGETS index 8d524e08..70b8a89a 100644 --- a/src/buildtool/build_engine/analysed_target/TARGETS +++ b/src/buildtool/build_engine/analysed_target/TARGETS @@ -9,6 +9,7 @@ , ["src/buildtool/common", "action_description"] , ["src/buildtool/common", "artifact_description"] , ["src/buildtool/common", "tree"] + , ["src/buildtool/common", "tree_overlay"] ] , "stage": ["src", "buildtool", "build_engine", "analysed_target"] , "private-deps": diff --git a/src/buildtool/build_engine/analysed_target/analysed_target.hpp b/src/buildtool/build_engine/analysed_target/analysed_target.hpp index 419db910..8971b5fe 100644 --- a/src/buildtool/build_engine/analysed_target/analysed_target.hpp +++ b/src/buildtool/build_engine/analysed_target/analysed_target.hpp @@ -29,6 +29,7 @@ #include "src/buildtool/common/action_description.hpp" #include "src/buildtool/common/artifact_description.hpp" #include "src/buildtool/common/tree.hpp" +#include "src/buildtool/common/tree_overlay.hpp" class AnalysedTarget { public: @@ -36,6 +37,7 @@ class AnalysedTarget { std::vector<ActionDescription::Ptr> actions, std::vector<std::string> blobs, std::vector<Tree::Ptr> trees, + std::vector<TreeOverlay::Ptr> tree_overlays, std::unordered_set<std::string> vars, std::set<std::string> tainted, std::set<std::string> implied_export_targets, @@ -44,6 +46,7 @@ class AnalysedTarget { actions_{std::move(actions)}, blobs_{std::move(blobs)}, trees_{std::move(trees)}, + tree_overlays_{std::move(tree_overlays)}, vars_{std::move(vars)}, tainted_{std::move(tainted)}, implied_export_targets_{std::move(implied_export_targets)}, @@ -86,6 +89,14 @@ class AnalysedTarget { -> std::vector<Tree::Ptr> const& { return trees_; } + [[nodiscard]] auto TreeOverlays() && noexcept + -> std::vector<TreeOverlay::Ptr> { + return std::move(tree_overlays_); + } + [[nodiscard]] auto TreeOverlays() const& noexcept + -> std::vector<TreeOverlay::Ptr> const& { + return tree_overlays_; + } [[nodiscard]] auto Blobs() && noexcept -> std::vector<std::string> { return std::move(blobs_); } @@ -133,6 +144,7 @@ class AnalysedTarget { std::vector<ActionDescription::Ptr> actions_; std::vector<std::string> blobs_; std::vector<Tree::Ptr> trees_; + std::vector<TreeOverlay::Ptr> tree_overlays_; std::unordered_set<std::string> vars_; std::set<std::string> tainted_; std::set<std::string> implied_export_targets_; diff --git a/src/buildtool/build_engine/base_maps/TARGETS b/src/buildtool/build_engine/base_maps/TARGETS index 92febe84..dad59e53 100644 --- a/src/buildtool/build_engine/base_maps/TARGETS +++ b/src/buildtool/build_engine/base_maps/TARGETS @@ -101,6 +101,7 @@ , ["src/buildtool/build_engine/expression", "expression_ptr_interface"] , ["src/buildtool/common", "action_description"] , ["src/buildtool/common", "tree"] + , ["src/buildtool/common", "tree_overlay"] ] } , "field_reader": diff --git a/src/buildtool/build_engine/base_maps/source_map.cpp b/src/buildtool/build_engine/base_maps/source_map.cpp index 2ac79131..7a057f1b 100644 --- a/src/buildtool/build_engine/base_maps/source_map.cpp +++ b/src/buildtool/build_engine/base_maps/source_map.cpp @@ -32,6 +32,7 @@ #include "src/buildtool/build_engine/expression/target_result.hpp" #include "src/buildtool/common/action_description.hpp" #include "src/buildtool/common/tree.hpp" +#include "src/buildtool/common/tree_overlay.hpp" #include "src/buildtool/multithreading/async_map_consumer.hpp" namespace BuildMaps::Base { @@ -49,6 +50,7 @@ auto as_target(const BuildMaps::Base::EntityName& key, std::vector<ActionDescription::Ptr>{}, std::vector<std::string>{}, std::vector<Tree::Ptr>{}, + std::vector<TreeOverlay::Ptr>{}, std::unordered_set<std::string>{}, std::set<std::string>{}, std::set<std::string>{}, diff --git a/src/buildtool/build_engine/target_map/TARGETS b/src/buildtool/build_engine/target_map/TARGETS index 5684f5c7..6cffebbb 100644 --- a/src/buildtool/build_engine/target_map/TARGETS +++ b/src/buildtool/build_engine/target_map/TARGETS @@ -75,6 +75,7 @@ , ["src/buildtool/common", "config"] , ["src/buildtool/common", "statistics"] , ["src/buildtool/common", "tree"] + , ["src/buildtool/common", "tree_overlay"] , ["src/buildtool/crypto", "hash_function"] , ["src/buildtool/crypto", "hasher"] , ["src/buildtool/file_system", "file_root"] @@ -137,6 +138,7 @@ , ["src/buildtool/common", "config"] , ["src/buildtool/common", "statistics"] , ["src/buildtool/common", "tree"] + , ["src/buildtool/common", "tree_overlay"] , ["src/buildtool/logging", "log_level"] , ["src/buildtool/logging", "logging"] , ["src/buildtool/progress_reporting", "progress"] diff --git a/src/buildtool/build_engine/target_map/absent_target_map.cpp b/src/buildtool/build_engine/target_map/absent_target_map.cpp index 8de5a97a..14e51e06 100644 --- a/src/buildtool/build_engine/target_map/absent_target_map.cpp +++ b/src/buildtool/build_engine/target_map/absent_target_map.cpp @@ -32,6 +32,7 @@ #include "src/buildtool/common/repository_config.hpp" #include "src/buildtool/common/statistics.hpp" #include "src/buildtool/common/tree.hpp" +#include "src/buildtool/common/tree_overlay.hpp" #include "src/buildtool/logging/log_level.hpp" #include "src/buildtool/logging/logger.hpp" #include "src/buildtool/progress_reporting/progress.hpp" @@ -167,6 +168,7 @@ void WithFlexibleVariables( std::vector<ActionDescription::Ptr>{}, std::vector<std::string>{}, std::vector<Tree::Ptr>{}, + std::vector<TreeOverlay::Ptr>{}, std::unordered_set<std::string>{flexible_vars.begin(), flexible_vars.end()}, std::set<std::string>{}, 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 ec25a785..00a10efe 100644 --- a/src/buildtool/build_engine/target_map/built_in_rules.cpp +++ b/src/buildtool/build_engine/target_map/built_in_rules.cpp @@ -52,6 +52,7 @@ #include "src/buildtool/common/artifact_digest_factory.hpp" #include "src/buildtool/common/repository_config.hpp" #include "src/buildtool/common/tree.hpp" +#include "src/buildtool/common/tree_overlay.hpp" #include "src/buildtool/file_system/object_type.hpp" #include "src/buildtool/storage/storage.hpp" #include "src/utils/cpp/path.hpp" @@ -301,6 +302,7 @@ void BlobGenRuleWithDeps( std::vector<ActionDescription::Ptr>{}, std::vector<std::string>{data_val->String()}, std::vector<Tree::Ptr>{}, + std::vector<TreeOverlay::Ptr>{}, std::move(vars_set), std::move(tainted), std::move(implied_export), @@ -543,6 +545,7 @@ void TreeRuleWithDeps( std::vector<ActionDescription::Ptr>{}, std::vector<std::string>{}, std::move(trees), + std::vector<TreeOverlay::Ptr>{}, std::move(vars_set), std::move(tainted), std::move(implied_export), @@ -802,6 +805,7 @@ void InstallRuleWithDeps( std::vector<ActionDescription::Ptr>{}, std::vector<std::string>{}, std::vector<Tree::Ptr>{}, + std::vector<TreeOverlay::Ptr>{}, std::move(effective_vars), std::move(tainted), std::move(implied_export), @@ -1431,6 +1435,7 @@ void GenericRuleWithDeps( std::vector<ActionDescription::Ptr>{action}, std::vector<std::string>{}, std::move(trees), + std::vector<TreeOverlay::Ptr>{}, std::move(effective_vars), std::move(tainted), std::move(implied_export), @@ -1643,6 +1648,7 @@ void ConfigureRule( std::vector<ActionDescription::Ptr>{}, std::vector<std::string>{}, std::vector<Tree::Ptr>{}, + std::vector<TreeOverlay::Ptr>{}, std::move(vars_set), tainted, configured_target->ImpliedExport(), diff --git a/src/buildtool/build_engine/target_map/export.cpp b/src/buildtool/build_engine/target_map/export.cpp index 3433ff4c..0bbe5ac6 100644 --- a/src/buildtool/build_engine/target_map/export.cpp +++ b/src/buildtool/build_engine/target_map/export.cpp @@ -41,6 +41,7 @@ #include "src/buildtool/common/repository_config.hpp" #include "src/buildtool/common/statistics.hpp" #include "src/buildtool/common/tree.hpp" +#include "src/buildtool/common/tree_overlay.hpp" #include "src/buildtool/logging/log_level.hpp" #include "src/buildtool/logging/logger.hpp" #include "src/buildtool/progress_reporting/progress.hpp" @@ -107,6 +108,7 @@ void FinalizeExport( std::vector<ActionDescription::Ptr>{}, std::vector<std::string>{}, std::vector<Tree::Ptr>{}, + std::vector<TreeOverlay::Ptr>{}, std::move(vars_set), std::set<std::string>{}, std::move(implied), @@ -253,6 +255,7 @@ void ExportRule( std::vector<ActionDescription::Ptr>{}, std::vector<std::string>{}, std::vector<Tree::Ptr>{}, + std::vector<TreeOverlay::Ptr>{}, std::unordered_set<std::string>{flexible_vars->begin(), flexible_vars->end()}, std::set<std::string>{}, diff --git a/src/buildtool/build_engine/target_map/result_map.hpp b/src/buildtool/build_engine/target_map/result_map.hpp index 6b5295c2..d38a1d7a 100644 --- a/src/buildtool/build_engine/target_map/result_map.hpp +++ b/src/buildtool/build_engine/target_map/result_map.hpp @@ -99,6 +99,7 @@ class ResultTargetMap { num_actions_[part] += entry->second->Actions().size(); num_blobs_[part] += entry->second->Blobs().size(); num_trees_[part] += entry->second->Trees().size(); + num_tree_overlays_[part] += entry->second->TreeOverlays().size(); } return entry->second; } @@ -189,14 +190,17 @@ class ResultTargetMap { std::size_t na = 0; std::size_t nb = 0; std::size_t nt = 0; + std::size_t nto = 0; for (std::size_t i = 0; i < width_; i++) { na += num_actions_[i]; nb += num_blobs_[i]; nt += num_trees_[i]; + nto += num_tree_overlays_[i]; } result.actions.reserve(na); result.blobs.reserve(nb); result.trees.reserve(nt); + result.tree_overlays.reserve(nto); auto& origin_map = progress->OriginMap(); origin_map.clear(); @@ -268,10 +272,14 @@ class ResultTargetMap { } auto const& blobs = el.second->Blobs(); auto const& trees = el.second->Trees(); + auto const& tree_overlays = el.second->TreeOverlays(); result.blobs.insert( result.blobs.end(), blobs.begin(), blobs.end()); result.trees.insert( result.trees.end(), trees.begin(), trees.end()); + result.tree_overlays.insert(result.tree_overlays.end(), + tree_overlays.begin(), + tree_overlays.end()); }); } @@ -289,6 +297,17 @@ class ResultTargetMap { [](auto left, auto right) { return left->Id() == right->Id(); }); result.trees.erase(lasttree, result.trees.end()); + std::sort( + result.tree_overlays.begin(), + result.tree_overlays.end(), + [](auto left, auto right) { return left->Id() < right->Id(); }); + auto lasttree_overlay = std::unique( + result.tree_overlays.begin(), + result.tree_overlays.end(), + [](auto left, auto right) { return left->Id() == right->Id(); }); + result.tree_overlays.erase(lasttree_overlay, + result.tree_overlays.end()); + std::sort(result.actions.begin(), result.actions.end(), [](auto left, auto right) { @@ -344,12 +363,14 @@ class ResultTargetMap { "Analysed {} non-known source trees", trees_traversed); } - Logger::Log(logger, - LogLevel::Info, - "Discovered {} actions, {} trees, {} blobs", - result.actions.size(), - result.trees.size(), - result.blobs.size()); + Logger::Log( + logger, + LogLevel::Info, + "Discovered {} actions, {} tree overlays, {} trees, {} blobs", + result.actions.size(), + result.tree_overlays.size(), + result.trees.size(), + result.blobs.size()); return result; } @@ -362,6 +383,7 @@ class ResultTargetMap { auto const result = ToResult<kIncludeOrigins>(stats, progress, logger); auto actions = nlohmann::json::object(); auto trees = nlohmann::json::object(); + auto tree_overlays = nlohmann::json::object(); std::for_each(result.actions.begin(), result.actions.end(), [&actions](auto const& action) { @@ -379,8 +401,18 @@ class ResultTargetMap { result.trees.begin(), result.trees.end(), [&trees](auto const& tree) { trees[tree->Id()] = tree->ToJson(); }); - return nlohmann::json{ + std::for_each(result.tree_overlays.begin(), + result.tree_overlays.end(), + [&tree_overlays](auto const& tree_overlay) { + tree_overlays[tree_overlay->Id()] = + tree_overlay->ToJson(); + }); + auto json = nlohmann::json{ {"actions", actions}, {"blobs", result.blobs}, {"trees", trees}}; + if (not tree_overlays.empty()) { + json["tree_overlays"] = tree_overlays; + } + return json; } template <bool kIncludeOrigins = true> @@ -427,6 +459,8 @@ class ResultTargetMap { std::vector<std::size_t> num_actions_{std::vector<std::size_t>(width_)}; std::vector<std::size_t> num_blobs_{std::vector<std::size_t>(width_)}; std::vector<std::size_t> num_trees_{std::vector<std::size_t>(width_)}; + std::vector<std::size_t> num_tree_overlays_{ + std::vector<std::size_t>(width_)}; constexpr static auto ComputeWidth(std::size_t jobs) -> std::size_t { if (jobs <= 0) { diff --git a/src/buildtool/build_engine/target_map/target_map.cpp b/src/buildtool/build_engine/target_map/target_map.cpp index e714aabb..634db0dc 100644 --- a/src/buildtool/build_engine/target_map/target_map.cpp +++ b/src/buildtool/build_engine/target_map/target_map.cpp @@ -61,6 +61,7 @@ #include "src/buildtool/common/repository_config.hpp" #include "src/buildtool/common/statistics.hpp" #include "src/buildtool/common/tree.hpp" +#include "src/buildtool/common/tree_overlay.hpp" #include "src/buildtool/crypto/hash_function.hpp" #include "src/buildtool/file_system/file_root.hpp" #include "src/buildtool/file_system/object_type.hpp" @@ -1043,6 +1044,7 @@ void withDependencies( std::move(actions), std::move(blobs), std::move(trees), + std::vector<TreeOverlay::Ptr>{}, std::move(effective_vars), std::move(tainted), std::move(implied_export), @@ -1575,6 +1577,7 @@ void withTargetNode( {}, {}, {}, + {}, TargetGraphInformation::kSource})); } else { @@ -1678,6 +1681,7 @@ void TreeTarget( std::vector<ActionDescription::Ptr>{}, std::vector<std::string>{}, std::vector<Tree::Ptr>{}, + std::vector<TreeOverlay::Ptr>{}, std::unordered_set<std::string>{}, std::set<std::string>{}, std::set<std::string>{}, @@ -1766,6 +1770,7 @@ void TreeTarget( std::vector<ActionDescription::Ptr>{}, std::vector<std::string>{}, std::vector<Tree::Ptr>{tree}, + std::vector<TreeOverlay::Ptr>{}, std::unordered_set<std::string>{}, std::set<std::string>{}, std::set<std::string>{}, @@ -1800,6 +1805,7 @@ void GlobResult(const std::vector<AnalysedTargetPtr const*>& values, std::vector<ActionDescription::Ptr>{}, std::vector<std::string>{}, std::vector<Tree::Ptr>{}, + std::vector<TreeOverlay::Ptr>{}, std::unordered_set<std::string>{}, std::set<std::string>{}, std::set<std::string>{}, diff --git a/src/buildtool/main/analyse.cpp b/src/buildtool/main/analyse.cpp index dcb2181b..9315d5b7 100644 --- a/src/buildtool/main/analyse.cpp +++ b/src/buildtool/main/analyse.cpp @@ -111,6 +111,7 @@ namespace Target = BuildMaps::Target; std::vector<ActionDescription::Ptr>{action}, target->Blobs(), target->Trees(), + target->TreeOverlays(), target->Vars(), target->Tainted(), target->ImpliedExport(), diff --git a/test/buildtool/build_engine/target_map/TARGETS b/test/buildtool/build_engine/target_map/TARGETS index ede3b41c..e477393e 100644 --- a/test/buildtool/build_engine/target_map/TARGETS +++ b/test/buildtool/build_engine/target_map/TARGETS @@ -23,6 +23,7 @@ , ["@", "src", "src/buildtool/common", "common"] , ["@", "src", "src/buildtool/common", "statistics"] , ["@", "src", "src/buildtool/common", "tree"] + , ["@", "src", "src/buildtool/common", "tree_overlay"] , ["@", "src", "src/buildtool/file_system", "file_system_manager"] , ["@", "src", "src/buildtool/progress_reporting", "progress"] , ["", "catch-main"] diff --git a/test/buildtool/build_engine/target_map/result_map.test.cpp b/test/buildtool/build_engine/target_map/result_map.test.cpp index 7e4228f5..a5ccc21b 100644 --- a/test/buildtool/build_engine/target_map/result_map.test.cpp +++ b/test/buildtool/build_engine/target_map/result_map.test.cpp @@ -37,6 +37,7 @@ #include "src/buildtool/common/action_description.hpp" #include "src/buildtool/common/statistics.hpp" #include "src/buildtool/common/tree.hpp" +#include "src/buildtool/common/tree_overlay.hpp" #include "src/buildtool/file_system/file_system_manager.hpp" #include "src/buildtool/progress_reporting/progress.hpp" @@ -60,6 +61,7 @@ namespace { descs, blobs, std::vector<Tree::Ptr>(), + std::vector<TreeOverlay::Ptr>(), std::unordered_set<std::string>{}, std::set<std::string>{}, std::set<std::string>{}, |