diff options
Diffstat (limited to 'src')
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_{ |