diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/buildtool/build_engine/expression/expression.hpp | 1 | ||||
-rw-r--r-- | src/buildtool/build_engine/target_map/target_map.cpp | 28 |
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) { |