summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSascha Roloff <sascha.roloff@huawei.com>2022-07-05 20:30:25 +0200
committerSascha Roloff <sascha.roloff@huawei.com>2022-08-05 14:41:31 +0200
commit30c5aa0b3dc37c784311a905f120e0e8b1f651fd (patch)
treed145c980754428b0205bbb19534a93f4a1dd4d14 /src
parentda3064fd8dcffe1cae321bf1f000c07f4f7d4766 (diff)
downloadjustbuild-30c5aa0b3dc37c784311a905f120e0e8b1f651fd.tar.gz
Target map makes use of known trees and avoids directory traversal
Diffstat (limited to 'src')
-rw-r--r--src/buildtool/build_engine/target_map/target_map.cpp18
1 files changed, 18 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 35f38588..087bcacb 100644
--- a/src/buildtool/build_engine/target_map/target_map.cpp
+++ b/src/buildtool/build_engine/target_map/target_map.cpp
@@ -1323,6 +1323,24 @@ void TreeTarget(
auto values) {
// expected values.size() == 1
const auto& dir_entries = *values[0];
+ auto known_tree = dir_entries.AsKnownTree(target.repository);
+ if (known_tree) {
+ auto tree = ExpressionPtr{
+ Expression::map_t{target.name, ExpressionPtr{*known_tree}}};
+
+ auto analysis_result = std::make_shared<AnalysedTarget>(
+ TargetResult{tree, {}, tree},
+ std::vector<ActionDescription::Ptr>{},
+ std::vector<std::string>{},
+ std::vector<Tree::Ptr>{},
+ std::unordered_set<std::string>{},
+ std::set<std::string>{});
+ analysis_result =
+ result_map->Add(key.target, {}, std::move(analysis_result));
+ (*setter)(std::move(analysis_result));
+ return;
+ }
+
using BuildMaps::Target::ConfiguredTarget;
std::vector<ConfiguredTarget> v;