diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/buildtool/build_engine/target_map/built_in_rules.cpp | 2 | ||||
-rw-r--r-- | src/buildtool/build_engine/target_map/target_map.cpp | 2 | ||||
-rw-r--r-- | src/buildtool/build_engine/target_map/utils.cpp | 10 | ||||
-rw-r--r-- | src/buildtool/build_engine/target_map/utils.hpp | 1 | ||||
-rw-r--r-- | src/buildtool/common/action.hpp | 20 | ||||
-rw-r--r-- | src/buildtool/common/action_description.hpp | 13 |
6 files changed, 43 insertions, 5 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 ad9a12b5..06aab39a 100644 --- a/src/buildtool/build_engine/target_map/built_in_rules.cpp +++ b/src/buildtool/build_engine/target_map/built_in_rules.cpp @@ -28,6 +28,7 @@ #include <nlohmann/json.hpp> #include "src/buildtool/build_engine/base_maps/field_reader.hpp" +#include "src/buildtool/build_engine/expression/expression.hpp" #include "src/buildtool/build_engine/expression/expression_ptr.hpp" #include "src/buildtool/build_engine/target_map/export.hpp" #include "src/buildtool/build_engine/target_map/utils.hpp" @@ -1050,6 +1051,7 @@ void GenericRuleWithDeps( std::nullopt, false, 1.0, + Expression::kEmptyMap, inputs); auto action_identifier = action->Id(); Expression::map_t::underlying_map_t artifacts; diff --git a/src/buildtool/build_engine/target_map/target_map.cpp b/src/buildtool/build_engine/target_map/target_map.cpp index d5e0c05b..7194ba12 100644 --- a/src/buildtool/build_engine/target_map/target_map.cpp +++ b/src/buildtool/build_engine/target_map/target_map.cpp @@ -28,6 +28,7 @@ #include "src/buildtool/build_engine/base_maps/field_reader.hpp" #include "src/buildtool/build_engine/expression/configuration.hpp" #include "src/buildtool/build_engine/expression/evaluator.hpp" +#include "src/buildtool/build_engine/expression/expression.hpp" #include "src/buildtool/build_engine/expression/function_map.hpp" #include "src/buildtool/build_engine/target_map/built_in_rules.hpp" #include "src/buildtool/build_engine/target_map/utils.hpp" @@ -571,6 +572,7 @@ void withDependencies( no_cache, timeout_scale_exp->IsNumber() ? timeout_scale_exp->Number() : 1.0, + Expression::kEmptyMap, inputs_exp); auto action_id = action->Id(); actions.emplace_back(std::move(action)); diff --git a/src/buildtool/build_engine/target_map/utils.cpp b/src/buildtool/build_engine/target_map/utils.cpp index c0932dc9..55543e30 100644 --- a/src/buildtool/build_engine/target_map/utils.cpp +++ b/src/buildtool/build_engine/target_map/utils.cpp @@ -196,6 +196,7 @@ auto BuildMaps::Target::Utils::createAction( std::optional<std::string> may_fail, bool no_cache, double timeout_scale, + const ExpressionPtr& execution_properties_exp, const ExpressionPtr& inputs_exp) -> ActionDescription::Ptr { auto hasher = HashFunction::Hasher(); hasher.Update(hash_vector(output_files)); @@ -206,6 +207,7 @@ auto BuildMaps::Target::Utils::createAction( : std::vector<std::string>{})); hasher.Update(no_cache ? std::string{"N"} : std::string{"Y"}); hasher.Update(fmt::format("{:+24a}", timeout_scale)); + hasher.Update(execution_properties_exp->ToHash()); hasher.Update(inputs_exp->ToHash()); auto action_id = std::move(hasher).Finalize().HexString(); @@ -214,6 +216,11 @@ auto BuildMaps::Target::Utils::createAction( for (auto const& [env_var, env_value] : env->Map()) { env_vars.emplace(env_var, env_value->String()); } + std::map<std::string, std::string> execution_properties{}; + for (auto const& [prop_name, prop_value] : + execution_properties_exp->Map()) { + execution_properties.emplace(prop_name, prop_value->String()); + } ActionDescription::inputs_t inputs; inputs.reserve(inputs_exp->Map().size()); for (auto const& [input_path, artifact] : inputs_exp->Map()) { @@ -226,6 +233,7 @@ auto BuildMaps::Target::Utils::createAction( std::move(env_vars), std::move(may_fail), no_cache, - timeout_scale}, + timeout_scale, + execution_properties}, std::move(inputs)); } diff --git a/src/buildtool/build_engine/target_map/utils.hpp b/src/buildtool/build_engine/target_map/utils.hpp index 28642c42..2b48fb04 100644 --- a/src/buildtool/build_engine/target_map/utils.hpp +++ b/src/buildtool/build_engine/target_map/utils.hpp @@ -66,6 +66,7 @@ auto createAction(const ActionDescription::outputs_t& output_files, std::optional<std::string> may_fail, bool no_cache, double timeout_scale, + const ExpressionPtr& execution_properties_exp, const ExpressionPtr& inputs_exp) -> ActionDescription::Ptr; } // namespace BuildMaps::Target::Utils diff --git a/src/buildtool/common/action.hpp b/src/buildtool/common/action.hpp index 13760422..e9d4581d 100644 --- a/src/buildtool/common/action.hpp +++ b/src/buildtool/common/action.hpp @@ -32,13 +32,15 @@ class Action { std::map<std::string, std::string> env_vars, std::optional<std::string> may_fail, bool no_cache, - double timeout_scale) + double timeout_scale, + std::map<std::string, std::string> execution_properties) : id_{std::move(action_id)}, command_{std::move(command)}, env_{std::move(env_vars)}, may_fail_{std::move(may_fail)}, no_cache_{no_cache}, - timeout_scale_{timeout_scale} {} + timeout_scale_{timeout_scale}, + execution_properties_{std::move(std::move(execution_properties))} {} Action(std::string action_id, std::vector<std::string> command, @@ -48,7 +50,8 @@ class Action { std::move(env_vars), std::nullopt, false, - 1.0) {} + 1.0, + std::map<std::string, std::string>{}) {} [[nodiscard]] auto Id() const noexcept -> ActionIdentifier { return id_; } @@ -77,6 +80,16 @@ class Action { [[nodiscard]] auto NoCache() const -> bool { return no_cache_; } [[nodiscard]] auto TimeoutScale() const -> double { return timeout_scale_; } + [[nodiscard]] auto ExecutionProperties() const& noexcept + -> std::map<std::string, std::string> { + return execution_properties_; + } + + [[nodiscard]] auto ExecutionProperties() && noexcept + -> std::map<std::string, std::string> { + return std::move(execution_properties_); + } + [[nodiscard]] static auto CreateTreeAction(ActionIdentifier const& id) -> Action { return Action{id}; @@ -90,6 +103,7 @@ class Action { std::optional<std::string> may_fail_{}; bool no_cache_{}; double timeout_scale_{}; + std::map<std::string, std::string> execution_properties_{}; explicit Action(ActionIdentifier id) : id_{std::move(id)}, is_tree_{true} {} }; diff --git a/src/buildtool/common/action_description.hpp b/src/buildtool/common/action_description.hpp index 9f4583bf..621e3a12 100644 --- a/src/buildtool/common/action_description.hpp +++ b/src/buildtool/common/action_description.hpp @@ -143,6 +143,13 @@ class ActionDescription { } timeout_scale = *timeout_scale_it; } + auto const execution_properties = + optional_key_value_reader(desc, "execution properties"); + if (not execution_properties.is_object()) { + Logger::Log(LogLevel::Error, + "Execution properties have to a map"); + return std::nullopt; + } return std::make_shared<ActionDescription>( std::move(*outputs), @@ -152,7 +159,8 @@ class ActionDescription { env, may_fail, no_cache, - timeout_scale}, + timeout_scale, + execution_properties}, inputs); } catch (std::exception const& ex) { Logger::Log( @@ -194,6 +202,9 @@ class ActionDescription { if (action_.TimeoutScale() != 1.0) { json["timeout scaling"] = action_.TimeoutScale(); } + if (not action_.ExecutionProperties().empty()) { + json["execution properties"] = action_.ExecutionProperties(); + } return json; } |