diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/buildtool/build_engine/analysed_target/analysed_target.hpp | 18 | ||||
-rw-r--r-- | src/buildtool/build_engine/base_maps/source_map.cpp | 4 | ||||
-rw-r--r-- | src/buildtool/build_engine/target_map/built_in_rules.cpp | 14 | ||||
-rw-r--r-- | src/buildtool/build_engine/target_map/export.cpp | 4 | ||||
-rw-r--r-- | src/buildtool/build_engine/target_map/result_map.hpp | 39 | ||||
-rw-r--r-- | src/buildtool/build_engine/target_map/target_map.cpp | 10 | ||||
-rw-r--r-- | src/buildtool/build_engine/target_map/utils.cpp | 22 | ||||
-rw-r--r-- | src/buildtool/build_engine/target_map/utils.hpp | 6 | ||||
-rw-r--r-- | src/buildtool/common/action_description.hpp | 8 | ||||
-rw-r--r-- | src/buildtool/common/tree.hpp | 12 | ||||
-rw-r--r-- | src/buildtool/execution_engine/dag/dag.cpp | 10 | ||||
-rw-r--r-- | src/buildtool/execution_engine/dag/dag.hpp | 3 | ||||
-rw-r--r-- | src/buildtool/graph_traverser/graph_traverser.hpp | 16 | ||||
-rw-r--r-- | src/buildtool/main/main.cpp | 11 |
14 files changed, 99 insertions, 78 deletions
diff --git a/src/buildtool/build_engine/analysed_target/analysed_target.hpp b/src/buildtool/build_engine/analysed_target/analysed_target.hpp index af92b0bc..16f96071 100644 --- a/src/buildtool/build_engine/analysed_target/analysed_target.hpp +++ b/src/buildtool/build_engine/analysed_target/analysed_target.hpp @@ -16,9 +16,9 @@ class AnalysedTarget { public: AnalysedTarget(TargetResult result, - std::vector<ActionDescription> actions, + std::vector<ActionDescription::Ptr> actions, std::vector<std::string> blobs, - std::vector<Tree> trees, + std::vector<Tree::Ptr> trees, std::unordered_set<std::string> vars, std::set<std::string> tainted) : result_{std::move(result)}, @@ -29,10 +29,11 @@ class AnalysedTarget { tainted_{std::move(tainted)} {} [[nodiscard]] auto Actions() const& noexcept - -> std::vector<ActionDescription> const& { + -> std::vector<ActionDescription::Ptr> const& { return actions_; } - [[nodiscard]] auto Actions() && noexcept -> std::vector<ActionDescription> { + [[nodiscard]] auto Actions() && noexcept + -> std::vector<ActionDescription::Ptr> { return std::move(actions_); } [[nodiscard]] auto Artifacts() const& noexcept -> ExpressionPtr const& { @@ -57,10 +58,11 @@ class AnalysedTarget { -> std::vector<std::string> const& { return blobs_; } - [[nodiscard]] auto Trees() && noexcept -> std::vector<Tree> { + [[nodiscard]] auto Trees() && noexcept -> std::vector<Tree::Ptr> { return std::move(trees_); } - [[nodiscard]] auto Trees() const& noexcept -> std::vector<Tree> const& { + [[nodiscard]] auto Trees() const& noexcept + -> std::vector<Tree::Ptr> const& { return trees_; } [[nodiscard]] auto Blobs() && noexcept -> std::vector<std::string> { @@ -89,9 +91,9 @@ class AnalysedTarget { private: TargetResult result_; - std::vector<ActionDescription> actions_; + std::vector<ActionDescription::Ptr> actions_; std::vector<std::string> blobs_; - std::vector<Tree> trees_; + std::vector<Tree::Ptr> trees_; std::unordered_set<std::string> vars_; std::set<std::string> tainted_; }; diff --git a/src/buildtool/build_engine/base_maps/source_map.cpp b/src/buildtool/build_engine/base_maps/source_map.cpp index 5c2a79d0..6a6d49c0 100644 --- a/src/buildtool/build_engine/base_maps/source_map.cpp +++ b/src/buildtool/build_engine/base_maps/source_map.cpp @@ -17,9 +17,9 @@ auto as_target(const BuildMaps::Base::EntityName& key, ExpressionPtr artifact) ExpressionPtr{Expression::map_t{key.name, std::move(artifact)}}; return std::make_shared<AnalysedTarget>( TargetResult{stage, Expression::kEmptyMap, stage}, - std::vector<ActionDescription>{}, + std::vector<ActionDescription::Ptr>{}, std::vector<std::string>{}, - std::vector<Tree>{}, + std::vector<Tree::Ptr>{}, std::unordered_set<std::string>{}, 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 b98484b6..b5256158 100644 --- a/src/buildtool/build_engine/target_map/built_in_rules.cpp +++ b/src/buildtool/build_engine/target_map/built_in_rules.cpp @@ -147,9 +147,9 @@ void FileGenRuleWithDeps( vars_set.insert(param_vars->begin(), param_vars->end()); auto analysis_result = std::make_shared<AnalysedTarget>( TargetResult{stage, ExpressionPtr{Expression::map_t{}}, stage}, - std::vector<ActionDescription>{}, + std::vector<ActionDescription::Ptr>{}, std::vector<std::string>{data_val->String()}, - std::vector<Tree>{}, + std::vector<Tree::Ptr>{}, std::move(vars_set), std::move(tainted)); analysis_result = @@ -344,9 +344,9 @@ void InstallRuleWithDeps( auto const& empty_map = Expression::kEmptyMap; auto result = std::make_shared<AnalysedTarget>(TargetResult{stage, empty_map, stage}, - std::vector<ActionDescription>{}, + std::vector<ActionDescription::Ptr>{}, std::vector<std::string>{}, - std::vector<Tree>{}, + std::vector<Tree::Ptr>{}, std::move(effective_vars), std::move(tainted)); @@ -708,7 +708,7 @@ void GenericRuleWithDeps( std::nullopt, false, inputs); - auto action_identifier = action.Id(); + auto action_identifier = action->Id(); Expression::map_t::underlying_map_t artifacts; for (auto const& path : outs) { artifacts.emplace(path, @@ -720,9 +720,9 @@ void GenericRuleWithDeps( auto result = std::make_shared<AnalysedTarget>( TargetResult{ ExpressionPtr{Expression::map_t{artifacts}}, empty_map, empty_map}, - std::vector<ActionDescription>{action}, + std::vector<ActionDescription::Ptr>{action}, std::vector<std::string>{}, - std::vector<Tree>{}, + std::vector<Tree::Ptr>{}, std::move(effective_vars), std::move(tainted)); diff --git a/src/buildtool/build_engine/target_map/export.cpp b/src/buildtool/build_engine/target_map/export.cpp index cea76d36..73fcbb08 100644 --- a/src/buildtool/build_engine/target_map/export.cpp +++ b/src/buildtool/build_engine/target_map/export.cpp @@ -40,9 +40,9 @@ void FinalizeExport( // action auto analysis_result = std::make_shared<AnalysedTarget>( TargetResult{(*value)->Artifacts(), provides, (*value)->RunFiles()}, - std::vector<ActionDescription>{}, + std::vector<ActionDescription::Ptr>{}, std::vector<std::string>{}, - std::vector<Tree>{}, + std::vector<Tree::Ptr>{}, std::move(vars_set), std::set<std::string>{}); analysis_result = diff --git a/src/buildtool/build_engine/target_map/result_map.hpp b/src/buildtool/build_engine/target_map/result_map.hpp index 09304631..97d2bcf7 100644 --- a/src/buildtool/build_engine/target_map/result_map.hpp +++ b/src/buildtool/build_engine/target_map/result_map.hpp @@ -25,22 +25,22 @@ namespace BuildMaps::Target { class ResultTargetMap { public: struct ActionWithOrigin { - ActionDescription desc; + ActionDescription::Ptr desc; nlohmann::json origin; }; template <bool kIncludeOrigins = false> struct ResultType { - std::vector<ActionDescription> actions{}; + std::vector<ActionDescription::Ptr> actions{}; std::vector<std::string> blobs{}; - std::vector<Tree> trees{}; + std::vector<Tree::Ptr> trees{}; }; template <> struct ResultType</*kIncludeOrigins=*/true> { std::vector<ActionWithOrigin> actions{}; std::vector<std::string> blobs{}; - std::vector<Tree> trees{}; + std::vector<Tree::Ptr> trees{}; }; explicit ResultTargetMap(std::size_t jobs) : width_{ComputeWidth(jobs)} {} @@ -122,7 +122,7 @@ class ResultTargetMap { [&origin_map, &pos, &el](auto const& action) { std::pair<ConfiguredTarget, std::size_t> origin{ el.first, pos++}; - auto id = action.Id(); + auto id = action->Id(); if (origin_map.contains(id)) { origin_map[id].push_back(origin); } @@ -161,7 +161,7 @@ class ResultTargetMap { [&result, &origin_map](auto const& action) { auto origins = nlohmann::json::array(); for (auto const& [ct, count] : - origin_map[action.Id()]) { + origin_map[action->Id()]) { origins.push_back(nlohmann::json{ {"target", ct.target.ToJson()}, {"subtask", count}, @@ -191,23 +191,24 @@ class ResultTargetMap { auto lastblob = std::unique(result.blobs.begin(), result.blobs.end()); result.blobs.erase(lastblob, result.blobs.end()); - std::sort(result.trees.begin(), - result.trees.end(), - [](auto left, auto right) { return left.Id() < right.Id(); }); + std::sort( + result.trees.begin(), + result.trees.end(), + [](auto left, auto right) { return left->Id() < right->Id(); }); auto lasttree = std::unique( result.trees.begin(), result.trees.end(), - [](auto left, auto right) { return left.Id() == right.Id(); }); + [](auto left, auto right) { return left->Id() == right->Id(); }); result.trees.erase(lasttree, result.trees.end()); std::sort(result.actions.begin(), result.actions.end(), [](auto left, auto right) { if constexpr (kIncludeOrigins) { - return left.desc.Id() < right.desc.Id(); + return left.desc->Id() < right.desc->Id(); } else { - return left.Id() < right.Id(); + return left->Id() < right->Id(); } }); auto lastaction = @@ -215,10 +216,10 @@ class ResultTargetMap { result.actions.end(), [](auto left, auto right) { if constexpr (kIncludeOrigins) { - return left.desc.Id() == right.desc.Id(); + return left.desc->Id() == right.desc->Id(); } else { - return left.Id() == right.Id(); + return left->Id() == right->Id(); } }); result.actions.erase(lastaction, result.actions.end()); @@ -235,19 +236,19 @@ class ResultTargetMap { result.actions.end(), [&actions](auto const& action) { if constexpr (kIncludeOrigins) { - auto const& id = action.desc.GraphAction().Id(); - actions[id] = action.desc.ToJson(); + auto const& id = action.desc->GraphAction().Id(); + actions[id] = action.desc->ToJson(); actions[id]["origins"] = action.origin; } else { - auto const& id = action.GraphAction().Id(); - actions[id] = action.ToJson(); + auto const& id = action->GraphAction().Id(); + actions[id] = action->ToJson(); } }); std::for_each( result.trees.begin(), result.trees.end(), - [&trees](auto const& tree) { trees[tree.Id()] = tree.ToJson(); }); + [&trees](auto const& tree) { trees[tree->Id()] = tree->ToJson(); }); return nlohmann::json{ {"actions", actions}, {"blobs", result.blobs}, {"trees", trees}}; } diff --git a/src/buildtool/build_engine/target_map/target_map.cpp b/src/buildtool/build_engine/target_map/target_map.cpp index 327dbe02..159669b7 100644 --- a/src/buildtool/build_engine/target_map/target_map.cpp +++ b/src/buildtool/build_engine/target_map/target_map.cpp @@ -302,9 +302,9 @@ void withDependencies( // Evaluate main expression auto expression_config = key.config.Prune(config_vars); - std::vector<ActionDescription> actions{}; + std::vector<ActionDescription::Ptr> actions{}; std::vector<std::string> blobs{}; - std::vector<Tree> trees{}; + std::vector<Tree::Ptr> trees{}; auto main_exp_fcts = FunctionMap::MakePtr( {{"FIELD", [¶ms](auto&& eval, auto const& expr, auto const& env) { @@ -496,7 +496,7 @@ void withDependencies( may_fail, no_cache, inputs_exp); - auto action_id = action.Id(); + auto action_id = action->Id(); actions.emplace_back(std::move(action)); for (auto const& out : outputs) { result.emplace(out, @@ -566,8 +566,8 @@ void withDependencies( throw Evaluator::EvaluationError{ fmt::format("TREE conflicts on subtree {}", *conflict)}; } - auto tree = Tree{std::move(artifacts)}; - auto tree_id = tree.Id(); + auto tree = std::make_shared<Tree>(std::move(artifacts)); + auto tree_id = tree->Id(); trees.emplace_back(std::move(tree)); return ExpressionPtr{ArtifactDescription{tree_id}}; }}, diff --git a/src/buildtool/build_engine/target_map/utils.cpp b/src/buildtool/build_engine/target_map/utils.cpp index 8c5353ce..e84634da 100644 --- a/src/buildtool/build_engine/target_map/utils.cpp +++ b/src/buildtool/build_engine/target_map/utils.cpp @@ -152,13 +152,13 @@ auto hash_vector(std::vector<std::string> const& vec) -> std::string { } // namespace auto BuildMaps::Target::Utils::createAction( - ActionDescription::outputs_t output_files, - ActionDescription::outputs_t output_dirs, + const ActionDescription::outputs_t& output_files, + const ActionDescription::outputs_t& output_dirs, std::vector<std::string> command, const ExpressionPtr& env, std::optional<std::string> may_fail, bool no_cache, - const ExpressionPtr& inputs_exp) -> ActionDescription { + const ExpressionPtr& inputs_exp) -> ActionDescription::Ptr { auto hasher = HashGenerator{BuildMaps::Target::Utils::kActionHash} .IncrementalHasher(); hasher.Update(hash_vector(output_files)); @@ -186,12 +186,12 @@ auto BuildMaps::Target::Utils::createAction( for (auto const& [input_path, artifact] : inputs_exp->Map()) { inputs.emplace(input_path, artifact->Artifact()); } - return ActionDescription{std::move(output_files), - std::move(output_dirs), - Action{std::move(action_id), - std::move(command), - std::move(env_vars), - std::move(may_fail), - no_cache}, - std::move(inputs)}; + return std::make_shared<ActionDescription>(output_files, + output_dirs, + Action{std::move(action_id), + std::move(command), + std::move(env_vars), + std::move(may_fail), + no_cache}, + std::move(inputs)); } diff --git a/src/buildtool/build_engine/target_map/utils.hpp b/src/buildtool/build_engine/target_map/utils.hpp index e92e6281..f805cde3 100644 --- a/src/buildtool/build_engine/target_map/utils.hpp +++ b/src/buildtool/build_engine/target_map/utils.hpp @@ -43,13 +43,13 @@ auto getTainted(std::set<std::string>* tainted, const ExpressionPtr& tainted_exp, const BuildMaps::Target::TargetMap::LoggerPtr& logger) -> bool; -auto createAction(ActionDescription::outputs_t output_files, - ActionDescription::outputs_t output_dirs, +auto createAction(const ActionDescription::outputs_t& output_files, + const ActionDescription::outputs_t& output_dirs, std::vector<std::string> command, const ExpressionPtr& env, std::optional<std::string> may_fail, bool no_cache, - const ExpressionPtr& inputs_exp) -> ActionDescription; + const ExpressionPtr& inputs_exp) -> ActionDescription::Ptr; } // namespace BuildMaps::Target::Utils #endif diff --git a/src/buildtool/common/action_description.hpp b/src/buildtool/common/action_description.hpp index 9b3469c1..f830eb82 100644 --- a/src/buildtool/common/action_description.hpp +++ b/src/buildtool/common/action_description.hpp @@ -2,6 +2,7 @@ #define INCLUDED_SRC_BUILDTOOL_COMMON_ACTION_DESCRIPTION_HPP #include <map> +#include <memory> #include <optional> #include <string> #include <unordered_map> @@ -15,6 +16,7 @@ class ActionDescription { public: using outputs_t = std::vector<std::string>; using inputs_t = std::unordered_map<std::string, ArtifactDescription>; + using Ptr = std::shared_ptr<ActionDescription>; ActionDescription(outputs_t output_files, outputs_t output_dirs, @@ -27,7 +29,7 @@ class ActionDescription { [[nodiscard]] static auto FromJson(std::string const& id, nlohmann::json const& desc) noexcept - -> std::optional<ActionDescription> { + -> std::optional<ActionDescription::Ptr> { try { auto outputs = ExtractValueAs<std::vector<std::string>>(desc, "output"); @@ -113,11 +115,11 @@ class ActionDescription { no_cache = *no_cache_it; } - return ActionDescription{ + return std::make_shared<ActionDescription>( std::move(*outputs), std::move(*output_dirs), Action{id, std::move(*command), env, may_fail, no_cache}, - inputs}; + inputs); } catch (std::exception const& ex) { Logger::Log( LogLevel::Error, diff --git a/src/buildtool/common/tree.hpp b/src/buildtool/common/tree.hpp index 512eda86..6b76f8f1 100644 --- a/src/buildtool/common/tree.hpp +++ b/src/buildtool/common/tree.hpp @@ -1,6 +1,7 @@ #ifndef INCLUDED_SRC_BUILDTOOL_COMMON_TREE_HPP #define INCLUDED_SRC_BUILDTOOL_COMMON_TREE_HPP +#include <memory> #include <string> #include <unordered_map> @@ -13,6 +14,7 @@ class Tree { using inputs_t = ActionDescription::inputs_t; public: + using Ptr = std::shared_ptr<Tree>; explicit Tree(inputs_t&& inputs) : id_{ComputeId(inputs)}, inputs_{std::move(inputs)} {} @@ -36,7 +38,7 @@ class Tree { [[nodiscard]] static auto FromJson(std::string const& id, nlohmann::json const& json) - -> std::optional<Tree> { + -> std::optional<Tree::Ptr> { auto inputs = inputs_t{}; inputs.reserve(json.size()); for (auto const& [path, artifact] : json.items()) { @@ -46,16 +48,16 @@ class Tree { } inputs.emplace(path, std::move(*artifact_desc)); } - return Tree{id, std::move(inputs)}; + return std::make_shared<Tree>(id, std::move(inputs)); } + Tree(std::string id, inputs_t&& inputs) + : id_{std::move(id)}, inputs_{std::move(inputs)} {} + private: std::string id_; inputs_t inputs_; - Tree(std::string id, inputs_t&& inputs) - : id_{std::move(id)}, inputs_{std::move(inputs)} {} - static auto ComputeDescription(inputs_t const& inputs) -> nlohmann::json { auto json = nlohmann::json::object(); for (auto const& [path, artifact] : inputs) { diff --git a/src/buildtool/execution_engine/dag/dag.cpp b/src/buildtool/execution_engine/dag/dag.cpp index 96a74650..5d60dd01 100644 --- a/src/buildtool/execution_engine/dag/dag.cpp +++ b/src/buildtool/execution_engine/dag/dag.cpp @@ -104,6 +104,16 @@ auto DependencyGraph::Add(std::vector<ActionDescription> const& actions) return true; } +auto DependencyGraph::Add(std::vector<ActionDescription::Ptr> const& actions) + -> bool { + for (auto const& action : actions) { + if (not AddAction(*action)) { + return false; + } + } + return true; +} + auto DependencyGraph::AddArtifact(ArtifactDescription const& description) -> ArtifactIdentifier { auto artifact = description.ToArtifact(); diff --git a/src/buildtool/execution_engine/dag/dag.hpp b/src/buildtool/execution_engine/dag/dag.hpp index 4f29d79a..ff055413 100644 --- a/src/buildtool/execution_engine/dag/dag.hpp +++ b/src/buildtool/execution_engine/dag/dag.hpp @@ -524,6 +524,9 @@ class DependencyGraph : DirectedAcyclicGraph { [[nodiscard]] auto Add(std::vector<ActionDescription> const& actions) -> bool; + [[nodiscard]] auto Add(std::vector<ActionDescription::Ptr> const& actions) + -> bool; + [[nodiscard]] auto AddAction(ActionDescription const& description) -> bool; [[nodiscard]] auto AddArtifact(ArtifactDescription const& description) diff --git a/src/buildtool/graph_traverser/graph_traverser.hpp b/src/buildtool/graph_traverser/graph_traverser.hpp index 7a078ecd..62077d83 100644 --- a/src/buildtool/graph_traverser/graph_traverser.hpp +++ b/src/buildtool/graph_traverser/graph_traverser.hpp @@ -48,9 +48,9 @@ class GraphTraverser { [[nodiscard]] auto BuildAndStage( std::map<std::string, ArtifactDescription> const& artifact_descriptions, std::map<std::string, ArtifactDescription> const& runfile_descriptions, - std::vector<ActionDescription> const& action_descriptions, + std::vector<ActionDescription::Ptr> const& action_descriptions, std::vector<std::string> const& blobs, - std::vector<Tree> const& trees) const + std::vector<Tree::Ptr> const& trees) const -> std::optional<std::pair<std::vector<std::filesystem::path>, bool>> { DependencyGraph graph; // must outlive artifact_nodes auto artifacts = BuildArtifacts(&graph, @@ -110,7 +110,7 @@ class GraphTraverser { } auto const [blobs, tree_descs, actions] = *desc; - std::vector<ActionDescription> action_descriptions{}; + std::vector<ActionDescription::Ptr> action_descriptions{}; action_descriptions.reserve(actions.size()); for (auto const& [id, description] : actions.items()) { auto action = ActionDescription::FromJson(id, description); @@ -120,7 +120,7 @@ class GraphTraverser { action_descriptions.emplace_back(std::move(*action)); } - std::vector<Tree> trees{}; + std::vector<Tree::Ptr> trees{}; for (auto const& [id, description] : tree_descs.items()) { auto tree = Tree::FromJson(id, description); if (not tree) { @@ -372,8 +372,8 @@ class GraphTraverser { gsl::not_null<DependencyGraph*> const& graph, std::map<std::string, ArtifactDescription> const& artifacts, std::map<std::string, ArtifactDescription> const& runfiles, - std::vector<ActionDescription> const& actions, - std::vector<Tree> const& trees, + std::vector<ActionDescription::Ptr> const& actions, + std::vector<Tree::Ptr> const& trees, std::vector<std::string> const& blobs) const -> std::optional< std::pair<std::vector<std::filesystem::path>, @@ -392,14 +392,14 @@ class GraphTraverser { std::vector<ActionDescription> tree_actions{}; tree_actions.reserve(trees.size()); for (auto const& tree : trees) { - tree_actions.emplace_back(tree.Action()); + tree_actions.emplace_back(tree->Action()); } if (not graph->Add(actions) or not graph->Add(tree_actions)) { Logger::Log(LogLevel::Error, [&actions]() { auto json = nlohmann::json::array(); for (auto const& desc : actions) { - json.push_back(desc.ToJson()); + json.push_back(desc->ToJson()); } return fmt::format( "could not build the dependency graph from the actions " diff --git a/src/buildtool/main/main.cpp b/src/buildtool/main/main.cpp index d1343ad5..eb555a8c 100644 --- a/src/buildtool/main/main.cpp +++ b/src/buildtool/main/main.cpp @@ -694,10 +694,11 @@ struct AnalysisResult { [[nodiscard]] auto TargetActionsToJson(AnalysedTargetPtr const& target) -> nlohmann::json { auto actions = nlohmann::json::array(); - std::for_each( - target->Actions().begin(), - target->Actions().end(), - [&actions](auto const& action) { actions.push_back(action.ToJson()); }); + std::for_each(target->Actions().begin(), + target->Actions().end(), + [&actions](auto const& action) { + actions.push_back(action->ToJson()); + }); return actions; } @@ -707,7 +708,7 @@ struct AnalysisResult { std::for_each( target->Trees().begin(), target->Trees().end(), - [&trees](auto const& tree) { trees[tree.Id()] = tree.ToJson(); }); + [&trees](auto const& tree) { trees[tree->Id()] = tree->ToJson(); }); return trees; } |