diff options
author | Klaus Aehlig <klaus.aehlig@huawei.com> | 2023-08-23 14:29:33 +0200 |
---|---|---|
committer | Klaus Aehlig <klaus.aehlig@huawei.com> | 2023-08-23 16:01:52 +0200 |
commit | 62e9192e9b5d2164596d7dfaa21be37f223da92f (patch) | |
tree | a1641fb291c609aedef8c3569e02780c1ebc2cc6 /src/buildtool/main/cli.cpp | |
parent | 9fab20246c23193b1a68387cf0b5f63236639a58 (diff) | |
download | justbuild-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.cpp | 209 |
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; +} |