summaryrefslogtreecommitdiff
path: root/src/buildtool/main/cli.cpp
diff options
context:
space:
mode:
authorKlaus Aehlig <klaus.aehlig@huawei.com>2023-08-23 14:29:33 +0200
committerKlaus Aehlig <klaus.aehlig@huawei.com>2023-08-23 16:01:52 +0200
commit62e9192e9b5d2164596d7dfaa21be37f223da92f (patch)
treea1641fb291c609aedef8c3569e02780c1ebc2cc6 /src/buildtool/main/cli.cpp
parent9fab20246c23193b1a68387cf0b5f63236639a58 (diff)
downloadjustbuild-62e9192e9b5d2164596d7dfaa21be37f223da92f.tar.gz
just: split main code
... by moving the diagnose and cli related code into to separate libraries. In this way, we hopefully improve maintainability of the code base.
Diffstat (limited to 'src/buildtool/main/cli.cpp')
-rw-r--r--src/buildtool/main/cli.cpp209
1 files changed, 209 insertions, 0 deletions
diff --git a/src/buildtool/main/cli.cpp b/src/buildtool/main/cli.cpp
new file mode 100644
index 00000000..cb53acde
--- /dev/null
+++ b/src/buildtool/main/cli.cpp
@@ -0,0 +1,209 @@
+// Copyright 2023 Huawei Cloud Computing Technology Co., Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "src/buildtool/main/cli.hpp"
+
+#include "src/buildtool/main/exit_codes.hpp"
+
+#include <gsl/gsl>
+
+namespace {
+
+/// \brief Setup arguments for sub command "just describe".
+auto SetupDescribeCommandArguments(
+ gsl::not_null<CLI::App*> const& app,
+ gsl::not_null<CommandLineArguments*> const& clargs) {
+ SetupCommonArguments(app, &clargs->common);
+ SetupAnalysisArguments(app, &clargs->analysis, false);
+ SetupLogArguments(app, &clargs->log);
+ SetupDescribeArguments(app, &clargs->describe);
+}
+
+/// \brief Setup arguments for sub command "just analyse".
+auto SetupAnalyseCommandArguments(
+ gsl::not_null<CLI::App*> const& app,
+ gsl::not_null<CommandLineArguments*> const& clargs) {
+ SetupCommonArguments(app, &clargs->common);
+ SetupLogArguments(app, &clargs->log);
+ SetupAnalysisArguments(app, &clargs->analysis);
+ SetupCacheArguments(app, &clargs->endpoint);
+ SetupEndpointArguments(app, &clargs->endpoint);
+ SetupDiagnosticArguments(app, &clargs->diagnose);
+ SetupCompatibilityArguments(app);
+}
+
+/// \brief Setup arguments for sub command "just build".
+auto SetupBuildCommandArguments(
+ gsl::not_null<CLI::App*> const& app,
+ gsl::not_null<CommandLineArguments*> const& clargs) {
+ SetupCommonArguments(app, &clargs->common);
+ SetupLogArguments(app, &clargs->log);
+ SetupAnalysisArguments(app, &clargs->analysis);
+ SetupCacheArguments(app, &clargs->endpoint);
+ SetupEndpointArguments(app, &clargs->endpoint);
+ SetupCommonAuthArguments(app, &clargs->auth);
+ SetupClientAuthArguments(app, &clargs->cauth);
+ SetupCommonBuildArguments(app, &clargs->build);
+ SetupBuildArguments(app, &clargs->build);
+ SetupCompatibilityArguments(app);
+}
+
+/// \brief Setup arguments for sub command "just install".
+auto SetupInstallCommandArguments(
+ gsl::not_null<CLI::App*> const& app,
+ gsl::not_null<CommandLineArguments*> const& clargs) {
+ SetupBuildCommandArguments(app, clargs); // same as build
+ SetupStageArguments(app, &clargs->stage); // plus stage
+}
+
+/// \brief Setup arguments for sub command "just rebuild".
+auto SetupRebuildCommandArguments(
+ gsl::not_null<CLI::App*> const& app,
+ gsl::not_null<CommandLineArguments*> const& clargs) {
+ SetupBuildCommandArguments(app, clargs); // same as build
+ SetupRebuildArguments(app, &clargs->rebuild); // plus rebuild
+}
+
+/// \brief Setup arguments for sub command "just install-cas".
+auto SetupInstallCasCommandArguments(
+ gsl::not_null<CLI::App*> const& app,
+ gsl::not_null<CommandLineArguments*> const& clargs) {
+ SetupCompatibilityArguments(app);
+ SetupCacheArguments(app, &clargs->endpoint);
+ SetupEndpointArguments(app, &clargs->endpoint);
+ SetupCommonAuthArguments(app, &clargs->auth);
+ SetupClientAuthArguments(app, &clargs->cauth);
+ SetupFetchArguments(app, &clargs->fetch);
+ SetupLogArguments(app, &clargs->log);
+}
+
+/// \brief Setup arguments for sub command "just traverse".
+auto SetupTraverseCommandArguments(
+ gsl::not_null<CLI::App*> const& app,
+ gsl::not_null<CommandLineArguments*> const& clargs) {
+ SetupCommonArguments(app, &clargs->common);
+ SetupLogArguments(app, &clargs->log);
+ SetupCacheArguments(app, &clargs->endpoint);
+ SetupEndpointArguments(app, &clargs->endpoint);
+ SetupCommonAuthArguments(app, &clargs->auth);
+ SetupClientAuthArguments(app, &clargs->cauth);
+ SetupGraphArguments(app, &clargs->graph); // instead of analysis
+ SetupCommonBuildArguments(app, &clargs->build);
+ SetupBuildArguments(app, &clargs->build);
+ SetupStageArguments(app, &clargs->stage);
+ SetupCompatibilityArguments(app);
+}
+
+/// \brief Setup arguments for sub command "just gc".
+auto SetupGcCommandArguments(
+ gsl::not_null<CLI::App*> const& app,
+ gsl::not_null<CommandLineArguments*> const& clargs) {
+ SetupLogArguments(app, &clargs->log);
+ SetupCacheArguments(app, &clargs->endpoint);
+}
+
+/// \brief Setup arguments for sub command "just execute".
+auto SetupExecutionServiceCommandArguments(
+ gsl::not_null<CLI::App*> const& app,
+ gsl::not_null<CommandLineArguments*> const& clargs) {
+ SetupCompatibilityArguments(app);
+ SetupCommonBuildArguments(app, &clargs->build);
+ SetupCacheArguments(app, &clargs->endpoint);
+ SetupExecutionServiceArguments(app, &clargs->es);
+ SetupLogArguments(app, &clargs->log);
+ SetupCommonAuthArguments(app, &clargs->auth);
+ SetupServerAuthArguments(app, &clargs->sauth);
+}
+} // namespace
+
+auto ParseCommandLineArguments(int argc, char const* const* argv)
+ -> CommandLineArguments {
+ CLI::App app("just, a generic build tool");
+ app.option_defaults()->take_last();
+
+ auto* cmd_version = app.add_subcommand(
+ "version", "Print version information in JSON format.");
+ auto* cmd_describe = app.add_subcommand(
+ "describe", "Describe the rule generating a target.");
+ auto* cmd_analyse =
+ app.add_subcommand("analyse", "Analyse specified targets.");
+ auto* cmd_build = app.add_subcommand("build", "Build specified targets.");
+ auto* cmd_install =
+ app.add_subcommand("install", "Build and stage specified targets.");
+ auto* cmd_rebuild = app.add_subcommand(
+ "rebuild", "Rebuild and compare artifacts to cached build.");
+ auto* cmd_install_cas =
+ app.add_subcommand("install-cas", "Fetch and stage artifact from CAS.");
+ auto* cmd_gc =
+ app.add_subcommand("gc", "Trigger garbage collection of local cache.");
+ auto* cmd_execution = app.add_subcommand(
+ "execute", "Start single node execution service on this machine.");
+ auto* cmd_traverse =
+ app.group("") // group for creating hidden options
+ ->add_subcommand("traverse",
+ "Build and stage artifacts from graph file.");
+ app.require_subcommand(1);
+
+ CommandLineArguments clargs;
+ SetupDescribeCommandArguments(cmd_describe, &clargs);
+ SetupAnalyseCommandArguments(cmd_analyse, &clargs);
+ SetupBuildCommandArguments(cmd_build, &clargs);
+ SetupInstallCommandArguments(cmd_install, &clargs);
+ SetupRebuildCommandArguments(cmd_rebuild, &clargs);
+ SetupInstallCasCommandArguments(cmd_install_cas, &clargs);
+ SetupTraverseCommandArguments(cmd_traverse, &clargs);
+ SetupGcCommandArguments(cmd_gc, &clargs);
+ SetupExecutionServiceCommandArguments(cmd_execution, &clargs);
+ try {
+ app.parse(argc, argv);
+ } catch (CLI::Error& e) {
+ std::exit(app.exit(e));
+ } catch (std::exception const& ex) {
+ Logger::Log(LogLevel::Error, "Command line parse error: {}", ex.what());
+ std::exit(kExitFailure);
+ }
+
+ if (*cmd_version) {
+ clargs.cmd = SubCommand::kVersion;
+ }
+ else if (*cmd_describe) {
+ clargs.cmd = SubCommand::kDescribe;
+ }
+ else if (*cmd_analyse) {
+ clargs.cmd = SubCommand::kAnalyse;
+ }
+ else if (*cmd_build) {
+ clargs.cmd = SubCommand::kBuild;
+ }
+ else if (*cmd_install) {
+ clargs.cmd = SubCommand::kInstall;
+ }
+ else if (*cmd_rebuild) {
+ clargs.cmd = SubCommand::kRebuild;
+ }
+ else if (*cmd_install_cas) {
+ clargs.cmd = SubCommand::kInstallCas;
+ }
+ else if (*cmd_traverse) {
+ clargs.cmd = SubCommand::kTraverse;
+ }
+ else if (*cmd_gc) {
+ clargs.cmd = SubCommand::kGc;
+ }
+ else if (*cmd_execution) {
+ clargs.cmd = SubCommand::kExecute;
+ }
+
+ return clargs;
+}