diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/buildtool/build_engine/target_map/built_in_rules.cpp | 28 |
1 files changed, 27 insertions, 1 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 e1cf9c7f..e3cfc028 100644 --- a/src/buildtool/build_engine/target_map/built_in_rules.cpp +++ b/src/buildtool/build_engine/target_map/built_in_rules.cpp @@ -42,6 +42,7 @@ namespace { auto const kGenericRuleFields = std::unordered_set<std::string>{"arguments_config", "cmds", + "cwd", "deps", "env", "execution properties", @@ -1196,6 +1197,31 @@ void GenericRuleWithDeps( cmd_ss << x->String(); cmd_ss << "\n"; } + auto cwd_exp = + desc->ReadOptionalExpression("cwd", Expression::kEmptyString); + if (not cwd_exp) { + return; + } + auto cwd_value = cwd_exp.Evaluate( + param_config, string_fields_fcts, [&logger](auto const& msg) { + (*logger)(fmt::format("While evaluating cwd:\n{}", msg), true); + }); + if (not cwd_value) { + return; + } + if (not cwd_value->IsString()) { + (*logger)(fmt::format("cwd has to evaluate to a string, but found {}", + cwd_value->ToString()), + true); + return; + } + if (not PathIsNonUpwards(cwd_value->String())) { + (*logger)(fmt::format("cwd has to evalute to a non-upwards relative " + "path, but found {}", + cwd_value->ToString()), + true); + return; + } auto const& empty_map_exp = Expression::kEmptyMapExpr; auto env_exp = desc->ReadOptionalExpression("env", empty_map_exp); if (not env_exp) { @@ -1341,7 +1367,7 @@ void GenericRuleWithDeps( outs, out_dirs, argv, - "", + cwd_value->String(), env_val, std::nullopt, false, |