summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
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_{