summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPaul Cristian Sarbu <paul.cristian.sarbu@huawei.com>2023-11-24 11:31:42 +0100
committerPaul Cristian Sarbu <paul.cristian.sarbu@huawei.com>2023-11-27 15:03:20 +0100
commitcf04253130030bc28866d10aa1f8fe1353643d42 (patch)
treeef7049624771866455105a8dab7b001840139701 /src
parentbc09302c2772c979c45ecc716c36e4a70bb484ac (diff)
downloadjustbuild-cf04253130030bc28866d10aa1f8fe1353643d42.tar.gz
Refactoring RepositoryConfig
With the introduction of 'just serve', export targets can now be built also independently from one another based on their corresponding minimal repository configuration, as stored in the target cache key. In this context, this commit changes the RepositoryConfig usage from one global (static) instance to pointers passed as necessary throughout the code.
Diffstat (limited to 'src')
-rw-r--r--src/buildtool/build_engine/base_maps/TARGETS8
-rw-r--r--src/buildtool/build_engine/base_maps/directory_map.cpp19
-rw-r--r--src/buildtool/build_engine/base_maps/directory_map.hpp5
-rw-r--r--src/buildtool/build_engine/base_maps/entity_name.hpp16
-rw-r--r--src/buildtool/build_engine/base_maps/expression_map.cpp16
-rw-r--r--src/buildtool/build_engine/base_maps/expression_map.hpp2
-rw-r--r--src/buildtool/build_engine/base_maps/field_reader.hpp6
-rw-r--r--src/buildtool/build_engine/base_maps/json_file_map.hpp18
-rw-r--r--src/buildtool/build_engine/base_maps/rule_map.cpp47
-rw-r--r--src/buildtool/build_engine/base_maps/rule_map.hpp2
-rw-r--r--src/buildtool/build_engine/base_maps/source_map.cpp14
-rw-r--r--src/buildtool/build_engine/base_maps/source_map.hpp2
-rw-r--r--src/buildtool/build_engine/target_map/TARGETS4
-rw-r--r--src/buildtool/build_engine/target_map/absent_target_map.cpp23
-rw-r--r--src/buildtool/build_engine/target_map/absent_target_map.hpp2
-rw-r--r--src/buildtool/build_engine/target_map/built_in_rules.cpp72
-rw-r--r--src/buildtool/build_engine/target_map/built_in_rules.hpp2
-rw-r--r--src/buildtool/build_engine/target_map/export.cpp9
-rw-r--r--src/buildtool/build_engine/target_map/export.hpp2
-rw-r--r--src/buildtool/build_engine/target_map/target_map.cpp79
-rw-r--r--src/buildtool/build_engine/target_map/target_map.hpp2
-rw-r--r--src/buildtool/build_engine/target_map/utils.cpp8
-rw-r--r--src/buildtool/build_engine/target_map/utils.hpp2
-rw-r--r--src/buildtool/common/repository_config.hpp6
-rw-r--r--src/buildtool/execution_api/common/TARGETS3
-rw-r--r--src/buildtool/execution_api/common/create_execution_api.hpp6
-rw-r--r--src/buildtool/execution_api/git/git_api.hpp2
-rw-r--r--src/buildtool/execution_api/local/TARGETS1
-rw-r--r--src/buildtool/execution_api/local/local_api.hpp26
-rw-r--r--src/buildtool/execution_engine/executor/executor.hpp60
-rw-r--r--src/buildtool/graph_traverser/TARGETS1
-rw-r--r--src/buildtool/graph_traverser/graph_traverser.hpp30
-rw-r--r--src/buildtool/main/TARGETS6
-rw-r--r--src/buildtool/main/analyse.cpp23
-rw-r--r--src/buildtool/main/analyse.hpp2
-rw-r--r--src/buildtool/main/describe.cpp26
-rw-r--r--src/buildtool/main/describe.hpp10
-rw-r--r--src/buildtool/main/main.cpp52
-rw-r--r--src/buildtool/serve_api/remote/target_client.hpp1
-rw-r--r--src/buildtool/serve_api/serve_service/source_tree.hpp4
-rw-r--r--src/buildtool/serve_api/serve_service/target.hpp1
41 files changed, 419 insertions, 201 deletions
diff --git a/src/buildtool/build_engine/base_maps/TARGETS b/src/buildtool/build_engine/base_maps/TARGETS
index ddc03ab9..0b30a49b 100644
--- a/src/buildtool/build_engine/base_maps/TARGETS
+++ b/src/buildtool/build_engine/base_maps/TARGETS
@@ -14,10 +14,10 @@
[ ["src/buildtool/multithreading", "async_map_consumer"]
, "module_name"
, ["src/buildtool/file_system", "file_root"]
+ , ["src/buildtool/common", "config"]
]
, "stage": ["src", "buildtool", "build_engine", "base_maps"]
- , "private-deps":
- [["src/buildtool/common", "config"], ["src/utils/cpp", "path"]]
+ , "private-deps": [["src/utils/cpp", "path"]]
}
, "json_file_map":
{ "type": ["@", "rules", "CC", "library"]
@@ -84,6 +84,7 @@
, ["@", "gsl", "", "gsl"]
, ["src/buildtool/build_engine/analysed_target", "target"]
, ["src/buildtool/build_engine/expression", "expression"]
+ , ["src/buildtool/common", "config"]
, ["src/buildtool/multithreading", "async_map_consumer"]
, ["src/buildtool/multithreading", "task_system"]
]
@@ -99,6 +100,7 @@
, ["@", "fmt", "", "fmt"]
, ["@", "json", "", "json"]
, ["@", "gsl", "", "gsl"]
+ , ["src/buildtool/common", "config"]
, ["src/buildtool/multithreading", "async_map_consumer"]
, ["src/buildtool/build_engine/expression", "expression"]
]
@@ -129,6 +131,7 @@
, ["@", "gsl", "", "gsl"]
, ["@", "fmt", "", "fmt"]
, ["@", "json", "", "json"]
+ , ["src/buildtool/common", "config"]
, ["src/buildtool/multithreading", "async_map_consumer"]
, "module_name"
]
@@ -164,6 +167,7 @@
, ["@", "gsl", "", "gsl"]
, ["@", "fmt", "", "fmt"]
, ["@", "json", "", "json"]
+ , ["src/buildtool/common", "config"]
, ["src/buildtool/multithreading", "async_map_consumer"]
, "module_name"
]
diff --git a/src/buildtool/build_engine/base_maps/directory_map.cpp b/src/buildtool/build_engine/base_maps/directory_map.cpp
index b37a62e7..da360e4e 100644
--- a/src/buildtool/build_engine/base_maps/directory_map.cpp
+++ b/src/buildtool/build_engine/base_maps/directory_map.cpp
@@ -17,19 +17,18 @@
#include <filesystem>
#include <unordered_set>
-#include "src/buildtool/common/repository_config.hpp"
#include "src/buildtool/multithreading/async_map_consumer.hpp"
#include "src/utils/cpp/path.hpp"
-auto BuildMaps::Base::CreateDirectoryEntriesMap(std::size_t jobs)
- -> DirectoryEntriesMap {
- auto directory_reader = [](auto /* unused*/,
- auto setter,
- auto logger,
- auto /* unused */,
- auto const& key) {
- auto const* ws_root =
- RepositoryConfig::Instance().WorkspaceRoot(key.repository);
+auto BuildMaps::Base::CreateDirectoryEntriesMap(
+ gsl::not_null<RepositoryConfig*> const& repo_config,
+ std::size_t jobs) -> DirectoryEntriesMap {
+ auto directory_reader = [repo_config](auto /* unused*/,
+ auto setter,
+ auto logger,
+ auto /* unused */,
+ auto const& key) {
+ auto const* ws_root = repo_config->WorkspaceRoot(key.repository);
if (ws_root == nullptr) {
(*logger)(
fmt::format("Cannot determine workspace root for repository {}",
diff --git a/src/buildtool/build_engine/base_maps/directory_map.hpp b/src/buildtool/build_engine/base_maps/directory_map.hpp
index 1cf7f358..efce6510 100644
--- a/src/buildtool/build_engine/base_maps/directory_map.hpp
+++ b/src/buildtool/build_engine/base_maps/directory_map.hpp
@@ -21,6 +21,7 @@
#include "gsl/gsl"
#include "src/buildtool/build_engine/base_maps/module_name.hpp"
+#include "src/buildtool/common/repository_config.hpp"
#include "src/buildtool/file_system/file_root.hpp"
#include "src/buildtool/multithreading/async_map_consumer.hpp"
@@ -29,7 +30,9 @@ namespace BuildMaps::Base {
using DirectoryEntriesMap =
AsyncMapConsumer<ModuleName, FileRoot::DirectoryEntries>;
-auto CreateDirectoryEntriesMap(std::size_t jobs = 0) -> DirectoryEntriesMap;
+auto CreateDirectoryEntriesMap(
+ gsl::not_null<RepositoryConfig*> const& repo_config,
+ std::size_t jobs = 0) -> DirectoryEntriesMap;
} // namespace BuildMaps::Base
diff --git a/src/buildtool/build_engine/base_maps/entity_name.hpp b/src/buildtool/build_engine/base_maps/entity_name.hpp
index bec5b083..12d1ec95 100644
--- a/src/buildtool/build_engine/base_maps/entity_name.hpp
+++ b/src/buildtool/build_engine/base_maps/entity_name.hpp
@@ -182,6 +182,7 @@ template <typename T>
T const& list,
std::size_t const list_size,
EntityName const& current,
+ gsl::not_null<RepositoryConfig*> const& repo_config,
std::optional<std::function<void(std::string const&)>> logger =
std::nullopt) noexcept -> std::optional<EntityName> {
try {
@@ -190,7 +191,7 @@ template <typename T>
auto const& local_repo_name = GetString(list[1]);
auto const& module = GetString(list[2]);
auto const& target = GetString(list[3]);
- auto const* repo_name = RepositoryConfig::Instance().GlobalName(
+ auto const* repo_name = repo_config->GlobalName(
current.GetNamedTarget().repository, local_repo_name);
if (repo_name != nullptr) {
return EntityName{*repo_name, module, target};
@@ -212,6 +213,7 @@ template <typename T>
T const& list,
std::size_t const list_size,
EntityName const& current,
+ gsl::not_null<RepositoryConfig*> const& repo_config,
std::optional<std::function<void(std::string const&)>> logger =
std::nullopt) noexcept -> std::optional<EntityName> {
try {
@@ -224,7 +226,7 @@ template <typename T>
}
if (s0 == EntityName::kLocationMarker) {
return ParseEntityNameLocation(
- list, list_size, current, logger);
+ list, list_size, current, repo_config, logger);
}
if (s0 == EntityName::kAnonymousMarker and logger) {
(*logger)(fmt::format(
@@ -249,6 +251,7 @@ template <typename T>
[[nodiscard]] inline auto ParseEntityName(
T const& source,
EntityName const& current,
+ gsl::not_null<RepositoryConfig*> const& repo_config,
std::optional<std::function<void(std::string const&)>> logger =
std::nullopt) noexcept -> std::optional<EntityName> {
try {
@@ -264,7 +267,8 @@ template <typename T>
res = ParseEntityName_2(list, current);
}
else if (list_size >= 3) {
- res = ParseEntityName_3(list, list_size, current, logger);
+ res = ParseEntityName_3(
+ list, list_size, current, repo_config, logger);
}
}
if (logger and (res == std::nullopt)) {
@@ -280,17 +284,19 @@ template <typename T>
[[nodiscard]] inline auto ParseEntityNameFromJson(
nlohmann::json const& json,
EntityName const& current,
+ gsl::not_null<RepositoryConfig*> const& repo_config,
std::optional<std::function<void(std::string const&)>> logger =
std::nullopt) noexcept -> std::optional<EntityName> {
- return ParseEntityName(json, current, std::move(logger));
+ return ParseEntityName(json, current, repo_config, std::move(logger));
}
[[nodiscard]] inline auto ParseEntityNameFromExpression(
ExpressionPtr const& expr,
EntityName const& current,
+ gsl::not_null<RepositoryConfig*> const& repo_config,
std::optional<std::function<void(std::string const&)>> logger =
std::nullopt) noexcept -> std::optional<EntityName> {
- return ParseEntityName(expr, current, std::move(logger));
+ return ParseEntityName(expr, current, repo_config, std::move(logger));
}
} // namespace BuildMaps::Base
diff --git a/src/buildtool/build_engine/base_maps/expression_map.cpp b/src/buildtool/build_engine/base_maps/expression_map.cpp
index e495fa6b..5b2c0655 100644
--- a/src/buildtool/build_engine/base_maps/expression_map.cpp
+++ b/src/buildtool/build_engine/base_maps/expression_map.cpp
@@ -23,12 +23,13 @@
namespace BuildMaps::Base {
auto CreateExpressionMap(gsl::not_null<ExpressionFileMap*> const& expr_file_map,
+ gsl::not_null<RepositoryConfig*> const& repo_config,
std::size_t jobs) -> ExpressionFunctionMap {
- auto expr_func_creator = [expr_file_map](auto ts,
- auto setter,
- auto logger,
- auto subcaller,
- auto const& id) {
+ auto expr_func_creator = [expr_file_map, repo_config](auto ts,
+ auto setter,
+ auto logger,
+ auto subcaller,
+ auto const& id) {
if (not id.IsDefinitionName()) {
(*logger)(
fmt::format("{} cannot name an expression", id.ToString()),
@@ -38,7 +39,8 @@ auto CreateExpressionMap(gsl::not_null<ExpressionFileMap*> const& expr_file_map,
expr_file_map->ConsumeAfterKeysReady(
ts,
{id.ToModule()},
- [setter = std::move(setter),
+ [repo_config,
+ setter = std::move(setter),
logger,
subcaller = std::move(subcaller),
id](auto json_values) {
@@ -68,7 +70,7 @@ auto CreateExpressionMap(gsl::not_null<ExpressionFileMap*> const& expr_file_map,
}
auto import_aliases =
- reader->ReadEntityAliasesObject("imports");
+ reader->ReadEntityAliasesObject("imports", repo_config);
if (not import_aliases) {
return;
}
diff --git a/src/buildtool/build_engine/base_maps/expression_map.hpp b/src/buildtool/build_engine/base_maps/expression_map.hpp
index 4b2ebfb9..5d08b78b 100644
--- a/src/buildtool/build_engine/base_maps/expression_map.hpp
+++ b/src/buildtool/build_engine/base_maps/expression_map.hpp
@@ -24,6 +24,7 @@
#include "src/buildtool/build_engine/base_maps/expression_function.hpp"
#include "src/buildtool/build_engine/base_maps/json_file_map.hpp"
#include "src/buildtool/build_engine/base_maps/module_name.hpp"
+#include "src/buildtool/common/repository_config.hpp"
#include "src/buildtool/multithreading/async_map_consumer.hpp"
namespace BuildMaps::Base {
@@ -39,6 +40,7 @@ using ExpressionFunctionMap =
AsyncMapConsumer<EntityName, ExpressionFunctionPtr>;
auto CreateExpressionMap(gsl::not_null<ExpressionFileMap*> const& expr_file_map,
+ gsl::not_null<RepositoryConfig*> const& repo_config,
std::size_t jobs = 0) -> ExpressionFunctionMap;
} // namespace BuildMaps::Base
diff --git a/src/buildtool/build_engine/base_maps/field_reader.hpp b/src/buildtool/build_engine/base_maps/field_reader.hpp
index ba774e49..bc73a56c 100644
--- a/src/buildtool/build_engine/base_maps/field_reader.hpp
+++ b/src/buildtool/build_engine/base_maps/field_reader.hpp
@@ -25,6 +25,7 @@
#include "nlohmann/json.hpp"
#include "src/buildtool/build_engine/base_maps/entity_name.hpp"
#include "src/buildtool/build_engine/expression/expression.hpp"
+#include "src/buildtool/common/repository_config.hpp"
#include "src/buildtool/multithreading/async_map_consumer.hpp"
namespace BuildMaps::Base {
@@ -170,7 +171,9 @@ class FieldReader {
}
[[nodiscard]] auto ReadEntityAliasesObject(
- std::string const& field_name) const -> std::optional<EntityAliases> {
+ std::string const& field_name,
+ gsl::not_null<RepositoryConfig*> const& repo_config) const
+ -> std::optional<EntityAliases> {
auto const& map =
GetOrDefault(json_, field_name, nlohmann::json::object());
if (not map.is_object()) {
@@ -189,6 +192,7 @@ class FieldReader {
auto expr_id = ParseEntityNameFromJson(
val,
id_,
+ repo_config,
[this, &field_name, entry = val.dump()](
std::string const& parse_err) {
(*logger_)(fmt::format("Parsing entry {} in field {} of {} "
diff --git a/src/buildtool/build_engine/base_maps/json_file_map.hpp b/src/buildtool/build_engine/base_maps/json_file_map.hpp
index f5fb190e..f24b3564 100644
--- a/src/buildtool/build_engine/base_maps/json_file_map.hpp
+++ b/src/buildtool/build_engine/base_maps/json_file_map.hpp
@@ -39,15 +39,15 @@ using FileNameGetter = auto (RepositoryConfig::*)(std::string const&) const
-> std::string const*;
template <RootGetter get_root, FileNameGetter get_name, bool kMandatory = true>
-auto CreateJsonFileMap(std::size_t jobs) -> JsonFileMap {
- auto json_file_reader = [](auto /* unused */,
- auto setter,
- auto logger,
- auto /* unused */,
- auto const& key) {
- auto const& config = RepositoryConfig::Instance();
- auto const* root = (config.*get_root)(key.repository);
- auto const* json_file_name = (config.*get_name)(key.repository);
+auto CreateJsonFileMap(gsl::not_null<RepositoryConfig*> const& repo_config,
+ std::size_t jobs) -> JsonFileMap {
+ auto json_file_reader = [repo_config](auto /* unused */,
+ auto setter,
+ auto logger,
+ auto /* unused */,
+ auto const& key) {
+ auto const* root = ((*repo_config).*get_root)(key.repository);
+ auto const* json_file_name = ((*repo_config).*get_name)(key.repository);
if (root == nullptr or json_file_name == nullptr) {
(*logger)(fmt::format("Cannot determine root or JSON file name for "
"repository {}.",
diff --git a/src/buildtool/build_engine/base_maps/rule_map.cpp b/src/buildtool/build_engine/base_maps/rule_map.cpp
index c8a3dc22..0a198490 100644
--- a/src/buildtool/build_engine/base_maps/rule_map.cpp
+++ b/src/buildtool/build_engine/base_maps/rule_map.cpp
@@ -42,9 +42,11 @@ auto const kRuleFields = std::unordered_set<std::string>{"anonymous",
"tainted",
"target_fields"};
-[[nodiscard]] auto ReadAnonymousObject(EntityName const& id,
- nlohmann::json const& json,
- AsyncMapConsumerLoggerPtr const& logger)
+[[nodiscard]] auto ReadAnonymousObject(
+ EntityName const& id,
+ nlohmann::json const& json,
+ gsl::not_null<RepositoryConfig*> const& repo_config,
+ AsyncMapConsumerLoggerPtr const& logger)
-> std::optional<UserRule::anonymous_defs_t> {
auto obj = GetOrDefault(json, "anonymous", nlohmann::json::object());
if (not obj.is_object()) {
@@ -123,7 +125,7 @@ auto const kRuleFields = std::unordered_set<std::string>{"anonymous",
Expression::map_t::underlying_map_t rule_mapping{};
for (auto const& [key, val] : rule_map->items()) {
auto rule_name = ParseEntityNameFromJson(
- val, id, [&logger, &id, &name = name](auto msg) {
+ val, id, repo_config, [&logger, &id, &name = name](auto msg) {
(*logger)(
fmt::format("Parsing rule name for entry {} in field "
"anonymous in rule {} failed with:\n{}",
@@ -148,9 +150,11 @@ auto const kRuleFields = std::unordered_set<std::string>{"anonymous",
return anon_defs;
}
-[[nodiscard]] auto ReadImplicitObject(EntityName const& id,
- nlohmann::json const& json,
- AsyncMapConsumerLoggerPtr const& logger)
+[[nodiscard]] auto ReadImplicitObject(
+ EntityName const& id,
+ nlohmann::json const& json,
+ gsl::not_null<RepositoryConfig*> const& repo_config,
+ AsyncMapConsumerLoggerPtr const& logger)
-> std::optional<UserRule::implicit_t> {
auto map = GetOrDefault(json, "implicit", nlohmann::json::object());
if (not map.is_object()) {
@@ -175,7 +179,10 @@ auto const kRuleFields = std::unordered_set<std::string>{"anonymous",
targets.reserve(val.size());
for (auto const& item : val) {
auto expr_id = ParseEntityNameFromJson(
- item, id, [&logger, &item, &id](std::string const& parse_err) {
+ item,
+ id,
+ repo_config,
+ [&logger, &item, &id](std::string const& parse_err) {
(*logger)(fmt::format("Parsing entry {} in implicit field "
"of rule {} failed with:\n{}",
item.dump(),
@@ -234,12 +241,14 @@ auto const kRuleFields = std::unordered_set<std::string>{"anonymous",
auto CreateRuleMap(gsl::not_null<RuleFileMap*> const& rule_file_map,
gsl::not_null<ExpressionFunctionMap*> const& expr_map,
+ gsl::not_null<RepositoryConfig*> const& repo_config,
std::size_t jobs) -> UserRuleMap {
- auto user_rule_creator = [rule_file_map, expr_map](auto ts,
- auto setter,
- auto logger,
- auto /*subcaller*/,
- auto const& id) {
+ auto user_rule_creator = [rule_file_map, expr_map, repo_config](
+ auto ts,
+ auto setter,
+ auto logger,
+ auto /*subcaller*/,
+ auto const& id) {
if (not id.IsDefinitionName()) {
(*logger)(fmt::format("{} cannot name a rule", id.ToString()),
true);
@@ -248,7 +257,7 @@ auto CreateRuleMap(gsl::not_null<RuleFileMap*> const& rule_file_map,
rule_file_map->ConsumeAfterKeysReady(
ts,
{id.ToModule()},
- [ts, expr_map, setter = std::move(setter), logger, id](
+ [ts, expr_map, repo_config, setter = std::move(setter), logger, id](
auto json_values) {
const auto& target_ = id.GetNamedTarget();
auto rule_it = json_values[0]->find(target_.name);
@@ -288,14 +297,14 @@ auto CreateRuleMap(gsl::not_null<RuleFileMap*> const& rule_file_map,
return;
}
- auto implicit_targets =
- ReadImplicitObject(id, rule_it.value(), logger);
+ auto implicit_targets = ReadImplicitObject(
+ id, rule_it.value(), repo_config, logger);
if (not implicit_targets) {
return;
}
- auto anonymous_defs =
- ReadAnonymousObject(id, rule_it.value(), logger);
+ auto anonymous_defs = ReadAnonymousObject(
+ id, rule_it.value(), repo_config, logger);
if (not anonymous_defs) {
return;
}
@@ -311,7 +320,7 @@ auto CreateRuleMap(gsl::not_null<RuleFileMap*> const& rule_file_map,
}
auto import_aliases =
- reader->ReadEntityAliasesObject("imports");
+ reader->ReadEntityAliasesObject("imports", repo_config);
if (not import_aliases) {
return;
}
diff --git a/src/buildtool/build_engine/base_maps/rule_map.hpp b/src/buildtool/build_engine/base_maps/rule_map.hpp
index ab9c0098..251065dc 100644
--- a/src/buildtool/build_engine/base_maps/rule_map.hpp
+++ b/src/buildtool/build_engine/base_maps/rule_map.hpp
@@ -25,6 +25,7 @@
#include "src/buildtool/build_engine/base_maps/json_file_map.hpp"
#include "src/buildtool/build_engine/base_maps/module_name.hpp"
#include "src/buildtool/build_engine/base_maps/user_rule.hpp"
+#include "src/buildtool/common/repository_config.hpp"
#include "src/buildtool/multithreading/async_map_consumer.hpp"
namespace BuildMaps::Base {
@@ -40,6 +41,7 @@ using UserRuleMap = AsyncMapConsumer<EntityName, UserRulePtr>;
auto CreateRuleMap(gsl::not_null<RuleFileMap*> const& rule_file_map,
gsl::not_null<ExpressionFunctionMap*> const& expr_map,
+ gsl::not_null<RepositoryConfig*> const& repo_config,
std::size_t jobs = 0) -> UserRuleMap;
} // namespace BuildMaps::Base
diff --git a/src/buildtool/build_engine/base_maps/source_map.cpp b/src/buildtool/build_engine/base_maps/source_map.cpp
index 1b39ec3e..0453657a 100644
--- a/src/buildtool/build_engine/base_maps/source_map.cpp
+++ b/src/buildtool/build_engine/base_maps/source_map.cpp
@@ -45,12 +45,13 @@ auto as_target(const BuildMaps::Base::EntityName& key, ExpressionPtr artifact)
} // namespace
auto CreateSourceTargetMap(const gsl::not_null<DirectoryEntriesMap*>& dirs,
+ gsl::not_null<RepositoryConfig*> const& repo_config,
std::size_t jobs) -> SourceTargetMap {
- auto src_target_reader = [dirs](auto ts,
- auto setter,
- auto logger,
- auto /* unused */,
- auto const& key) {
+ auto src_target_reader = [dirs, repo_config](auto ts,
+ auto setter,
+ auto logger,
+ auto /* unused */,
+ auto const& key) {
using std::filesystem::path;
const auto& target = key.GetNamedTarget();
auto name = path(target.name).lexically_normal();
@@ -62,8 +63,7 @@ auto CreateSourceTargetMap(const gsl::not_null<DirectoryEntriesMap*>& dirs,
return;
}
auto dir = (path(target.module) / name).parent_path();
- auto const* ws_root =
- RepositoryConfig::Instance().WorkspaceRoot(target.repository);
+ auto const* ws_root = repo_config->WorkspaceRoot(target.repository);
auto src_file_reader = [key, name, setter, logger, dir, ws_root](
bool exists_in_ws_root) {
diff --git a/src/buildtool/build_engine/base_maps/source_map.hpp b/src/buildtool/build_engine/base_maps/source_map.hpp
index 899d9ce4..61c8ad6f 100644
--- a/src/buildtool/build_engine/base_maps/source_map.hpp
+++ b/src/buildtool/build_engine/base_maps/source_map.hpp
@@ -23,6 +23,7 @@
#include "src/buildtool/build_engine/base_maps/directory_map.hpp"
#include "src/buildtool/build_engine/base_maps/entity_name.hpp"
#include "src/buildtool/build_engine/expression/expression.hpp"
+#include "src/buildtool/common/repository_config.hpp"
#include "src/buildtool/multithreading/async_map_consumer.hpp"
#include "src/buildtool/multithreading/task_system.hpp"
@@ -31,6 +32,7 @@ namespace BuildMaps::Base {
using SourceTargetMap = AsyncMapConsumer<EntityName, AnalysedTargetPtr>;
auto CreateSourceTargetMap(const gsl::not_null<DirectoryEntriesMap*>& dirs,
+ gsl::not_null<RepositoryConfig*> const& repo_config,
std::size_t jobs = 0) -> SourceTargetMap;
} // namespace BuildMaps::Base
diff --git a/src/buildtool/build_engine/target_map/TARGETS b/src/buildtool/build_engine/target_map/TARGETS
index 0ddbdf27..d5af4dfe 100644
--- a/src/buildtool/build_engine/target_map/TARGETS
+++ b/src/buildtool/build_engine/target_map/TARGETS
@@ -45,6 +45,7 @@
, ["src/buildtool/build_engine/base_maps", "rule_map"]
, ["src/buildtool/build_engine/base_maps", "source_map"]
, ["src/buildtool/build_engine/base_maps", "targets_file_map"]
+ , ["src/buildtool/common", "config"]
, ["src/buildtool/multithreading", "async_map_consumer"]
, ["src/utils/cpp", "gsl"]
, ["@", "fmt", "", "fmt"]
@@ -81,6 +82,7 @@
, ["src/buildtool/build_engine/base_maps", "field_reader"]
, ["src/buildtool/build_engine/expression", "expression"]
, ["src/buildtool/build_engine/analysed_target", "target"]
+ , ["src/buildtool/common", "config"]
]
, "stage": ["src", "buildtool", "build_engine", "target_map"]
}
@@ -94,13 +96,13 @@
[ "configured_target"
, "result_map"
, ["src/buildtool/build_engine/analysed_target", "target"]
+ , ["src/buildtool/common", "config"]
, ["src/buildtool/multithreading", "async_map_consumer"]
, ["@", "gsl", "", "gsl"]
]
, "stage": ["src", "buildtool", "build_engine", "target_map"]
, "private-deps":
[ ["src/buildtool/common", "common"]
- , ["src/buildtool/common", "config"]
, ["src/buildtool/storage", "storage"]
, ["src/buildtool/logging", "logging"]
, ["src/buildtool/serve_api/remote", "serve_api"]
diff --git a/src/buildtool/build_engine/target_map/absent_target_map.cpp b/src/buildtool/build_engine/target_map/absent_target_map.cpp
index 38ab6cfa..3ceaa4d8 100644
--- a/src/buildtool/build_engine/target_map/absent_target_map.cpp
+++ b/src/buildtool/build_engine/target_map/absent_target_map.cpp
@@ -14,26 +14,26 @@
#include "src/buildtool/build_engine/target_map/absent_target_map.hpp"
#ifndef BOOTSTRAP_BUILD_TOOL
-#include "src/buildtool/common/repository_config.hpp"
#include "src/buildtool/serve_api/remote/serve_api.hpp"
#include "src/buildtool/storage/target_cache_key.hpp"
#endif
+
auto BuildMaps::Target::CreateAbsentTargetMap(
const gsl::not_null<ResultTargetMap*>& result_map,
+ gsl::not_null<RepositoryConfig*> const& repo_config,
std::size_t jobs) -> AbsentTargetMap {
#ifndef BOOTSTRAP_BUILD_TOOL
- auto target_reader = [result_map](auto /*ts*/,
- auto setter,
- auto logger,
- auto /*subcaller*/,
- auto key) {
+ auto target_reader = [result_map, repo_config](auto /*ts*/,
+ auto setter,
+ auto logger,
+ auto /*subcaller*/,
+ auto key) {
// assumptions:
// - target with absent targets file requested
// - ServeApi correctly configured
auto const& repo_name = key.target.ToModule().repository;
- auto target_root_id = RepositoryConfig::Instance()
- .TargetRoot(repo_name)
- ->GetAbsentTreeId();
+ auto target_root_id =
+ repo_config->TargetRoot(repo_name)->GetAbsentTreeId();
if (!target_root_id) {
(*logger)(fmt::format("Failed to get the target root id for "
"repository \"{}\"",
@@ -43,7 +43,7 @@ auto BuildMaps::Target::CreateAbsentTargetMap(
}
auto flexible_vars = ServeApi::ServeTargetVariables(
*target_root_id,
- *RepositoryConfig::Instance().TargetFileName(repo_name),
+ *(repo_config->TargetFileName(repo_name)),
key.target.GetNamedTarget().name);
if (!flexible_vars) {
(*logger)(fmt::format("Failed to obtain flexible config variables "
@@ -55,8 +55,7 @@ auto BuildMaps::Target::CreateAbsentTargetMap(
// TODO(asartori): avoid code duplication in export.cpp
auto effective_config = key.config.Prune(*flexible_vars);
auto target_name = key.target.GetNamedTarget();
- auto repo_key =
- RepositoryConfig::Instance().RepositoryKey(target_name.repository);
+ auto repo_key = repo_config->RepositoryKey(target_name.repository);
if (!repo_key) {
(*logger)(
fmt::format("Failed to obtain repository key for repo \"{}\"",
diff --git a/src/buildtool/build_engine/target_map/absent_target_map.hpp b/src/buildtool/build_engine/target_map/absent_target_map.hpp
index 11959b2f..aa2b5b42 100644
--- a/src/buildtool/build_engine/target_map/absent_target_map.hpp
+++ b/src/buildtool/build_engine/target_map/absent_target_map.hpp
@@ -18,12 +18,14 @@
#include "src/buildtool/build_engine/analysed_target/analysed_target.hpp"
#include "src/buildtool/build_engine/target_map/configured_target.hpp"
#include "src/buildtool/build_engine/target_map/result_map.hpp"
+#include "src/buildtool/common/repository_config.hpp"
#include "src/buildtool/multithreading/async_map_consumer.hpp"
namespace BuildMaps::Target {
using AbsentTargetMap = AsyncMapConsumer<ConfiguredTarget, AnalysedTargetPtr>;
auto CreateAbsentTargetMap(const gsl::not_null<ResultTargetMap*>&,
+ gsl::not_null<RepositoryConfig*> const& repo_config,
std::size_t jobs = 0) -> AbsentTargetMap;
} // namespace BuildMaps::Target
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 70ecf1f2..fca1eaaa 100644
--- a/src/buildtool/build_engine/target_map/built_in_rules.cpp
+++ b/src/buildtool/build_engine/target_map/built_in_rules.cpp
@@ -84,6 +84,7 @@ void BlobGenRuleWithDeps(
const std::vector<AnalysedTargetPtr const*>& dependency_values,
const BuildMaps::Base::FieldReader::Ptr& desc,
const BuildMaps::Target::ConfiguredTarget& key,
+ const gsl::not_null<RepositoryConfig*>& repo_config,
const BuildMaps::Target::TargetMap::SetterPtr& setter,
const BuildMaps::Target::TargetMap::LoggerPtr& logger,
const gsl::not_null<BuildMaps::Target::ResultTargetMap*>& result_map,
@@ -123,19 +124,29 @@ void BlobGenRuleWithDeps(
auto string_fields_fcts =
FunctionMap::MakePtr(FunctionMap::underlying_map_t{
{"outs",
- [&deps_by_transition, &key](
+ [&deps_by_transition, &key, repo_config](
auto&& eval, auto const& expr, auto const& env) {
return BuildMaps::Target::Utils::keys_expr(
BuildMaps::Target::Utils::obtainTargetByName(
- eval, expr, env, key.target, deps_by_transition)
+ eval,
+ expr,
+ env,
+ key.target,
+ repo_config,
+ deps_by_transition)
->Artifacts());
}},
{"runfiles",
- [&deps_by_transition, &key](
+ [&deps_by_transition, &key, repo_config](
auto&& eval, auto const& expr, auto const& env) {
return BuildMaps::Target::Utils::keys_expr(
BuildMaps::Target::Utils::obtainTargetByName(
- eval, expr, env, key.target, deps_by_transition)
+ eval,
+ expr,
+ env,
+ key.target,
+ repo_config,
+ deps_by_transition)
->RunFiles());
}}});
@@ -232,6 +243,7 @@ void BlobGenRuleWithDeps(
void BlobGenRule(
const nlohmann::json& desc_json,
const BuildMaps::Target::ConfiguredTarget& key,
+ const gsl::not_null<RepositoryConfig*>& repo_config,
const BuildMaps::Target::TargetMap::SubCallerPtr& subcaller,
const BuildMaps::Target::TargetMap::SetterPtr& setter,
const BuildMaps::Target::TargetMap::LoggerPtr& logger,
@@ -279,6 +291,7 @@ void BlobGenRule(
auto dep_target = BuildMaps::Base::ParseEntityNameFromExpression(
dep_name,
key.target,
+ repo_config,
[&logger, &dep_name](std::string const& parse_err) {
(*logger)(fmt::format("Parsing dep entry {} failed with:\n{}",
dep_name->ToString(),
@@ -300,12 +313,14 @@ void BlobGenRule(
setter,
logger,
key,
+ repo_config,
result_map,
blob_type](auto const& values) {
BlobGenRuleWithDeps(transition_keys,
values,
desc,
key,
+ repo_config,
setter,
logger,
result_map,
@@ -317,12 +332,14 @@ void BlobGenRule(
void FileGenRule(
const nlohmann::json& desc_json,
const BuildMaps::Target::ConfiguredTarget& key,
+ const gsl::not_null<RepositoryConfig*>& repo_config,
const BuildMaps::Target::TargetMap::SubCallerPtr& subcaller,
const BuildMaps::Target::TargetMap::SetterPtr& setter,
const BuildMaps::Target::TargetMap::LoggerPtr& logger,
const gsl::not_null<BuildMaps::Target::ResultTargetMap*>& result_map) {
BlobGenRule(desc_json,
key,
+ repo_config,
subcaller,
setter,
logger,
@@ -333,12 +350,14 @@ void FileGenRule(
void SymlinkRule(
const nlohmann::json& desc_json,
const BuildMaps::Target::ConfiguredTarget& key,
+ const gsl::not_null<RepositoryConfig*>& repo_config,
const BuildMaps::Target::TargetMap::SubCallerPtr& subcaller,
const BuildMaps::Target::TargetMap::SetterPtr& setter,
const BuildMaps::Target::TargetMap::LoggerPtr& logger,
const gsl::not_null<BuildMaps::Target::ResultTargetMap*>& result_map) {
BlobGenRule(desc_json,
key,
+ repo_config,
subcaller,
setter,
logger,
@@ -451,6 +470,7 @@ void TreeRuleWithDeps(
void TreeRule(
const nlohmann::json& desc_json,
const BuildMaps::Target::ConfiguredTarget& key,
+ const gsl::not_null<RepositoryConfig*>& repo_config,
const BuildMaps::Target::TargetMap::SubCallerPtr& subcaller,
const BuildMaps::Target::TargetMap::SetterPtr& setter,
const BuildMaps::Target::TargetMap::LoggerPtr& logger,
@@ -489,6 +509,7 @@ void TreeRule(
auto dep_target = BuildMaps::Base::ParseEntityNameFromExpression(
dep_name,
key.target,
+ repo_config,
[&logger, &dep_name](std::string const& parse_err) {
(*logger)(fmt::format("Parsing dep entry {} failed with:\n{}",
dep_name->ToString(),
@@ -689,6 +710,7 @@ void InstallRuleWithDeps(
void InstallRule(
const nlohmann::json& desc_json,
const BuildMaps::Target::ConfiguredTarget& key,
+ const gsl::not_null<RepositoryConfig*>& repo_config,
const BuildMaps::Target::TargetMap::SubCallerPtr& subcaller,
const BuildMaps::Target::TargetMap::SetterPtr& setter,
const BuildMaps::Target::TargetMap::LoggerPtr& logger,
@@ -729,6 +751,7 @@ void InstallRule(
auto dep_target = BuildMaps::Base::ParseEntityNameFromExpression(
dep_name,
key.target,
+ repo_config,
[&logger, &dep_name](std::string const& parse_err) {
(*logger)(fmt::format("Parsing dep entry {} failed with:\n{}",
dep_name->ToString(),
@@ -773,6 +796,7 @@ void InstallRule(
auto dep_target = BuildMaps::Base::ParseEntityNameFromExpression(
dep_name,
key.target,
+ repo_config,
[&logger, &dep_name, &path = path](std::string const& parse_err) {
(*logger)(fmt::format("Parsing file entry {} for key {} failed "
"with:\n{}",
@@ -823,6 +847,7 @@ void InstallRule(
auto dep_target = BuildMaps::Base::ParseEntityNameFromExpression(
entry->List()[0],
key.target,
+ repo_config,
[&logger, &entry](std::string const& parse_err) {
(*logger)(fmt::format("Parsing dir entry {} for path {} failed "
"with:\n{}",
@@ -870,6 +895,7 @@ void GenericRuleWithDeps(
const std::vector<AnalysedTargetPtr const*>& dependency_values,
const BuildMaps::Base::FieldReader::Ptr& desc,
const BuildMaps::Target::ConfiguredTarget& key,
+ const gsl::not_null<RepositoryConfig*>& repo_config,
const BuildMaps::Target::TargetMap::SetterPtr& setter,
const BuildMaps::Target::TargetMap::LoggerPtr& logger,
const gsl::not_null<BuildMaps::Target::ResultTargetMap*>& result_map) {
@@ -930,19 +956,29 @@ void GenericRuleWithDeps(
auto string_fields_fcts =
FunctionMap::MakePtr(FunctionMap::underlying_map_t{
{"outs",
- [&deps_by_transition, &key](
+ [&deps_by_transition, &key, repo_config](
auto&& eval, auto const& expr, auto const& env) {
return BuildMaps::Target::Utils::keys_expr(
BuildMaps::Target::Utils::obtainTargetByName(
- eval, expr, env, key.target, deps_by_transition)
+ eval,
+ expr,
+ env,
+ key.target,
+ repo_config,
+ deps_by_transition)
->Artifacts());
}},
{"runfiles",
- [&deps_by_transition, &key](
+ [&deps_by_transition, &key, repo_config](
auto&& eval, auto const& expr, auto const& env) {
return BuildMaps::Target::Utils::keys_expr(
BuildMaps::Target::Utils::obtainTargetByName(
- eval, expr, env, key.target, deps_by_transition)
+ eval,
+ expr,
+ env,
+ key.target,
+ repo_config,
+ deps_by_transition)
->RunFiles());
}}});
auto const& empty_list = Expression::kEmptyList;
@@ -1251,6 +1287,7 @@ void GenericRuleWithDeps(
void GenericRule(
const nlohmann::json& desc_json,
const BuildMaps::Target::ConfiguredTarget& key,
+ const gsl::not_null<RepositoryConfig*>& repo_config,
const BuildMaps::Target::TargetMap::SubCallerPtr& subcaller,
const BuildMaps::Target::TargetMap::SetterPtr& setter,
const BuildMaps::Target::TargetMap::LoggerPtr& logger,
@@ -1288,6 +1325,7 @@ void GenericRule(
auto dep_target = BuildMaps::Base::ParseEntityNameFromExpression(
dep_name,
key.target,
+ repo_config,
[&logger, &dep_name](std::string const& parse_err) {
(*logger)(fmt::format("Parsing dep entry {} failed with:\n{}",
dep_name->ToString(),
@@ -1309,9 +1347,16 @@ void GenericRule(
setter,
logger,
key,
+ repo_config,
result_map](auto const& values) {
- GenericRuleWithDeps(
- transition_keys, values, desc, key, setter, logger, result_map);
+ GenericRuleWithDeps(transition_keys,
+ values,
+ desc,
+ key,
+ repo_config,
+ setter,
+ logger,
+ result_map);
},
logger);
}
@@ -1319,6 +1364,7 @@ void GenericRule(
void ConfigureRule(
const nlohmann::json& desc_json,
const BuildMaps::Target::ConfiguredTarget& key,
+ const gsl::not_null<RepositoryConfig*>& repo_config,
const BuildMaps::Target::TargetMap::SubCallerPtr& subcaller,
const BuildMaps::Target::TargetMap::SetterPtr& setter,
const BuildMaps::Target::TargetMap::LoggerPtr& logger,
@@ -1348,6 +1394,7 @@ void ConfigureRule(
auto configured_target = BuildMaps::Base::ParseEntityNameFromExpression(
configured_target_name,
key.target,
+ repo_config,
[&logger, &configured_target_name](std::string const& parse_err) {
(*logger)(fmt::format("Parsing target name {} failed with:\n{}",
configured_target_name->ToString(),
@@ -1456,6 +1503,7 @@ auto const kBuiltIns = std::unordered_map<
std::function<void(
const nlohmann::json&,
const BuildMaps::Target::ConfiguredTarget&,
+ [[maybe_unused]] const gsl::not_null<RepositoryConfig*>&,
const BuildMaps::Target::TargetMap::SubCallerPtr&,
const BuildMaps::Target::TargetMap::SetterPtr&,
const BuildMaps::Target::TargetMap::LoggerPtr&,
@@ -1485,6 +1533,7 @@ auto HandleBuiltin(
const nlohmann::json& rule_type,
const nlohmann::json& desc,
const BuildMaps::Target::ConfiguredTarget& key,
+ const gsl::not_null<RepositoryConfig*>& repo_config,
const BuildMaps::Target::TargetMap::SubCallerPtr& subcaller,
const BuildMaps::Target::TargetMap::SetterPtr& setter,
const BuildMaps::Target::TargetMap::LoggerPtr& logger,
@@ -1507,7 +1556,8 @@ auto HandleBuiltin(
msg),
fatal);
});
- (it->second)(desc, key, subcaller, setter, target_logger, result_map);
+ (it->second)(
+ desc, key, repo_config, subcaller, setter, target_logger, result_map);
return true;
}
} // namespace BuildMaps::Target
diff --git a/src/buildtool/build_engine/target_map/built_in_rules.hpp b/src/buildtool/build_engine/target_map/built_in_rules.hpp
index 9eadfcb1..5f815130 100644
--- a/src/buildtool/build_engine/target_map/built_in_rules.hpp
+++ b/src/buildtool/build_engine/target_map/built_in_rules.hpp
@@ -20,12 +20,14 @@
#include "src/buildtool/build_engine/target_map/configured_target.hpp"
#include "src/buildtool/build_engine/target_map/result_map.hpp"
#include "src/buildtool/build_engine/target_map/target_map.hpp"
+#include "src/buildtool/common/repository_config.hpp"
namespace BuildMaps::Target {
auto HandleBuiltin(
const nlohmann::json& rule_type,
const nlohmann::json& desc,
const BuildMaps::Target::ConfiguredTarget& key,
+ const gsl::not_null<RepositoryConfig*>& repo_config,
const BuildMaps::Target::TargetMap::SubCallerPtr& subcaller,
const BuildMaps::Target::TargetMap::SetterPtr& setter,
const BuildMaps::Target::TargetMap::LoggerPtr& logger,
diff --git a/src/buildtool/build_engine/target_map/export.cpp b/src/buildtool/build_engine/target_map/export.cpp
index d832b2ee..06b80c26 100644
--- a/src/buildtool/build_engine/target_map/export.cpp
+++ b/src/buildtool/build_engine/target_map/export.cpp
@@ -81,10 +81,10 @@ void FinalizeExport(
[[nodiscard]] auto ComputeTargetCacheKey(
BuildMaps::Base::EntityName const& export_target,
+ gsl::not_null<RepositoryConfig*> const& repo_config,
Configuration const& target_config) -> std::optional<TargetCacheKey> {
- static auto const& repos = RepositoryConfig::Instance();
auto const& target_name = export_target.GetNamedTarget();
- if (auto repo_key = repos.RepositoryKey(target_name.repository)) {
+ if (auto repo_key = repo_config->RepositoryKey(target_name.repository)) {
return TargetCacheKey::Create(*repo_key, target_name, target_config);
}
return std::nullopt;
@@ -95,6 +95,7 @@ void FinalizeExport(
void ExportRule(
const nlohmann::json& desc_json,
const BuildMaps::Target::ConfiguredTarget& key,
+ const gsl::not_null<RepositoryConfig*>& repo_config,
const BuildMaps::Target::TargetMap::SubCallerPtr& subcaller,
const BuildMaps::Target::TargetMap::SetterPtr& setter,
const BuildMaps::Target::TargetMap::LoggerPtr& logger,
@@ -106,7 +107,8 @@ void ExportRule(
return;
}
auto effective_config = key.config.Prune(*flexible_vars);
- auto target_cache_key = ComputeTargetCacheKey(key.target, effective_config);
+ auto target_cache_key =
+ ComputeTargetCacheKey(key.target, repo_config, effective_config);
if (target_cache_key) {
if (auto target_cache_value =
@@ -174,6 +176,7 @@ void ExportRule(
auto exported_target = BuildMaps::Base::ParseEntityNameFromExpression(
exported_target_name,
key.target,
+ repo_config,
[&logger, &exported_target_name](std::string const& parse_err) {
(*logger)(fmt::format("Parsing target name {} failed with:\n{}",
exported_target_name->ToString(),
diff --git a/src/buildtool/build_engine/target_map/export.hpp b/src/buildtool/build_engine/target_map/export.hpp
index 495b5ace..aa84f0b4 100644
--- a/src/buildtool/build_engine/target_map/export.hpp
+++ b/src/buildtool/build_engine/target_map/export.hpp
@@ -20,9 +20,11 @@
#include "src/buildtool/build_engine/target_map/configured_target.hpp"
#include "src/buildtool/build_engine/target_map/result_map.hpp"
#include "src/buildtool/build_engine/target_map/target_map.hpp"
+#include "src/buildtool/common/repository_config.hpp"
void ExportRule(const nlohmann::json& desc_json,
const BuildMaps::Target::ConfiguredTarget& key,
+ const gsl::not_null<RepositoryConfig*>& repo_config,
const BuildMaps::Target::TargetMap::SubCallerPtr& subcaller,
const BuildMaps::Target::TargetMap::SetterPtr& setter,
const BuildMaps::Target::TargetMap::LoggerPtr& logger,
diff --git a/src/buildtool/build_engine/target_map/target_map.cpp b/src/buildtool/build_engine/target_map/target_map.cpp
index ca8fdddd..805a0d50 100644
--- a/src/buildtool/build_engine/target_map/target_map.cpp
+++ b/src/buildtool/build_engine/target_map/target_map.cpp
@@ -221,6 +221,7 @@ void withDependencies(
const BuildMaps::Base::UserRulePtr& rule,
const TargetData::Ptr& data,
const BuildMaps::Target::ConfiguredTarget& key,
+ const gsl::not_null<RepositoryConfig*>& repo_config,
std::unordered_map<std::string, ExpressionPtr> params,
const BuildMaps::Target::TargetMap::SetterPtr& setter,
const BuildMaps::Target::TargetMap::LoggerPtr& logger,
@@ -300,19 +301,29 @@ void withDependencies(
auto string_fields_fcts =
FunctionMap::MakePtr(FunctionMap::underlying_map_t{
{"outs",
- [&deps_by_transition, &key](
+ [&deps_by_transition, &key, repo_config](
auto&& eval, auto const& expr, auto const& env) {
return BuildMaps::Target::Utils::keys_expr(
BuildMaps::Target::Utils::obtainTargetByName(
- eval, expr, env, key.target, deps_by_transition)
+ eval,
+ expr,
+ env,
+ key.target,
+ repo_config,
+ deps_by_transition)
->Artifacts());
}},
{"runfiles",
- [&deps_by_transition, &key](
+ [&deps_by_transition, &key, repo_config](
auto&& eval, auto const& expr, auto const& env) {
return BuildMaps::Target::Utils::keys_expr(
BuildMaps::Target::Utils::obtainTargetByName(
- eval, expr, env, key.target, deps_by_transition)
+ eval,
+ expr,
+ env,
+ key.target,
+ repo_config,
+ deps_by_transition)
->RunFiles());
}}});
auto param_config = key.config.Prune(param_vars);
@@ -866,6 +877,7 @@ void withRuleDefinition(
const BuildMaps::Base::UserRulePtr& rule,
const TargetData::Ptr& data,
const BuildMaps::Target::ConfiguredTarget& key,
+ const gsl::not_null<RepositoryConfig*>& repo_config,
const BuildMaps::Target::TargetMap::SubCallerPtr& subcaller,
const BuildMaps::Target::TargetMap::SetterPtr& setter,
const BuildMaps::Target::TargetMap::LoggerPtr& logger,
@@ -1033,6 +1045,7 @@ void withRuleDefinition(
auto target = BuildMaps::Base::ParseEntityNameFromExpression(
dep_name,
key.target,
+ repo_config,
[&logger, &target_field_name, &dep_name](
std::string const& parse_err) {
(*logger)(fmt::format("Parsing entry {} in target "
@@ -1105,6 +1118,7 @@ void withRuleDefinition(
rule,
data,
key,
+ repo_config,
params = std::move(params),
setter,
logger,
@@ -1188,6 +1202,7 @@ void withRuleDefinition(
rule,
data,
key,
+ repo_config,
params = std::move(params),
setter,
logger,
@@ -1202,6 +1217,7 @@ void withRuleDefinition(
rule,
data,
key,
+ repo_config,
params,
setter,
logger,
@@ -1214,6 +1230,7 @@ void withRuleDefinition(
void withTargetsFile(
const BuildMaps::Target::ConfiguredTarget& key,
+ const gsl::not_null<RepositoryConfig*>& repo_config,
const nlohmann::json& targets_file,
const gsl::not_null<BuildMaps::Base::SourceTargetMap*>& source_target,
const gsl::not_null<BuildMaps::Base::UserRuleMap*>& rule_map,
@@ -1248,8 +1265,14 @@ void withTargetsFile(
return;
}
// Handle built-in rule, if it is
- auto handled_as_builtin = BuildMaps::Target::HandleBuiltin(
- *rule_it, desc, key, subcaller, setter, logger, result_map);
+ auto handled_as_builtin = BuildMaps::Target::HandleBuiltin(*rule_it,
+ desc,
+ key,
+ repo_config,
+ subcaller,
+ setter,
+ logger,
+ result_map);
if (handled_as_builtin) {
return;
}
@@ -1258,6 +1281,7 @@ void withTargetsFile(
auto rule_name = BuildMaps::Base::ParseEntityNameFromJson(
*rule_it,
key.target,
+ repo_config,
[&logger, &rule_it, &key](std::string const& parse_err) {
(*logger)(fmt::format("Parsing rule name {} for target {} "
"failed with:\n{}",
@@ -1285,6 +1309,7 @@ void withTargetsFile(
setter,
logger,
key,
+ repo_config,
result_map,
rn = *rule_name](auto values) {
auto data = TargetData::FromFieldReader(*values[0], desc);
@@ -1300,6 +1325,7 @@ void withTargetsFile(
*values[0],
data,
key,
+ repo_config,
subcaller,
setter,
std::make_shared<AsyncMapConsumerLogger>(
@@ -1325,6 +1351,7 @@ void withTargetsFile(
void withTargetNode(
const BuildMaps::Target::ConfiguredTarget& key,
+ const gsl::not_null<RepositoryConfig*>& repo_config,
const gsl::not_null<BuildMaps::Base::UserRuleMap*>& rule_map,
const gsl::not_null<TaskSystem*>& ts,
const BuildMaps::Target::TargetMap::SubCallerPtr& subcaller,
@@ -1362,8 +1389,14 @@ void withTargetNode(
rule_map->ConsumeAfterKeysReady(
ts,
{(**rule_name)->Name()},
- [abs, subcaller, setter, logger, key, result_map, rn = **rule_name](
- auto values) {
+ [abs,
+ subcaller,
+ setter,
+ logger,
+ key,
+ repo_config,
+ result_map,
+ rn = **rule_name](auto values) {
auto data = TargetData::FromTargetNode(
*values[0],
abs,
@@ -1380,6 +1413,7 @@ void withTargetNode(
withRuleDefinition(*values[0],
data,
key,
+ repo_config,
subcaller,
setter,
std::make_shared<AsyncMapConsumerLogger>(
@@ -1625,20 +1659,28 @@ auto CreateTargetMap(
directory_entries_map,
const gsl::not_null<AbsentTargetMap*>& absent_target_map,
const gsl::not_null<ResultTargetMap*>& result_map,
+ const gsl::not_null<RepositoryConfig*>& repo_config,
std::size_t jobs) -> TargetMap {
auto target_reader = [source_target_map,
targets_file_map,
rule_map,
- result_map,
+ directory_entries_map,
absent_target_map,
- directory_entries_map](auto ts,
- auto setter,
- auto logger,
- auto subcaller,
- auto key) {
+ result_map,
+ repo_config](auto ts,
+ auto setter,
+ auto logger,
+ auto subcaller,
+ auto key) {
if (key.target.IsAnonymousTarget()) {
- withTargetNode(
- key, rule_map, ts, subcaller, setter, logger, result_map);
+ withTargetNode(key,
+ repo_config,
+ rule_map,
+ ts,
+ subcaller,
+ setter,
+ logger,
+ result_map);
}
else if (key.target.GetNamedTarget().reference_t ==
BuildMaps::Base::ReferenceType::kTree) {
@@ -1725,8 +1767,7 @@ auto CreateTargetMap(
);
}
#ifndef BOOTSTRAP_BUILD_TOOL
- else if (RepositoryConfig::Instance()
- .TargetRoot(key.target.ToModule().repository)
+ else if (repo_config->TargetRoot(key.target.ToModule().repository)
->IsAbsent()) {
static auto consistent_serve_and_remote_execution =
CheckServeAndExecutionEndpoints();
@@ -1757,6 +1798,7 @@ auto CreateTargetMap(
ts,
{key.target.ToModule()},
[key,
+ repo_config,
source_target_map,
rule_map,
ts,
@@ -1765,6 +1807,7 @@ auto CreateTargetMap(
logger,
result_map](auto values) {
withTargetsFile(key,
+ repo_config,
*values[0],
source_target_map,
rule_map,
diff --git a/src/buildtool/build_engine/target_map/target_map.hpp b/src/buildtool/build_engine/target_map/target_map.hpp
index d86c8ab1..e1cb0a94 100644
--- a/src/buildtool/build_engine/target_map/target_map.hpp
+++ b/src/buildtool/build_engine/target_map/target_map.hpp
@@ -23,6 +23,7 @@
#include "src/buildtool/build_engine/target_map/absent_target_map.hpp"
#include "src/buildtool/build_engine/target_map/configured_target.hpp"
#include "src/buildtool/build_engine/target_map/result_map.hpp"
+#include "src/buildtool/common/repository_config.hpp"
#include "src/buildtool/multithreading/async_map_consumer.hpp"
namespace BuildMaps::Target {
@@ -36,6 +37,7 @@ auto CreateTargetMap(
const gsl::not_null<BuildMaps::Base::DirectoryEntriesMap*>&,
[[maybe_unused]] const gsl::not_null<AbsentTargetMap*>&,
const gsl::not_null<ResultTargetMap*>&,
+ [[maybe_unused]] const gsl::not_null<RepositoryConfig*>&,
std::size_t jobs = 0) -> TargetMap;
auto IsBuiltInRule(nlohmann::json const& rule_type) -> bool;
diff --git a/src/buildtool/build_engine/target_map/utils.cpp b/src/buildtool/build_engine/target_map/utils.cpp
index 55543e30..aa733521 100644
--- a/src/buildtool/build_engine/target_map/utils.cpp
+++ b/src/buildtool/build_engine/target_map/utils.cpp
@@ -27,6 +27,7 @@ auto BuildMaps::Target::Utils::obtainTargetByName(
const ExpressionPtr& expr,
const Configuration& env,
const Base::EntityName& current,
+ const gsl::not_null<RepositoryConfig*>& repo_config,
std::unordered_map<BuildMaps::Target::ConfiguredTarget,
AnalysedTargetPtr> const& deps_by_transition)
-> AnalysedTargetPtr {
@@ -34,9 +35,10 @@ auto BuildMaps::Target::Utils::obtainTargetByName(
auto reference = eval(expr["dep"], env);
std::string error{};
auto target = BuildMaps::Base::ParseEntityNameFromExpression(
- reference, current, [&error](std::string const& parse_err) {
- error = parse_err;
- });
+ reference,
+ current,
+ repo_config,
+ [&error](std::string const& parse_err) { error = parse_err; });
if (not target) {
throw Evaluator::EvaluationError{
fmt::format("Parsing target name {} failed with:\n{}",
diff --git a/src/buildtool/build_engine/target_map/utils.hpp b/src/buildtool/build_engine/target_map/utils.hpp
index 2b48fb04..b3fb5a7c 100644
--- a/src/buildtool/build_engine/target_map/utils.hpp
+++ b/src/buildtool/build_engine/target_map/utils.hpp
@@ -28,6 +28,7 @@
#include "src/buildtool/build_engine/expression/function_map.hpp"
#include "src/buildtool/build_engine/target_map/configured_target.hpp"
#include "src/buildtool/build_engine/target_map/target_map.hpp"
+#include "src/buildtool/common/repository_config.hpp"
namespace BuildMaps::Target::Utils {
@@ -35,6 +36,7 @@ auto obtainTargetByName(const SubExprEvaluator&,
const ExpressionPtr&,
const Configuration&,
const Base::EntityName&,
+ const gsl::not_null<RepositoryConfig*>&,
std::unordered_map<BuildMaps::Target::ConfiguredTarget,
AnalysedTargetPtr> const&)
-> AnalysedTargetPtr;
diff --git a/src/buildtool/common/repository_config.hpp b/src/buildtool/common/repository_config.hpp
index d4152467..de5d4225 100644
--- a/src/buildtool/common/repository_config.hpp
+++ b/src/buildtool/common/repository_config.hpp
@@ -17,6 +17,7 @@
#include <filesystem>
#include <map>
+#include <memory>
#include <string>
#include <unordered_map>
@@ -43,11 +44,6 @@ class RepositoryConfig {
-> std::optional<nlohmann::json>;
};
- [[nodiscard]] static auto Instance() noexcept -> RepositoryConfig& {
- static RepositoryConfig instance{};
- return instance;
- }
-
void SetInfo(std::string const& repo, RepositoryInfo&& info) {
repos_[repo].base_desc = info.BaseContentDescription();
repos_[repo].info = std::move(info);
diff --git a/src/buildtool/execution_api/common/TARGETS b/src/buildtool/execution_api/common/TARGETS
index 3c580d4d..4a9c60e1 100644
--- a/src/buildtool/execution_api/common/TARGETS
+++ b/src/buildtool/execution_api/common/TARGETS
@@ -32,7 +32,8 @@
, "hdrs": ["create_execution_api.hpp"]
, "stage": ["src", "buildtool", "execution_api", "common"]
, "deps":
- [ ["src/buildtool/common/remote", "remote_common"]
+ [ ["src/buildtool/common", "config"]
+ , ["src/buildtool/common/remote", "remote_common"]
, ["src/buildtool/execution_api/local", "local"]
, ["src/buildtool/execution_api/remote", "bazel"]
]
diff --git a/src/buildtool/execution_api/common/create_execution_api.hpp b/src/buildtool/execution_api/common/create_execution_api.hpp
index 02fcee4b..c62d0f17 100644
--- a/src/buildtool/execution_api/common/create_execution_api.hpp
+++ b/src/buildtool/execution_api/common/create_execution_api.hpp
@@ -20,15 +20,19 @@
#include "gsl/gsl"
#include "src/buildtool/common/remote/remote_common.hpp"
+#include "src/buildtool/common/repository_config.hpp"
#include "src/buildtool/execution_api/local/local_api.hpp"
#include "src/buildtool/execution_api/remote/bazel/bazel_api.hpp"
/// \brief Utility function to instantiate either a Local or Bazel Execution
/// API.
/// \param address if provided, a BazelApi is instantiated
+/// \param repo_config repository configuration to be used by GitApi calls
/// \param instance_name only used in the construction of the BazelApi object
[[nodiscard]] static inline auto CreateExecutionApi(
std::optional<ServerAddress> const& address,
+ std::optional<gsl::not_null<RepositoryConfig*>> const& repo_config =
+ std::nullopt,
std::string const& instance_name = "remote-execution")
-> gsl::not_null<IExecutionApi::Ptr> {
if (address) {
@@ -38,7 +42,7 @@
return std::make_unique<BazelApi>(
instance_name, address->host, address->port, config);
}
- return std::make_unique<LocalApi>();
+ return std::make_unique<LocalApi>(repo_config);
}
#endif
diff --git a/src/buildtool/execution_api/git/git_api.hpp b/src/buildtool/execution_api/git/git_api.hpp
index 7542c296..52c21627 100644
--- a/src/buildtool/execution_api/git/git_api.hpp
+++ b/src/buildtool/execution_api/git/git_api.hpp
@@ -26,7 +26,7 @@
/// \brief API for local execution.
class GitApi final : public IExecutionApi {
public:
- GitApi() : repo_config_{&RepositoryConfig::Instance()} {}
+ GitApi() = delete;
explicit GitApi(gsl::not_null<RepositoryConfig*> const& repo_config)
: repo_config_{repo_config} {}
auto CreateAction(
diff --git a/src/buildtool/execution_api/local/TARGETS b/src/buildtool/execution_api/local/TARGETS
index f2c0e1b4..c8895c20 100644
--- a/src/buildtool/execution_api/local/TARGETS
+++ b/src/buildtool/execution_api/local/TARGETS
@@ -26,6 +26,7 @@
, "deps":
[ ["@", "fmt", "", "fmt"]
, ["@", "gsl", "", "gsl"]
+ , ["src/buildtool/common", "config"]
, ["src/buildtool/storage", "storage"]
, ["src/buildtool/execution_api/common", "common"]
, ["src/buildtool/execution_api/bazel_msg", "bazel_msg_factory"]
diff --git a/src/buildtool/execution_api/local/local_api.hpp b/src/buildtool/execution_api/local/local_api.hpp
index c04e82f4..f919e9c9 100644
--- a/src/buildtool/execution_api/local/local_api.hpp
+++ b/src/buildtool/execution_api/local/local_api.hpp
@@ -24,6 +24,7 @@
#include "fmt/core.h"
#include "gsl/gsl"
+#include "src/buildtool/common/repository_config.hpp"
#include "src/buildtool/compatibility/compatibility.hpp"
#include "src/buildtool/compatibility/native_support.hpp"
#include "src/buildtool/execution_api/bazel_msg/bazel_blob.hpp"
@@ -38,6 +39,10 @@
/// \brief API for local execution.
class LocalApi final : public IExecutionApi {
public:
+ explicit LocalApi(std::optional<gsl::not_null<RepositoryConfig*>>
+ repo_config = std::nullopt)
+ : repo_config_{std::move(repo_config)} {}
+
auto CreateAction(
ArtifactDigest const& root_digest,
std::vector<std::string> const& command,
@@ -74,12 +79,13 @@ class LocalApi final : public IExecutionApi {
info.digest, output_paths[i]);
if (not infos) {
if (Compatibility::IsCompatible()) {
- // infos not availablble, and in compatible mode cannot
+ // infos not available, and in compatible mode cannot
// fall back to git
return false;
}
- if (not GitApi().RetrieveToPaths({info},
- {output_paths[i]})) {
+ if (repo_config_ and
+ not GitApi(repo_config_.value())
+ .RetrieveToPaths({info}, {output_paths[i]})) {
return false;
}
}
@@ -92,12 +98,13 @@ class LocalApi final : public IExecutionApi {
info.digest, IsExecutableObject(info.type));
if (not blob_path) {
if (Compatibility::IsCompatible()) {
- // infos not availablble, and in compatible mode cannot
+ // infos not available, and in compatible mode cannot
// fall back to git
return false;
}
- if (not GitApi().RetrieveToPaths({info},
- {output_paths[i]})) {
+ if (repo_config_ and
+ not GitApi(repo_config_.value())
+ .RetrieveToPaths({info}, {output_paths[i]})) {
return false;
}
}
@@ -140,11 +147,13 @@ class LocalApi final : public IExecutionApi {
info.ToString(),
fd);
if (Compatibility::IsCompatible()) {
- // infos not availablble, and in compatible mode cannot
+ // infos not available, and in compatible mode cannot
// fall back to git
return false;
}
- if (not GitApi().RetrieveToFds({info}, {fd}, raw_tree)) {
+ if (repo_config_ and
+ not GitApi(repo_config_.value())
+ .RetrieveToFds({info}, {fd}, raw_tree)) {
return false;
}
}
@@ -413,6 +422,7 @@ class LocalApi final : public IExecutionApi {
}
private:
+ std::optional<gsl::not_null<RepositoryConfig*>> repo_config_{};
gsl::not_null<Storage const*> storage_ = &Storage::Instance();
};
diff --git a/src/buildtool/execution_engine/executor/executor.hpp b/src/buildtool/execution_engine/executor/executor.hpp
index 7d38d91c..986d17f8 100644
--- a/src/buildtool/execution_engine/executor/executor.hpp
+++ b/src/buildtool/execution_engine/executor/executor.hpp
@@ -196,6 +196,7 @@ class ExecutorImpl {
[[nodiscard]] static auto VerifyOrUploadArtifact(
Logger const& logger,
gsl::not_null<DependencyGraph::ArtifactNode const*> const& artifact,
+ gsl::not_null<RepositoryConfig*> const& repo_config,
gsl::not_null<IExecutionApi*> const& remote_api,
gsl::not_null<IExecutionApi*> const& local_api) noexcept -> bool {
auto const object_info_opt = artifact->Content().Info();
@@ -230,6 +231,7 @@ class ExecutorImpl {
if (not VerifyOrUploadKnownArtifact(
remote_api,
artifact->Content().Repository(),
+ repo_config,
*object_info_opt)) {
Logger::Log(
LogLevel::Error,
@@ -254,7 +256,8 @@ class ExecutorImpl {
return oss.str();
});
auto repo = artifact->Content().Repository();
- auto new_info = UploadFile(remote_api, repo, *file_path_opt);
+ auto new_info =
+ UploadFile(remote_api, repo, repo_config, *file_path_opt);
if (not new_info) {
Logger::Log(LogLevel::Error,
"artifact in {} could not be uploaded to CAS.",
@@ -356,13 +359,14 @@ class ExecutorImpl {
[[nodiscard]] static auto VerifyOrUploadGitArtifact(
gsl::not_null<IExecutionApi*> const& api,
std::string const& repo,
+ gsl::not_null<RepositoryConfig*> const& repo_config,
Artifact::ObjectInfo const& info,
std::string const& hash) noexcept -> bool {
std::optional<std::string> content;
if (NativeSupport::IsTree(
static_cast<bazel_re::Digest>(info.digest).hash())) {
// if known tree is not available, recursively upload its content
- auto tree = ReadGitTree(repo, hash);
+ auto tree = ReadGitTree(repo, repo_config, hash);
if (not tree) {
return false;
}
@@ -373,7 +377,7 @@ class ExecutorImpl {
}
else {
// if known blob is not available, read and upload it
- content = ReadGitBlob(repo, hash);
+ content = ReadGitBlob(repo, repo_config, hash);
}
if (not content) {
return false;
@@ -385,34 +389,34 @@ class ExecutorImpl {
return api->Upload(container, /*skip_find_missing=*/true);
}
- [[nodiscard]] static auto ReadGitBlob(std::string const& repo,
- std::string const& hash) noexcept
- -> std::optional<std::string> {
- auto const& repo_config = RepositoryConfig::Instance();
+ [[nodiscard]] static auto ReadGitBlob(
+ std::string const& repo,
+ gsl::not_null<RepositoryConfig*> const& repo_config,
+ std::string const& hash) noexcept -> std::optional<std::string> {
std::optional<std::string> blob{};
- if (auto const* ws_root = repo_config.WorkspaceRoot(repo)) {
+ if (auto const* ws_root = repo_config->WorkspaceRoot(repo)) {
// try to obtain blob from local workspace's Git CAS, if any
blob = ws_root->ReadBlob(hash);
}
if (not blob) {
// try to obtain blob from global Git CAS, if any
- blob = repo_config.ReadBlobFromGitCAS(hash);
+ blob = repo_config->ReadBlobFromGitCAS(hash);
}
return blob;
}
- [[nodiscard]] static auto ReadGitTree(std::string const& repo,
- std::string const& hash) noexcept
- -> std::optional<GitTree> {
- auto const& repo_config = RepositoryConfig::Instance();
+ [[nodiscard]] static auto ReadGitTree(
+ std::string const& repo,
+ gsl::not_null<RepositoryConfig*> const& repo_config,
+ std::string const& hash) noexcept -> std::optional<GitTree> {
std::optional<GitTree> tree{};
- if (auto const* ws_root = repo_config.WorkspaceRoot(repo)) {
+ if (auto const* ws_root = repo_config->WorkspaceRoot(repo)) {
// try to obtain tree from local workspace's Git CAS, if any
tree = ws_root->ReadTree(hash);
}
if (not tree) {
// try to obtain tree from global Git CAS, if any
- tree = repo_config.ReadTreeFromGitCAS(hash);
+ tree = repo_config->ReadTreeFromGitCAS(hash);
}
return tree;
}
@@ -420,35 +424,40 @@ class ExecutorImpl {
/// \brief Lookup blob via digest in local git repositories and upload.
/// \param api The endpoint used for uploading
/// \param repo The global repository name, the artifact belongs to
+ /// \param repo_config Configuration specifying the workspace root
/// \param info The info of the object
/// \returns true on success
[[nodiscard]] static auto VerifyOrUploadKnownArtifact(
gsl::not_null<IExecutionApi*> const& api,
std::string const& repo,
+ gsl::not_null<RepositoryConfig*> const& repo_config,
Artifact::ObjectInfo const& info) noexcept -> bool {
if (Compatibility::IsCompatible()) {
auto opt = Compatibility::GetGitEntry(info.digest.hash());
if (opt) {
auto const& [git_sha1_hash, comp_repo] = *opt;
return VerifyOrUploadGitArtifact(
- api, comp_repo, info, git_sha1_hash);
+ api, comp_repo, repo_config, info, git_sha1_hash);
}
return false;
}
- return VerifyOrUploadGitArtifact(api, repo, info, info.digest.hash());
+ return VerifyOrUploadGitArtifact(
+ api, repo, repo_config, info, info.digest.hash());
}
/// \brief Lookup file via path in local workspace root and upload.
/// \param api The endpoint used for uploading
/// \param repo The global repository name, the artifact belongs to
+ /// \param repo_config Configuration specifying the workspace root
/// \param file_path The path of the file to be read
/// \returns The computed object info on success
[[nodiscard]] static auto UploadFile(
gsl::not_null<IExecutionApi*> const& api,
std::string const& repo,
+ gsl::not_null<RepositoryConfig*> const& repo_config,
std::filesystem::path const& file_path) noexcept
-> std::optional<Artifact::ObjectInfo> {
- auto const* ws_root = RepositoryConfig::Instance().WorkspaceRoot(repo);
+ auto const* ws_root = repo_config->WorkspaceRoot(repo);
if (ws_root == nullptr) {
return std::nullopt;
}
@@ -633,11 +642,13 @@ class Executor {
public:
explicit Executor(
+ gsl::not_null<RepositoryConfig*> repo_config,
IExecutionApi* local_api,
IExecutionApi* remote_api,
std::map<std::string, std::string> properties,
std::chrono::milliseconds timeout = IExecutionAction::kDefaultTimeout)
- : local_api_{local_api},
+ : repo_config_{repo_config},
+ local_api_{local_api},
remote_api_{remote_api},
properties_{std::move(properties)},
timeout_{timeout} {}
@@ -666,16 +677,18 @@ class Executor {
/// \brief Check artifact is available to the CAS or upload it.
/// \param[in] artifact The artifact to process.
+ /// \param[in] repo_config The repository configuration to use
/// \returns True if artifact is available or uploaded, false otherwise
[[nodiscard]] auto Process(
gsl::not_null<DependencyGraph::ArtifactNode const*> const& artifact)
const noexcept -> bool {
Logger logger("artifact:" + ToHexString(artifact->Content().Id()));
return Impl::VerifyOrUploadArtifact(
- logger, artifact, remote_api_, local_api_);
+ logger, artifact, repo_config_, remote_api_, local_api_);
}
private:
+ gsl::not_null<RepositoryConfig*> repo_config_;
gsl::not_null<IExecutionApi*> local_api_;
gsl::not_null<IExecutionApi*> remote_api_;
std::map<std::string, std::string> properties_;
@@ -694,12 +707,14 @@ class Rebuilder {
/// \param properties Platform properties for execution.
/// \param timeout Timeout for action execution.
Rebuilder(
+ gsl::not_null<RepositoryConfig*> repo_config,
IExecutionApi* local_api,
IExecutionApi* remote_api,
IExecutionApi* api_cached,
std::map<std::string, std::string> properties,
std::chrono::milliseconds timeout = IExecutionAction::kDefaultTimeout)
- : local_api_{local_api},
+ : repo_config_{repo_config},
+ local_api_{local_api},
remote_api_{remote_api},
api_cached_{api_cached},
properties_{std::move(properties)},
@@ -749,7 +764,7 @@ class Rebuilder {
const noexcept -> bool {
Logger logger("artifact:" + ToHexString(artifact->Content().Id()));
return Impl::VerifyOrUploadArtifact(
- logger, artifact, remote_api_, local_api_);
+ logger, artifact, repo_config_, remote_api_, local_api_);
}
[[nodiscard]] auto DumpFlakyActions() const noexcept -> nlohmann::json {
@@ -765,6 +780,7 @@ class Rebuilder {
}
private:
+ gsl::not_null<RepositoryConfig*> repo_config_;
gsl::not_null<IExecutionApi*> local_api_;
gsl::not_null<IExecutionApi*> remote_api_;
gsl::not_null<IExecutionApi*> api_cached_;
diff --git a/src/buildtool/graph_traverser/TARGETS b/src/buildtool/graph_traverser/TARGETS
index 43238956..76fab72b 100644
--- a/src/buildtool/graph_traverser/TARGETS
+++ b/src/buildtool/graph_traverser/TARGETS
@@ -4,6 +4,7 @@
, "hdrs": ["graph_traverser.hpp"]
, "deps":
[ ["src/buildtool/common", "cli"]
+ , ["src/buildtool/common", "config"]
, ["src/buildtool/common", "tree"]
, ["src/buildtool/common/remote", "remote_common"]
, ["src/buildtool/execution_engine/dag", "dag"]
diff --git a/src/buildtool/graph_traverser/graph_traverser.hpp b/src/buildtool/graph_traverser/graph_traverser.hpp
index 5eec6bd8..82e9f17a 100644
--- a/src/buildtool/graph_traverser/graph_traverser.hpp
+++ b/src/buildtool/graph_traverser/graph_traverser.hpp
@@ -31,6 +31,7 @@
#include "gsl/gsl"
#include "src/buildtool/common/cli.hpp"
#include "src/buildtool/common/remote/remote_common.hpp"
+#include "src/buildtool/common/repository_config.hpp"
#include "src/buildtool/common/statistics.hpp"
#include "src/buildtool/common/tree.hpp"
#include "src/buildtool/execution_api/bazel_msg/bazel_blob_container.hpp"
@@ -68,19 +69,23 @@ class GraphTraverser {
bool failed_artifacts;
};
- explicit GraphTraverser(CommandLineArguments clargs)
+ explicit GraphTraverser(CommandLineArguments clargs,
+ gsl::not_null<RepositoryConfig*> const& repo_config)
: clargs_{std::move(clargs)},
- local_api_{CreateExecutionApi(std::nullopt)},
- remote_api_{
- CreateExecutionApi(RemoteExecutionConfig::RemoteAddress())},
+ repo_config_{repo_config},
+ local_api_{CreateExecutionApi(std::nullopt, repo_config)},
+ remote_api_{CreateExecutionApi(RemoteExecutionConfig::RemoteAddress(),
+ repo_config)},
reporter_{[](auto done, auto cv) {}} {}
explicit GraphTraverser(CommandLineArguments clargs,
+ gsl::not_null<RepositoryConfig*> const& repo_config,
progress_reporter_t reporter)
: clargs_{std::move(clargs)},
- local_api_{CreateExecutionApi(std::nullopt)},
- remote_api_{
- CreateExecutionApi(RemoteExecutionConfig::RemoteAddress())},
+ repo_config_{repo_config},
+ local_api_{CreateExecutionApi(std::nullopt, repo_config)},
+ remote_api_{CreateExecutionApi(RemoteExecutionConfig::RemoteAddress(),
+ repo_config)},
reporter_{std::move(reporter)} {}
/// \brief Parses actions and blobs into graph, traverses it and retrieves
@@ -222,6 +227,7 @@ class GraphTraverser {
private:
CommandLineArguments const clargs_;
+ gsl::not_null<RepositoryConfig*> repo_config_;
gsl::not_null<IExecutionApi::Ptr> const local_api_;
gsl::not_null<IExecutionApi::Ptr> const remote_api_;
progress_reporter_t reporter_;
@@ -339,7 +345,8 @@ class GraphTraverser {
[[nodiscard]] auto Traverse(
DependencyGraph const& g,
std::vector<ArtifactIdentifier> const& artifact_ids) const -> bool {
- Executor executor{&(*local_api_),
+ Executor executor{repo_config_,
+ &(*local_api_),
&(*remote_api_),
RemoteExecutionConfig::PlatformProperties(),
clargs_.build.timeout};
@@ -364,9 +371,10 @@ class GraphTraverser {
DependencyGraph const& g,
std::vector<ArtifactIdentifier> const& artifact_ids) const -> bool {
// setup rebuilder with api for cache endpoint
- auto api_cached =
- CreateExecutionApi(RemoteExecutionConfig::CacheAddress());
- Rebuilder executor{&(*local_api_),
+ auto api_cached = CreateExecutionApi(
+ RemoteExecutionConfig::CacheAddress(), repo_config_);
+ Rebuilder executor{repo_config_,
+ &(*local_api_),
&(*remote_api_),
&(*api_cached),
RemoteExecutionConfig::PlatformProperties(),
diff --git a/src/buildtool/main/TARGETS b/src/buildtool/main/TARGETS
index 40d19095..d8eedaf2 100644
--- a/src/buildtool/main/TARGETS
+++ b/src/buildtool/main/TARGETS
@@ -55,11 +55,12 @@
, "deps":
[ ["src/buildtool/build_engine/base_maps", "entity_name"]
, ["src/buildtool/build_engine/target_map", "configured_target"]
- , ["@", "json", "", "json"]
+ , ["src/buildtool/common", "config"]
]
, "stage": ["src", "buildtool", "main"]
, "private-deps":
- [ ["src/buildtool/build_engine/base_maps", "rule_map"]
+ [ ["@", "json", "", "json"]
+ , ["src/buildtool/build_engine/base_maps", "rule_map"]
, ["src/buildtool/build_engine/base_maps", "targets_file_map"]
, ["src/buildtool/build_engine/target_map", "target_map"]
, ["src/buildtool/logging", "logging"]
@@ -111,6 +112,7 @@
, ["src/buildtool/build_engine/target_map", "configured_target"]
, ["src/buildtool/build_engine/target_map", "result_map"]
, ["src/buildtool/build_engine/analysed_target", "target"]
+ , ["src/buildtool/common", "config"]
]
, "stage": ["src", "buildtool", "main"]
, "private-deps":
diff --git a/src/buildtool/main/analyse.cpp b/src/buildtool/main/analyse.cpp
index 6cccd1c3..54b77e4f 100644
--- a/src/buildtool/main/analyse.cpp
+++ b/src/buildtool/main/analyse.cpp
@@ -125,22 +125,29 @@ void DetectAndReportPending(std::string const& name,
[[nodiscard]] auto AnalyseTarget(
const Target::ConfiguredTarget& id,
gsl::not_null<Target::ResultTargetMap*> const& result_map,
+ gsl::not_null<RepositoryConfig*> const& repo_config,
std::size_t jobs,
AnalysisArguments const& clargs) -> std::optional<AnalysisResult> {
- auto directory_entries = Base::CreateDirectoryEntriesMap(jobs);
- auto expressions_file_map = Base::CreateExpressionFileMap(jobs);
- auto rule_file_map = Base::CreateRuleFileMap(jobs);
- auto targets_file_map = Base::CreateTargetsFileMap(jobs);
- auto expr_map = Base::CreateExpressionMap(&expressions_file_map, jobs);
- auto rule_map = Base::CreateRuleMap(&rule_file_map, &expr_map, jobs);
- auto source_targets = Base::CreateSourceTargetMap(&directory_entries, jobs);
- auto absent_target_map = Target::CreateAbsentTargetMap(result_map, jobs);
+ auto directory_entries = Base::CreateDirectoryEntriesMap(repo_config, jobs);
+ auto expressions_file_map =
+ Base::CreateExpressionFileMap(repo_config, jobs);
+ auto rule_file_map = Base::CreateRuleFileMap(repo_config, jobs);
+ auto targets_file_map = Base::CreateTargetsFileMap(repo_config, jobs);
+ auto expr_map =
+ Base::CreateExpressionMap(&expressions_file_map, repo_config, jobs);
+ auto rule_map =
+ Base::CreateRuleMap(&rule_file_map, &expr_map, repo_config, jobs);
+ auto source_targets =
+ Base::CreateSourceTargetMap(&directory_entries, repo_config, jobs);
+ auto absent_target_map =
+ Target::CreateAbsentTargetMap(result_map, repo_config, jobs);
auto target_map = Target::CreateTargetMap(&source_targets,
&targets_file_map,
&rule_map,
&directory_entries,
&absent_target_map,
result_map,
+ repo_config,
jobs);
Logger::Log(LogLevel::Info, "Requested target is {}", id.ToString());
AnalysedTargetPtr target{};
diff --git a/src/buildtool/main/analyse.hpp b/src/buildtool/main/analyse.hpp
index 40b13ec1..f4d96229 100644
--- a/src/buildtool/main/analyse.hpp
+++ b/src/buildtool/main/analyse.hpp
@@ -19,6 +19,7 @@
#include "src/buildtool/build_engine/target_map/configured_target.hpp"
#include "src/buildtool/build_engine/target_map/result_map.hpp"
#include "src/buildtool/common/cli.hpp"
+#include "src/buildtool/common/repository_config.hpp"
struct AnalysisResult {
BuildMaps::Target::ConfiguredTarget id;
@@ -29,6 +30,7 @@ struct AnalysisResult {
[[nodiscard]] auto AnalyseTarget(
const BuildMaps::Target::ConfiguredTarget& id,
gsl::not_null<BuildMaps::Target::ResultTargetMap*> const& result_map,
+ gsl::not_null<RepositoryConfig*> const& repo_config,
std::size_t jobs,
AnalysisArguments const& clargs) -> std::optional<AnalysisResult>;
#endif
diff --git a/src/buildtool/main/describe.cpp b/src/buildtool/main/describe.cpp
index 1fcdf44e..fcec015b 100644
--- a/src/buildtool/main/describe.cpp
+++ b/src/buildtool/main/describe.cpp
@@ -53,7 +53,8 @@ void PrintFields(nlohmann::json const& fields,
}
void PrettyPrintRule(nlohmann::json const& rdesc,
- BuildMaps::Base::EntityName const& rule_name) {
+ BuildMaps::Base::EntityName const& rule_name,
+ gsl::not_null<RepositoryConfig*> const& repo_config) {
auto doc = rdesc.find("doc");
if (doc != rdesc.end()) {
PrintDoc(*doc, " | ");
@@ -85,6 +86,7 @@ void PrettyPrintRule(nlohmann::json const& rdesc,
auto resolved_entry = BuildMaps::Base::ParseEntityNameFromJson(
entry,
rule_name,
+ repo_config,
[&entry, &rule_name](std::string const& parse_err) {
Logger::Log(LogLevel::Warning,
"Failed to resolve {} relative to {}:\n{}",
@@ -217,11 +219,13 @@ void PrintRuleAsOrderedJson(nlohmann::json const& rdesc,
} // namespace
-auto DescribeUserDefinedRule(BuildMaps::Base::EntityName const& rule_name,
- std::size_t jobs,
- bool print_json) -> int {
+auto DescribeUserDefinedRule(
+ BuildMaps::Base::EntityName const& rule_name,
+ gsl::not_null<RepositoryConfig*> const& repo_config,
+ std::size_t jobs,
+ bool print_json) -> int {
bool failed{};
- auto rule_file_map = Base::CreateRuleFileMap(jobs);
+ auto rule_file_map = Base::CreateRuleFileMap(repo_config, jobs);
nlohmann::json rules_file;
{
TaskSystem ts{jobs};
@@ -250,14 +254,15 @@ auto DescribeUserDefinedRule(BuildMaps::Base::EntityName const& rule_name,
PrintRuleAsOrderedJson(*ruledesc_it, rule_name.ToJson());
return kExitSuccess;
}
- PrettyPrintRule(*ruledesc_it, rule_name);
+ PrettyPrintRule(*ruledesc_it, rule_name, repo_config);
return kExitSuccess;
}
auto DescribeTarget(BuildMaps::Target::ConfiguredTarget const& id,
+ gsl::not_null<RepositoryConfig*> const& repo_config,
std::size_t jobs,
bool print_json) -> int {
- auto targets_file_map = Base::CreateTargetsFileMap(jobs);
+ auto targets_file_map = Base::CreateTargetsFileMap(repo_config, jobs);
nlohmann::json targets_file{};
bool failed{false};
{
@@ -319,7 +324,10 @@ auto DescribeTarget(BuildMaps::Target::ConfiguredTarget const& id,
return kExitSuccess;
}
auto rule_name = BuildMaps::Base::ParseEntityNameFromJson(
- *rule_it, id.target, [&rule_it, &id](std::string const& parse_err) {
+ *rule_it,
+ id.target,
+ repo_config,
+ [&rule_it, &id](std::string const& parse_err) {
Logger::Log(LogLevel::Error,
"Parsing rule name {} for target {} failed with:\n{}.",
rule_it->dump(),
@@ -333,5 +341,5 @@ auto DescribeTarget(BuildMaps::Target::ConfiguredTarget const& id,
std::cout << id.ToString() << " is defined by user-defined rule "
<< rule_name->ToString() << ".\n\n";
}
- return DescribeUserDefinedRule(*rule_name, jobs, print_json);
+ return DescribeUserDefinedRule(*rule_name, repo_config, jobs, print_json);
}
diff --git a/src/buildtool/main/describe.hpp b/src/buildtool/main/describe.hpp
index 168d4693..f2c9614b 100644
--- a/src/buildtool/main/describe.hpp
+++ b/src/buildtool/main/describe.hpp
@@ -17,13 +17,17 @@
#include "src/buildtool/build_engine/base_maps/entity_name.hpp"
#include "src/buildtool/build_engine/target_map/configured_target.hpp"
+#include "src/buildtool/common/repository_config.hpp"
-[[nodiscard]] auto DescribeTarget(BuildMaps::Target::ConfiguredTarget const& id,
- std::size_t jobs,
- bool print_json) -> int;
+[[nodiscard]] auto DescribeTarget(
+ BuildMaps::Target::ConfiguredTarget const& id,
+ gsl::not_null<RepositoryConfig*> const& repo_config,
+ std::size_t jobs,
+ bool print_json) -> int;
[[nodiscard]] auto DescribeUserDefinedRule(
BuildMaps::Base::EntityName const& rule_name,
+ gsl::not_null<RepositoryConfig*> const& repo_config,
std::size_t jobs,
bool print_json) -> int;
diff --git a/src/buildtool/main/main.cpp b/src/buildtool/main/main.cpp
index 401854ee..022ba916 100644
--- a/src/buildtool/main/main.cpp
+++ b/src/buildtool/main/main.cpp
@@ -402,12 +402,11 @@ void SetupHashFunction() {
}
[[nodiscard]] auto ReadConfiguredTarget(
- AnalysisArguments const& clargs,
std::string const& main_repo,
- std::optional<std::filesystem::path> const& main_ws_root)
- -> Target::ConfiguredTarget {
- auto const* target_root =
- RepositoryConfig::Instance().TargetRoot(main_repo);
+ std::optional<std::filesystem::path> const& main_ws_root,
+ gsl::not_null<RepositoryConfig*> const& repo_config,
+ AnalysisArguments const& clargs) -> Target::ConfiguredTarget {
+ auto const* target_root = repo_config->TargetRoot(main_repo);
if (target_root == nullptr) {
Logger::Log(LogLevel::Error,
"Cannot obtain target root for main repo {}.",
@@ -415,8 +414,7 @@ void SetupHashFunction() {
std::exit(kExitFailure);
}
auto current_module = std::string{"."};
- std::string target_file_name =
- *RepositoryConfig::Instance().TargetFileName(main_repo);
+ std::string target_file_name = *repo_config->TargetFileName(main_repo);
if (main_ws_root) {
// module detection only works if main workspace is on the file system
current_module = DetermineCurrentModule(
@@ -427,6 +425,7 @@ void SetupHashFunction() {
auto entity = Base::ParseEntityNameFromJson(
*clargs.target,
Base::EntityName{Base::NamedTarget{main_repo, current_module, ""}},
+ repo_config,
[&clargs](std::string const& parse_err) {
Logger::Log(LogLevel::Error,
"Parsing target name {} failed with:\n{}",
@@ -456,6 +455,7 @@ void SetupHashFunction() {
auto entity = Base::ParseEntityNameFromJson(
target,
Base::EntityName{Base::NamedTarget{main_repo, current_module, ""}},
+ repo_config,
[&target](std::string const& parse_err) {
Logger::Log(LogLevel::Error,
"Parsing target name {} failed with:\n{}",
@@ -639,7 +639,8 @@ auto ParseRoot(std::string const& repo,
// Set all roots and name mappings from the command-line arguments and
// return the name of the main repository and main workspace path if local.
-auto DetermineRoots(CommonArguments const& cargs,
+auto DetermineRoots(gsl::not_null<RepositoryConfig*> const& repository_config,
+ CommonArguments const& cargs,
AnalysisArguments const& aargs)
-> std::pair<std::string, std::optional<std::filesystem::path>> {
std::optional<std::filesystem::path> main_ws_root;
@@ -800,7 +801,7 @@ auto DetermineRoots(CommonArguments const& cargs,
"expression_file_name",
aargs.expression_file_name);
- RepositoryConfig::Instance().SetInfo(repo, std::move(info));
+ repository_config->SetInfo(repo, std::move(info));
}
return {main_repo, main_ws_root};
@@ -840,9 +841,11 @@ void ReportTaintedness(const AnalysisResult& result) {
auto DetermineNonExplicitTarget(
std::string const& main_repo,
std::optional<std::filesystem::path> const& main_ws_root,
+ gsl::not_null<RepositoryConfig*> const& repo_config,
AnalysisArguments const& clargs)
-> std::optional<BuildMaps::Target::ConfiguredTarget> {
- auto id = ReadConfiguredTarget(clargs, main_repo, main_ws_root);
+ auto id =
+ ReadConfiguredTarget(main_repo, main_ws_root, repo_config, clargs);
switch (id.target.GetNamedTarget().reference_t) {
case Base::ReferenceType::kFile:
std::cout << id.ToString() << " is a source file." << std::endl;
@@ -954,6 +957,9 @@ auto main(int argc, char* argv[]) -> int {
*arguments.analysis.expression_log_limit);
}
+ // global repository configuration
+ RepositoryConfig repo_config{};
+
#ifndef BOOTSTRAP_BUILD_TOOL
/**
* The current implementation of libgit2 uses pthread_key_t incorrectly
@@ -1013,11 +1019,11 @@ auto main(int argc, char* argv[]) -> int {
std::move(arguments.build),
std::move(stage_args),
std::move(rebuild_args)},
+ &repo_config,
ProgressReporter::Reporter()};
if (arguments.cmd == SubCommand::kInstallCas) {
- if (not RepositoryConfig::Instance().SetGitCAS(
- StorageConfig::GitRoot())) {
+ if (not repo_config.SetGitCAS(StorageConfig::GitRoot())) {
Logger::Log(LogLevel::Debug,
"Failed set Git CAS {}.",
StorageConfig::GitRoot().string());
@@ -1031,7 +1037,7 @@ auto main(int argc, char* argv[]) -> int {
#endif // BOOTSTRAP_BUILD_TOOL
auto [main_repo, main_ws_root] =
- DetermineRoots(arguments.common, arguments.analysis);
+ DetermineRoots(&repo_config, arguments.common, arguments.analysis);
#ifndef BOOTSTRAP_BUILD_TOOL
auto lock = GarbageCollector::SharedLock();
@@ -1049,8 +1055,7 @@ auto main(int argc, char* argv[]) -> int {
"--compatible");
std::exit(EXIT_FAILURE);
}
- if (not RepositoryConfig::Instance().SetGitCAS(
- *arguments.graph.git_cas)) {
+ if (not repo_config.SetGitCAS(*arguments.graph.git_cas)) {
Logger::Log(LogLevel::Warning,
"Failed set Git CAS {}.",
arguments.graph.git_cas->string());
@@ -1062,14 +1067,18 @@ auto main(int argc, char* argv[]) -> int {
}
}
else if (arguments.cmd == SubCommand::kDescribe) {
- if (auto id = DetermineNonExplicitTarget(
- main_repo, main_ws_root, arguments.analysis)) {
+ if (auto id = DetermineNonExplicitTarget(main_repo,
+ main_ws_root,
+ &repo_config,
+ arguments.analysis)) {
return arguments.describe.describe_rule
? DescribeUserDefinedRule(
id->target,
+ &repo_config,
arguments.common.jobs,
arguments.describe.print_json)
: DescribeTarget(*id,
+ &repo_config,
arguments.common.jobs,
arguments.describe.print_json);
}
@@ -1081,9 +1090,12 @@ auto main(int argc, char* argv[]) -> int {
BuildMaps::Target::ResultTargetMap result_map{
arguments.common.jobs};
auto id = ReadConfiguredTarget(
- arguments.analysis, main_repo, main_ws_root);
- auto result = AnalyseTarget(
- id, &result_map, arguments.common.jobs, arguments.analysis);
+ main_repo, main_ws_root, &repo_config, arguments.analysis);
+ auto result = AnalyseTarget(id,
+ &result_map,
+ &repo_config,
+ arguments.common.jobs,
+ arguments.analysis);
if (result) {
if (arguments.analysis.graph_file) {
result_map.ToFile(*arguments.analysis.graph_file);
diff --git a/src/buildtool/serve_api/remote/target_client.hpp b/src/buildtool/serve_api/remote/target_client.hpp
index ac52a468..72b8d82c 100644
--- a/src/buildtool/serve_api/remote/target_client.hpp
+++ b/src/buildtool/serve_api/remote/target_client.hpp
@@ -57,6 +57,7 @@ class TargetClient {
Logger logger_{"RemoteTargetClient"};
gsl::not_null<IExecutionApi::Ptr> const remote_api_{
CreateExecutionApi(RemoteExecutionConfig::RemoteAddress(),
+ std::nullopt,
"remote-execution")};
gsl::not_null<IExecutionApi::Ptr> const local_api_{
CreateExecutionApi(std::nullopt)};
diff --git a/src/buildtool/serve_api/serve_service/source_tree.hpp b/src/buildtool/serve_api/serve_service/source_tree.hpp
index db64d693..03687df4 100644
--- a/src/buildtool/serve_api/serve_service/source_tree.hpp
+++ b/src/buildtool/serve_api/serve_service/source_tree.hpp
@@ -75,7 +75,9 @@ class SourceTreeService final
// remote execution endpoint
gsl::not_null<IExecutionApi::Ptr> const remote_api_{
- CreateExecutionApi(RemoteExecutionConfig::RemoteAddress())};
+ CreateExecutionApi(RemoteExecutionConfig::RemoteAddress(),
+ std::nullopt,
+ "serve-remote-execution")};
// local api
gsl::not_null<IExecutionApi::Ptr> const local_api_{
CreateExecutionApi(std::nullopt)};
diff --git a/src/buildtool/serve_api/serve_service/target.hpp b/src/buildtool/serve_api/serve_service/target.hpp
index 0f3f4ae2..e1176b86 100644
--- a/src/buildtool/serve_api/serve_service/target.hpp
+++ b/src/buildtool/serve_api/serve_service/target.hpp
@@ -72,6 +72,7 @@ class TargetService final : public justbuild::just_serve::Target::Service {
// remote execution endpoint used for remote building
gsl::not_null<IExecutionApi::Ptr> const remote_api_{
CreateExecutionApi(RemoteExecutionConfig::RemoteAddress(),
+ std::nullopt,
"serve-remote-execution")};
// used for storing and retrieving target-level cache entries
gsl::not_null<IExecutionApi::Ptr> const local_api_{