summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/buildtool/build_engine/target_map/built_in_rules.cpp42
1 files changed, 32 insertions, 10 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 afbb3975..aca7cc6d 100644
--- a/src/buildtool/build_engine/target_map/built_in_rules.cpp
+++ b/src/buildtool/build_engine/target_map/built_in_rules.cpp
@@ -43,6 +43,7 @@ auto const kGenericRuleFields =
"deps",
"env",
"tainted",
+ "timeout scaling",
"type",
"out_dirs",
"outs"};
@@ -1034,6 +1035,27 @@ void GenericRuleWithDeps(
}
}
+ auto scale_exp =
+ desc->ReadOptionalExpression("timeout scaling", Expression::kOne);
+ if (not scale_exp) {
+ return;
+ }
+ auto scale_val = scale_exp.Evaluate(
+ param_config, string_fields_fcts, [&logger](auto const& msg) {
+ (*logger)(fmt::format("While evaluating timeout scaling:\n{}", msg),
+ true);
+ });
+ if (not scale_val) {
+ return;
+ }
+ if (not(scale_val->IsNumber() or scale_val->IsNone())) {
+ (*logger)(fmt::format("timeout scaling has evaluate to a number (or "
+ "null for default), but found {}",
+ scale_val->ToString()),
+ true);
+ return;
+ }
+
// Construct inputs; in case of conflicts, artifacts take precedence
// over runfiles.
auto inputs = ExpressionPtr{Expression::map_t{}};
@@ -1045,16 +1067,16 @@ void GenericRuleWithDeps(
}
// Construct our single action, and its artifacts
- auto action =
- BuildMaps::Target::Utils::createAction(outs,
- out_dirs,
- {"sh", "-c", cmd_ss.str()},
- env_val,
- std::nullopt,
- false,
- 1.0,
- Expression::kEmptyMap,
- inputs);
+ auto action = BuildMaps::Target::Utils::createAction(
+ outs,
+ out_dirs,
+ {"sh", "-c", cmd_ss.str()},
+ env_val,
+ std::nullopt,
+ false,
+ scale_val->IsNumber() ? scale_val->Number() : 1.0,
+ Expression::kEmptyMap,
+ inputs);
auto action_identifier = action->Id();
Expression::map_t::underlying_map_t artifacts;
for (const auto& container : {outs, out_dirs}) {