summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/buildtool/build_engine/expression/expression.hpp1
-rw-r--r--src/buildtool/build_engine/target_map/target_map.cpp28
2 files changed, 20 insertions, 9 deletions
diff --git a/src/buildtool/build_engine/expression/expression.hpp b/src/buildtool/build_engine/expression/expression.hpp
index 5d84e131..86b6cc38 100644
--- a/src/buildtool/build_engine/expression/expression.hpp
+++ b/src/buildtool/build_engine/expression/expression.hpp
@@ -242,6 +242,7 @@ class Expression {
Expression::FromJson("[]"_json);
inline static ExpressionPtr const kEmptyMapExpr =
Expression::FromJson(R"({"type": "empty_map"})"_json);
+ inline static ExpressionPtr const kOne = Expression::FromJson("1.0"_json);
private:
std::variant<none_t,
diff --git a/src/buildtool/build_engine/target_map/target_map.cpp b/src/buildtool/build_engine/target_map/target_map.cpp
index 13825148..c61e3670 100644
--- a/src/buildtool/build_engine/target_map/target_map.cpp
+++ b/src/buildtool/build_engine/target_map/target_map.cpp
@@ -551,15 +551,25 @@ void withDependencies(
}
}
bool no_cache = not no_cache_exp->List().empty();
- auto action =
- BuildMaps::Target::Utils::createAction(outputs,
- output_dirs,
- std::move(cmd),
- env_exp,
- may_fail,
- no_cache,
- 1.0,
- inputs_exp);
+ auto timeout_scale_exp =
+ eval(expr->Get("timeout scaling", Expression::kOne), env);
+ if (not(timeout_scale_exp->IsNumber() or
+ timeout_scale_exp->IsNone())) {
+ throw Evaluator::EvaluationError{
+ fmt::format("timeout scaling has to be number (or null "
+ "for default), but found {}",
+ timeout_scale_exp->ToString())};
+ }
+ auto action = BuildMaps::Target::Utils::createAction(
+ outputs,
+ output_dirs,
+ std::move(cmd),
+ env_exp,
+ may_fail,
+ no_cache,
+ timeout_scale_exp->IsNumber() ? timeout_scale_exp->Number()
+ : 1.0,
+ inputs_exp);
auto action_id = action->Id();
actions.emplace_back(std::move(action));
for (auto const& out : outputs) {