|
|
@@ -19,6 +19,7 @@
|
|
|
|
|
|
#include <cm3p/uv.h>
|
|
|
|
|
|
+#include "cmCommandLineArgument.h"
|
|
|
#include "cmConsoleBuf.h"
|
|
|
#include "cmDocumentationEntry.h" // IWYU pragma: keep
|
|
|
#include "cmGlobalGenerator.h"
|
|
|
@@ -213,61 +214,115 @@ int do_cmake(int ac, char const* const* av)
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
+ bool wizard_mode = false;
|
|
|
bool sysinfo = false;
|
|
|
bool list_cached = false;
|
|
|
bool list_all_cached = false;
|
|
|
bool list_help = false;
|
|
|
bool view_only = false;
|
|
|
cmake::WorkingMode workingMode = cmake::NORMAL_MODE;
|
|
|
- std::vector<std::string> args;
|
|
|
- for (int i = 0; i < ac; ++i) {
|
|
|
- if (strcmp(av[i], "-i") == 0) {
|
|
|
- /* clang-format off */
|
|
|
- std::cerr <<
|
|
|
- "The \"cmake -i\" wizard mode is no longer supported.\n"
|
|
|
- "Use the -D option to set cache values on the command line.\n"
|
|
|
- "Use cmake-gui or ccmake for an interactive dialog.\n";
|
|
|
- /* clang-format on */
|
|
|
- return 1;
|
|
|
- }
|
|
|
- if (strcmp(av[i], "--system-information") == 0) {
|
|
|
- sysinfo = true;
|
|
|
- } else if (strcmp(av[i], "-N") == 0) {
|
|
|
- view_only = true;
|
|
|
- } else if (strcmp(av[i], "-L") == 0) {
|
|
|
- list_cached = true;
|
|
|
- } else if (strcmp(av[i], "-LA") == 0) {
|
|
|
- list_all_cached = true;
|
|
|
- } else if (strcmp(av[i], "-LH") == 0) {
|
|
|
- list_cached = true;
|
|
|
- list_help = true;
|
|
|
- } else if (strcmp(av[i], "-LAH") == 0) {
|
|
|
- list_all_cached = true;
|
|
|
- list_help = true;
|
|
|
- } else if (cmHasLiteralPrefix(av[i], "-P")) {
|
|
|
- if (i == ac - 1) {
|
|
|
- cmSystemTools::Error("No script specified for argument -P");
|
|
|
- return 1;
|
|
|
+ std::vector<std::string> parsedArgs;
|
|
|
+
|
|
|
+ using CommandArgument =
|
|
|
+ cmCommandLineArgument<bool(std::string const& value)>;
|
|
|
+ std::vector<CommandArgument> arguments = {
|
|
|
+ CommandArgument{
|
|
|
+ "-i", CommandArgument::Values::Zero,
|
|
|
+ [&wizard_mode](std::string const&) -> bool {
|
|
|
+ /* clang-format off */
|
|
|
+ std::cerr <<
|
|
|
+ "The \"cmake -i\" wizard mode is no longer supported.\n"
|
|
|
+ "Use the -D option to set cache values on the command line.\n"
|
|
|
+ "Use cmake-gui or ccmake for an interactive dialog.\n";
|
|
|
+ /* clang-format on */
|
|
|
+ wizard_mode = true;
|
|
|
+ return true;
|
|
|
+ } },
|
|
|
+ CommandArgument{ "--system-information", CommandArgument::Values::Zero,
|
|
|
+ [&](std::string const&) -> bool {
|
|
|
+ sysinfo = true;
|
|
|
+ return true;
|
|
|
+ } },
|
|
|
+ CommandArgument{ "-N", CommandArgument::Values::Zero,
|
|
|
+ [&](std::string const&) -> bool {
|
|
|
+ view_only = true;
|
|
|
+ return true;
|
|
|
+ } },
|
|
|
+ CommandArgument{ "-LAH", CommandArgument::Values::Zero,
|
|
|
+ [&](std::string const&) -> bool {
|
|
|
+ list_all_cached = true;
|
|
|
+ list_help = true;
|
|
|
+ return true;
|
|
|
+ } },
|
|
|
+ CommandArgument{ "-LA", CommandArgument::Values::Zero,
|
|
|
+ [&](std::string const&) -> bool {
|
|
|
+ list_all_cached = true;
|
|
|
+ return true;
|
|
|
+ } },
|
|
|
+ CommandArgument{ "-LH", CommandArgument::Values::Zero,
|
|
|
+ [&](std::string const&) -> bool {
|
|
|
+ list_cached = true;
|
|
|
+ list_help = true;
|
|
|
+ return true;
|
|
|
+ } },
|
|
|
+ CommandArgument{ "-L", CommandArgument::Values::Zero,
|
|
|
+ [&](std::string const&) -> bool {
|
|
|
+ list_cached = true;
|
|
|
+ return true;
|
|
|
+ } },
|
|
|
+ CommandArgument{ "-P", "No script specified for argument -P",
|
|
|
+ CommandArgument::Values::One,
|
|
|
+ [&](std::string const& value) -> bool {
|
|
|
+ workingMode = cmake::SCRIPT_MODE;
|
|
|
+ parsedArgs.emplace_back("-P");
|
|
|
+ parsedArgs.push_back(std::move(value));
|
|
|
+ return true;
|
|
|
+ } },
|
|
|
+ CommandArgument{ "--find-package", CommandArgument::Values::Zero,
|
|
|
+ [&](std::string const&) -> bool {
|
|
|
+ workingMode = cmake::FIND_PACKAGE_MODE;
|
|
|
+ parsedArgs.emplace_back("--find-package");
|
|
|
+ return true;
|
|
|
+ } },
|
|
|
+ CommandArgument{ "--list-presets", CommandArgument::Values::Zero,
|
|
|
+ [&](std::string const&) -> bool {
|
|
|
+ workingMode = cmake::HELP_MODE;
|
|
|
+ parsedArgs.emplace_back("--list-presets");
|
|
|
+ return true;
|
|
|
+ } },
|
|
|
+ };
|
|
|
+
|
|
|
+ std::vector<std::string> inputArgs;
|
|
|
+ inputArgs.reserve(ac);
|
|
|
+ cm::append(inputArgs, av, av + ac);
|
|
|
+
|
|
|
+ for (decltype(inputArgs.size()) i = 0; i < inputArgs.size(); ++i) {
|
|
|
+ std::string const& arg = inputArgs[i];
|
|
|
+ bool matched = false;
|
|
|
+ for (auto const& m : arguments) {
|
|
|
+ if (m.matches(arg)) {
|
|
|
+ matched = true;
|
|
|
+ if (m.parse(arg, i, inputArgs)) {
|
|
|
+ break;
|
|
|
+ } else {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
}
|
|
|
- workingMode = cmake::SCRIPT_MODE;
|
|
|
- args.emplace_back(av[i]);
|
|
|
- i++;
|
|
|
- args.emplace_back(av[i]);
|
|
|
- } else if (cmHasLiteralPrefix(av[i], "--find-package")) {
|
|
|
- workingMode = cmake::FIND_PACKAGE_MODE;
|
|
|
- args.emplace_back(av[i]);
|
|
|
- } else if (strcmp(av[i], "--list-presets") == 0) {
|
|
|
- workingMode = cmake::HELP_MODE;
|
|
|
- args.emplace_back(av[i]);
|
|
|
- } else {
|
|
|
- args.emplace_back(av[i]);
|
|
|
+ }
|
|
|
+ if (!matched) {
|
|
|
+ parsedArgs.emplace_back(av[i]);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ if (wizard_mode) {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+
|
|
|
if (sysinfo) {
|
|
|
cmake cm(cmake::RoleProject, cmState::Project);
|
|
|
cm.SetHomeDirectory("");
|
|
|
cm.SetHomeOutputDirectory("");
|
|
|
- int ret = cm.GetSystemInformation(args);
|
|
|
+ int ret = cm.GetSystemInformation(parsedArgs);
|
|
|
return ret;
|
|
|
}
|
|
|
cmake::Role const role =
|
|
|
@@ -297,7 +352,7 @@ int do_cmake(int ac, char const* const* av)
|
|
|
});
|
|
|
cm.SetWorkingMode(workingMode);
|
|
|
|
|
|
- int res = cm.Run(args, view_only);
|
|
|
+ int res = cm.Run(parsedArgs, view_only);
|
|
|
if (list_cached || list_all_cached) {
|
|
|
std::cout << "-- Cache values" << std::endl;
|
|
|
std::vector<std::string> keys = cm.GetState()->GetCacheEntryKeys();
|