summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKlaus Aehlig <klaus.aehlig@huawei.com>2023-06-13 10:14:33 +0200
committerKlaus Aehlig <klaus.aehlig@huawei.com>2023-06-15 17:21:26 +0200
commit8d77b24503fcddce8f79f138cf07be5ad7eb8473 (patch)
treec39741cfafe3dce1d9a32dd9fd703621d384aee5 /src
parentfe336454e17bd228524c5575a3b5a641b3b10dc7 (diff)
downloadjustbuild-8d77b24503fcddce8f79f138cf07be5ad7eb8473.tar.gz
action data structure: support (additional) execution properties
Diffstat (limited to 'src')
-rw-r--r--src/buildtool/build_engine/target_map/built_in_rules.cpp2
-rw-r--r--src/buildtool/build_engine/target_map/target_map.cpp2
-rw-r--r--src/buildtool/build_engine/target_map/utils.cpp10
-rw-r--r--src/buildtool/build_engine/target_map/utils.hpp1
-rw-r--r--src/buildtool/common/action.hpp20
-rw-r--r--src/buildtool/common/action_description.hpp13
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;
}