summaryrefslogtreecommitdiff
path: root/src/buildtool/build_engine/target_map/target_map.cpp
diff options
context:
space:
mode:
authorKlaus Aehlig <klaus.aehlig@huawei.com>2024-06-03 15:15:58 +0200
committerKlaus Aehlig <klaus.aehlig@huawei.com>2024-06-04 11:54:11 +0200
commitd81681792d316819444861049f8d2d59af17889e (patch)
tree6750f1c31c6c50f597c141f7c751b85373d79e48 /src/buildtool/build_engine/target_map/target_map.cpp
parent887ca51faf18c1b28e024d61844d27573ed8b7b7 (diff)
downloadjustbuild-d81681792d316819444861049f8d2d59af17889e.tar.gz
rule language: support SYMLINK function
... to allow generating symlinks as part of a rule, as it is already described in our documentation.
Diffstat (limited to 'src/buildtool/build_engine/target_map/target_map.cpp')
-rw-r--r--src/buildtool/build_engine/target_map/target_map.cpp21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/buildtool/build_engine/target_map/target_map.cpp b/src/buildtool/build_engine/target_map/target_map.cpp
index 0c713cd7..8d904ff8 100644
--- a/src/buildtool/build_engine/target_map/target_map.cpp
+++ b/src/buildtool/build_engine/target_map/target_map.cpp
@@ -729,6 +729,27 @@ void withDependencies(
ArtifactDigest::Create<ObjectType::File>(data->String()),
ObjectType::File}};
}},
+
+ {"SYMLINK",
+ [&blobs](auto&& eval, auto const& expr, auto const& env) {
+ auto data = eval(expr->Get("data", ""s), env);
+ if (not data->IsString()) {
+ throw Evaluator::EvaluationError{
+ fmt::format("SYMLINK data has to be a string, but got {}",
+ data->ToString())};
+ }
+ if (not PathIsNonUpwards(data->String())) {
+ throw Evaluator::EvaluationError{fmt::format(
+ "SYMLINK data has to be non-upwards relative, but got {}",
+ data->ToString())};
+ }
+ blobs.emplace_back(data->String());
+
+ return ExpressionPtr{ArtifactDescription{
+ ArtifactDigest::Create<ObjectType::Symlink>(data->String()),
+ ObjectType::Symlink}};
+ }},
+
{"TREE",
[&trees](auto&& eval, auto const& expr, auto const& env) {
auto val = eval(expr->Get("$1", Expression::kEmptyMapExpr), env);