summaryrefslogtreecommitdiff
path: root/src/buildtool/build_engine/target_map/target_map.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/buildtool/build_engine/target_map/target_map.cpp')
-rw-r--r--src/buildtool/build_engine/target_map/target_map.cpp49
1 files changed, 49 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 96d25b5e..ca8fdddd 100644
--- a/src/buildtool/build_engine/target_map/target_map.cpp
+++ b/src/buildtool/build_engine/target_map/target_map.cpp
@@ -37,6 +37,10 @@
#include "src/utils/cpp/gsl.hpp"
#include "src/utils/cpp/path.hpp"
#include "src/utils/cpp/vector.hpp"
+#ifndef BOOTSTRAP_BUILD_TOOL
+#include "src/buildtool/serve_api/remote/config.hpp"
+#include "src/buildtool/serve_api/remote/serve_api.hpp"
+#endif // BOOTSTRAP_BUILD_TOOL
namespace {
@@ -1595,6 +1599,21 @@ void GlobTargetWithDirEntry(
});
}
+#ifndef BOOTSTRAP_BUILD_TOOL
+// The remote execution endpoint specified on the command line must be the same
+// used by the provided just serve instance.
+[[nodiscard]] auto CheckServeAndExecutionEndpoints() -> bool {
+ auto sadd = RemoteServeConfig::RemoteAddress();
+ if (!sadd) {
+ Logger::Log(LogLevel::Error,
+ "Absent root detected. Please provide "
+ "--remote-serve-address and retry.");
+ return false;
+ }
+ return ServeApi::CheckServeRemoteExecution();
+}
+#endif // BOOTSTRAP_BUILD_TOOL
+
} // namespace
namespace BuildMaps::Target {
@@ -1604,12 +1623,14 @@ auto CreateTargetMap(
const gsl::not_null<BuildMaps::Base::UserRuleMap*>& rule_map,
const gsl::not_null<BuildMaps::Base::DirectoryEntriesMap*>&
directory_entries_map,
+ const gsl::not_null<AbsentTargetMap*>& absent_target_map,
const gsl::not_null<ResultTargetMap*>& result_map,
std::size_t jobs) -> TargetMap {
auto target_reader = [source_target_map,
targets_file_map,
rule_map,
result_map,
+ absent_target_map,
directory_entries_map](auto ts,
auto setter,
auto logger,
@@ -1703,6 +1724,34 @@ auto CreateTargetMap(
);
}
+#ifndef BOOTSTRAP_BUILD_TOOL
+ else if (RepositoryConfig::Instance()
+ .TargetRoot(key.target.ToModule().repository)
+ ->IsAbsent()) {
+ static auto consistent_serve_and_remote_execution =
+ CheckServeAndExecutionEndpoints();
+ if (!consistent_serve_and_remote_execution) {
+ (*logger)(
+ "Inconsistent remote execution endpoint and just serve "
+ "configuration detected.",
+ true);
+ return;
+ }
+ absent_target_map->ConsumeAfterKeysReady(
+ ts,
+ {key},
+ [setter](auto values) {
+ (*setter)(AnalysedTargetPtr{*values[0]});
+ },
+ [logger, key](auto msg, auto fatal) {
+ (*logger)(
+ fmt::format("While processing absent target {}: {}",
+ key.target.ToString(),
+ msg),
+ fatal);
+ });
+ }
+#endif
else {
targets_file_map->ConsumeAfterKeysReady(
ts,