summaryrefslogtreecommitdiff
path: root/src/buildtool/main/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/buildtool/main/main.cpp')
-rw-r--r--src/buildtool/main/main.cpp52
1 files changed, 32 insertions, 20 deletions
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);