diff options
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; +} |