From f713146a10810ab060a7d63b252cb2b3cc354684 Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 30 Jun 2022 10:23:46 -0400 Subject: file(CONFIGURE): Add test cases covering missing mandatory options --- Tests/RunCMake/File_Configure/NoArgContent-result.txt | 1 + Tests/RunCMake/File_Configure/NoArgContent-stderr.txt | 4 ++++ Tests/RunCMake/File_Configure/NoArgContent.cmake | 1 + Tests/RunCMake/File_Configure/NoArgOutput-result.txt | 1 + Tests/RunCMake/File_Configure/NoArgOutput-stderr.txt | 4 ++++ Tests/RunCMake/File_Configure/NoArgOutput.cmake | 1 + Tests/RunCMake/File_Configure/RunCMakeTest.cmake | 2 ++ 7 files changed, 14 insertions(+) create mode 100644 Tests/RunCMake/File_Configure/NoArgContent-result.txt create mode 100644 Tests/RunCMake/File_Configure/NoArgContent-stderr.txt create mode 100644 Tests/RunCMake/File_Configure/NoArgContent.cmake create mode 100644 Tests/RunCMake/File_Configure/NoArgOutput-result.txt create mode 100644 Tests/RunCMake/File_Configure/NoArgOutput-stderr.txt create mode 100644 Tests/RunCMake/File_Configure/NoArgOutput.cmake diff --git a/Tests/RunCMake/File_Configure/NoArgContent-result.txt b/Tests/RunCMake/File_Configure/NoArgContent-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/File_Configure/NoArgContent-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/File_Configure/NoArgContent-stderr.txt b/Tests/RunCMake/File_Configure/NoArgContent-stderr.txt new file mode 100644 index 0000000..2e8dd9a --- /dev/null +++ b/Tests/RunCMake/File_Configure/NoArgContent-stderr.txt @@ -0,0 +1,4 @@ +^CMake Error at NoArgContent.cmake:[0-9]+ \(file\): + file CONFIGURE CONTENT option is mandatory. +Call Stack \(most recent call first\): + CMakeLists.txt:[0-9]+ \(include\)$ diff --git a/Tests/RunCMake/File_Configure/NoArgContent.cmake b/Tests/RunCMake/File_Configure/NoArgContent.cmake new file mode 100644 index 0000000..cf52c46 --- /dev/null +++ b/Tests/RunCMake/File_Configure/NoArgContent.cmake @@ -0,0 +1 @@ +file(CONFIGURE OUTPUT "") diff --git a/Tests/RunCMake/File_Configure/NoArgOutput-result.txt b/Tests/RunCMake/File_Configure/NoArgOutput-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/File_Configure/NoArgOutput-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/File_Configure/NoArgOutput-stderr.txt b/Tests/RunCMake/File_Configure/NoArgOutput-stderr.txt new file mode 100644 index 0000000..53de48b --- /dev/null +++ b/Tests/RunCMake/File_Configure/NoArgOutput-stderr.txt @@ -0,0 +1,4 @@ +^CMake Error at NoArgOutput.cmake:[0-9]+ \(file\): + file CONFIGURE OUTPUT option is mandatory. +Call Stack \(most recent call first\): + CMakeLists.txt:[0-9]+ \(include\)$ diff --git a/Tests/RunCMake/File_Configure/NoArgOutput.cmake b/Tests/RunCMake/File_Configure/NoArgOutput.cmake new file mode 100644 index 0000000..77e9cdc --- /dev/null +++ b/Tests/RunCMake/File_Configure/NoArgOutput.cmake @@ -0,0 +1 @@ +file(CONFIGURE CONTENT "") diff --git a/Tests/RunCMake/File_Configure/RunCMakeTest.cmake b/Tests/RunCMake/File_Configure/RunCMakeTest.cmake index 5022985..008ce67 100644 --- a/Tests/RunCMake/File_Configure/RunCMakeTest.cmake +++ b/Tests/RunCMake/File_Configure/RunCMakeTest.cmake @@ -9,6 +9,8 @@ run_cmake(DirOutput) run_cmake(NewLineStyle-NoArg) run_cmake(NewLineStyle-ValidArg) run_cmake(NewLineStyle-WrongArg) +run_cmake(NoArgOutput) +run_cmake(NoArgContent) run_cmake(SubDir) run_cmake(AtOnly) run_cmake(EscapeQuotes) -- cgit v0.12 From fd3ed41109db9682bbdcb5e5d3249b6654322ca6 Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 30 Jun 2022 11:07:48 -0400 Subject: file(GENERATE): Add test case covering use of both INPUT and CONTENT We have long incorrectly accepted both of these together, and used only the first one. Add a test to preserve compatibility. --- Tests/RunCMake/File_Generate/InputAndContent-check.cmake | 8 ++++++++ Tests/RunCMake/File_Generate/InputAndContent-input.txt | 1 + Tests/RunCMake/File_Generate/InputAndContent.cmake | 10 ++++++++++ Tests/RunCMake/File_Generate/RunCMakeTest.cmake | 1 + 4 files changed, 20 insertions(+) create mode 100644 Tests/RunCMake/File_Generate/InputAndContent-check.cmake create mode 100644 Tests/RunCMake/File_Generate/InputAndContent-input.txt create mode 100644 Tests/RunCMake/File_Generate/InputAndContent.cmake diff --git a/Tests/RunCMake/File_Generate/InputAndContent-check.cmake b/Tests/RunCMake/File_Generate/InputAndContent-check.cmake new file mode 100644 index 0000000..5c9b803 --- /dev/null +++ b/Tests/RunCMake/File_Generate/InputAndContent-check.cmake @@ -0,0 +1,8 @@ +file(READ "${RunCMake_TEST_BINARY_DIR}/output-INPUT.txt" input) +if(NOT input MATCHES "INPUT file") + string(APPEND RunCMake_TEST_FAILED "INPUT incorrectly overridden by CONTENT") +endif() +file(READ "${RunCMake_TEST_BINARY_DIR}/output-CONTENT.txt" content) +if(NOT content MATCHES "CONTENT argument") + string(APPEND RunCMake_TEST_FAILED "CONTENT incorrectly overridden by INPUT") +endif() diff --git a/Tests/RunCMake/File_Generate/InputAndContent-input.txt b/Tests/RunCMake/File_Generate/InputAndContent-input.txt new file mode 100644 index 0000000..73f162b --- /dev/null +++ b/Tests/RunCMake/File_Generate/InputAndContent-input.txt @@ -0,0 +1 @@ +INPUT file diff --git a/Tests/RunCMake/File_Generate/InputAndContent.cmake b/Tests/RunCMake/File_Generate/InputAndContent.cmake new file mode 100644 index 0000000..9c3977a --- /dev/null +++ b/Tests/RunCMake/File_Generate/InputAndContent.cmake @@ -0,0 +1,10 @@ +file(GENERATE + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/output-INPUT.txt" + INPUT "${CMAKE_CURRENT_SOURCE_DIR}/InputAndContent-input.txt" + CONTENT "CONTENT argument" +) +file(GENERATE + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/output-CONTENT.txt" + CONTENT "CONTENT argument" + INPUT "${CMAKE_CURRENT_SOURCE_DIR}/InputAndContent-input.txt" +) diff --git a/Tests/RunCMake/File_Generate/RunCMakeTest.cmake b/Tests/RunCMake/File_Generate/RunCMakeTest.cmake index be3bf04..5a670ae 100644 --- a/Tests/RunCMake/File_Generate/RunCMakeTest.cmake +++ b/Tests/RunCMake/File_Generate/RunCMakeTest.cmake @@ -17,6 +17,7 @@ run_cmake(EmptyCondition2) run_cmake(BadCondition) run_cmake(DebugEvaluate) run_cmake(GenerateSource) +run_cmake(InputAndContent) run_cmake(OutputNameMatchesSources) run_cmake(OutputNameMatchesObjects) run_cmake(OutputNameMatchesOtherSources) -- cgit v0.12 From 1ee5a4a548c62e5c382f3497be82aac36a99e485 Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 16 Jun 2022 14:47:40 -0400 Subject: cmArgumentParser: Avoid allocating copies of keyword strings --- Source/CTest/cmCTestCoverageCommand.cxx | 5 +- Source/CTest/cmCTestCoverageCommand.h | 3 +- Source/CTest/cmCTestHandlerCommand.cxx | 7 ++- Source/CTest/cmCTestHandlerCommand.h | 4 +- Source/CTest/cmCTestSubmitCommand.cxx | 7 ++- Source/CTest/cmCTestSubmitCommand.h | 4 +- Source/CTest/cmCTestUploadCommand.cxx | 3 +- Source/CTest/cmCTestUploadCommand.h | 3 +- Source/cmArgumentParser.cxx | 8 +-- Source/cmArgumentParser.h | 16 +++--- Source/cmCMakeHostSystemInformationCommand.cxx | 2 +- Source/cmCMakePathCommand.cxx | 12 ++-- Source/cmExecuteProcessCommand.cxx | 6 +- Source/cmExportCommand.cxx | 3 +- Source/cmFileCommand.cxx | 78 +++++++++++++------------- Source/cmInstallCommand.cxx | 4 +- Source/cmParseArgumentsCommand.cxx | 4 +- Tests/CMakeLib/testArgumentParser.cxx | 9 +-- 18 files changed, 95 insertions(+), 83 deletions(-) diff --git a/Source/CTest/cmCTestCoverageCommand.cxx b/Source/CTest/cmCTestCoverageCommand.cxx index 7432d08..9351b0b 100644 --- a/Source/CTest/cmCTestCoverageCommand.cxx +++ b/Source/CTest/cmCTestCoverageCommand.cxx @@ -4,6 +4,7 @@ #include +#include #include #include @@ -19,10 +20,10 @@ void cmCTestCoverageCommand::BindArguments() } void cmCTestCoverageCommand::CheckArguments( - std::vector const& keywords) + std::vector const& keywords) { this->LabelsMentioned = - !this->Labels.empty() || cm::contains(keywords, "LABELS"); + !this->Labels.empty() || cm::contains(keywords, "LABELS"_s); } cmCTestGenericHandler* cmCTestCoverageCommand::InitializeHandler() diff --git a/Source/CTest/cmCTestCoverageCommand.h b/Source/CTest/cmCTestCoverageCommand.h index 9344852..20bb1a8 100644 --- a/Source/CTest/cmCTestCoverageCommand.h +++ b/Source/CTest/cmCTestCoverageCommand.h @@ -9,6 +9,7 @@ #include #include +#include #include "cmCTestHandlerCommand.h" #include "cmCommand.h" @@ -41,7 +42,7 @@ public: protected: void BindArguments() override; - void CheckArguments(std::vector const& keywords) override; + void CheckArguments(std::vector const& keywords) override; cmCTestGenericHandler* InitializeHandler() override; bool LabelsMentioned; diff --git a/Source/CTest/cmCTestHandlerCommand.cxx b/Source/CTest/cmCTestHandlerCommand.cxx index 5494d20..865e27b 100644 --- a/Source/CTest/cmCTestHandlerCommand.cxx +++ b/Source/CTest/cmCTestHandlerCommand.cxx @@ -7,6 +7,7 @@ #include #include +#include #include #include "cmCTest.h" @@ -81,8 +82,8 @@ bool cmCTestHandlerCommand::InitialPass(std::vector const& args, // Process input arguments. std::vector unparsedArguments; - std::vector keywordsMissingValue; - std::vector parsedKeywords; + std::vector keywordsMissingValue; + std::vector parsedKeywords; this->Parse(args, &unparsedArguments, &keywordsMissingValue, &parsedKeywords); this->CheckArguments(keywordsMissingValue); @@ -242,6 +243,6 @@ void cmCTestHandlerCommand::BindArguments() this->Bind("SUBMIT_INDEX"_s, this->SubmitIndex); } -void cmCTestHandlerCommand::CheckArguments(std::vector const&) +void cmCTestHandlerCommand::CheckArguments(std::vector const&) { } diff --git a/Source/CTest/cmCTestHandlerCommand.h b/Source/CTest/cmCTestHandlerCommand.h index 756952d..4869deb 100644 --- a/Source/CTest/cmCTestHandlerCommand.h +++ b/Source/CTest/cmCTestHandlerCommand.h @@ -7,6 +7,8 @@ #include #include +#include + #include "cmArgumentParser.h" #include "cmCTestCommand.h" @@ -42,7 +44,7 @@ protected: // Command argument handling. virtual void BindArguments(); - virtual void CheckArguments(std::vector const& keywords); + virtual void CheckArguments(std::vector const& keywords); bool Append = false; bool Quiet = false; diff --git a/Source/CTest/cmCTestSubmitCommand.cxx b/Source/CTest/cmCTestSubmitCommand.cxx index a2dc615..288d5b4 100644 --- a/Source/CTest/cmCTestSubmitCommand.cxx +++ b/Source/CTest/cmCTestSubmitCommand.cxx @@ -7,6 +7,7 @@ #include #include +#include #include #include #include @@ -173,12 +174,12 @@ void cmCTestSubmitCommand::BindArguments() } void cmCTestSubmitCommand::CheckArguments( - std::vector const& keywords) + std::vector const& keywords) { this->PartsMentioned = - !this->Parts.empty() || cm::contains(keywords, "PARTS"); + !this->Parts.empty() || cm::contains(keywords, "PARTS"_s); this->FilesMentioned = - !this->Files.empty() || cm::contains(keywords, "FILES"); + !this->Files.empty() || cm::contains(keywords, "FILES"_s); cm::erase_if(this->Parts, [this](std::string const& arg) -> bool { cmCTest::Part p = this->CTest->GetPartFromName(arg); diff --git a/Source/CTest/cmCTestSubmitCommand.h b/Source/CTest/cmCTestSubmitCommand.h index c5d11df..65f09c3 100644 --- a/Source/CTest/cmCTestSubmitCommand.h +++ b/Source/CTest/cmCTestSubmitCommand.h @@ -8,6 +8,8 @@ #include #include +#include + #include "cmCTestHandlerCommand.h" class cmCommand; @@ -35,7 +37,7 @@ public: protected: void BindArguments() override; - void CheckArguments(std::vector const& keywords) override; + void CheckArguments(std::vector const& keywords) override; cmCTestGenericHandler* InitializeHandler() override; bool CDashUpload = false; diff --git a/Source/CTest/cmCTestUploadCommand.cxx b/Source/CTest/cmCTestUploadCommand.cxx index f86ee0d..8289dad 100644 --- a/Source/CTest/cmCTestUploadCommand.cxx +++ b/Source/CTest/cmCTestUploadCommand.cxx @@ -5,6 +5,7 @@ #include #include +#include #include #include @@ -21,7 +22,7 @@ void cmCTestUploadCommand::BindArguments() this->Bind("CAPTURE_CMAKE_ERROR"_s, this->CaptureCMakeError); } -void cmCTestUploadCommand::CheckArguments(std::vector const&) +void cmCTestUploadCommand::CheckArguments(std::vector const&) { cm::erase_if(this->Files, [this](std::string const& arg) -> bool { if (!cmSystemTools::FileExists(arg)) { diff --git a/Source/CTest/cmCTestUploadCommand.h b/Source/CTest/cmCTestUploadCommand.h index fe155f6..0058c31 100644 --- a/Source/CTest/cmCTestUploadCommand.h +++ b/Source/CTest/cmCTestUploadCommand.h @@ -9,6 +9,7 @@ #include #include +#include #include "cmCTestHandlerCommand.h" #include "cmCommand.h" @@ -42,7 +43,7 @@ public: protected: void BindArguments() override; - void CheckArguments(std::vector const&) override; + void CheckArguments(std::vector const&) override; cmCTestGenericHandler* InitializeHandler() override; std::vector Files; diff --git a/Source/cmArgumentParser.cxx b/Source/cmArgumentParser.cxx index 4624f1c..bc91b01 100644 --- a/Source/cmArgumentParser.cxx +++ b/Source/cmArgumentParser.cxx @@ -60,17 +60,17 @@ void Instance::Bind(MultiStringList& val) void Instance::Consume(cm::string_view arg, void* result, std::vector* unparsedArguments, - std::vector* keywordsMissingValue, - std::vector* parsedKeywords) + std::vector* keywordsMissingValue, + std::vector* parsedKeywords) { auto const it = this->Bindings.Find(arg); if (it != this->Bindings.end()) { if (parsedKeywords != nullptr) { - parsedKeywords->emplace_back(arg); + parsedKeywords->emplace_back(it->first); } it->second(*this, result); if (this->ExpectValue && keywordsMissingValue != nullptr) { - keywordsMissingValue->emplace_back(arg); + keywordsMissingValue->emplace_back(it->first); } return; } diff --git a/Source/cmArgumentParser.h b/Source/cmArgumentParser.h index 71ed844..93ef6c1 100644 --- a/Source/cmArgumentParser.h +++ b/Source/cmArgumentParser.h @@ -44,8 +44,8 @@ public: void Consume(cm::string_view arg, void* result, std::vector* unparsedArguments, - std::vector* keywordsMissingValue, - std::vector* parsedKeywords); + std::vector* keywordsMissingValue, + std::vector* parsedKeywords); private: ActionMap const& Bindings; @@ -79,8 +79,8 @@ public: template void Parse(Result& result, Range const& args, std::vector* unparsedArguments = nullptr, - std::vector* keywordsMissingValue = nullptr, - std::vector* parsedKeywords = nullptr) const + std::vector* keywordsMissingValue = nullptr, + std::vector* parsedKeywords = nullptr) const { ArgumentParser::Instance instance(this->Bindings); for (cm::string_view arg : args) { @@ -92,8 +92,8 @@ public: template Result Parse(Range const& args, std::vector* unparsedArguments = nullptr, - std::vector* keywordsMissingValue = nullptr, - std::vector* parsedKeywords = nullptr) const + std::vector* keywordsMissingValue = nullptr, + std::vector* parsedKeywords = nullptr) const { Result result; this->Parse(result, args, unparsedArguments, keywordsMissingValue, @@ -120,8 +120,8 @@ public: template void Parse(Range const& args, std::vector* unparsedArguments = nullptr, - std::vector* keywordsMissingValue = nullptr, - std::vector* parsedKeywords = nullptr) const + std::vector* keywordsMissingValue = nullptr, + std::vector* parsedKeywords = nullptr) const { ArgumentParser::Instance instance(this->Bindings); for (cm::string_view arg : args) { diff --git a/Source/cmCMakeHostSystemInformationCommand.cxx b/Source/cmCMakeHostSystemInformationCommand.cxx index 0750eea..033dd6d 100644 --- a/Source/cmCMakeHostSystemInformationCommand.cxx +++ b/Source/cmCMakeHostSystemInformationCommand.cxx @@ -491,7 +491,7 @@ bool QueryWindowsRegistry(Range args, cmExecutionStatus& status, .Bind("SEPARATOR"_s, &Arguments::Separator) .Bind("ERROR_VARIABLE"_s, &Arguments::ErrorVariable); std::vector invalidArgs; - std::vector keywordsMissingValue; + std::vector keywordsMissingValue; Arguments const arguments = parser.Parse(args.advance(1), &invalidArgs, &keywordsMissingValue); diff --git a/Source/cmCMakePathCommand.cxx b/Source/cmCMakePathCommand.cxx index bf94c2d..adcffa9 100644 --- a/Source/cmCMakePathCommand.cxx +++ b/Source/cmCMakePathCommand.cxx @@ -44,8 +44,8 @@ public: template Result Parse(std::vector const& args, - std::vector* keywordsMissingValue = nullptr, - std::vector* parsedKeywords = nullptr) const + std::vector* keywordsMissingValue = nullptr, + std::vector* parsedKeywords = nullptr) const { this->Inputs.clear(); @@ -89,11 +89,11 @@ public: args, &this->KeywordsMissingValue, &this->ParsedKeywords); } - const std::vector& GetKeywordsMissingValue() const + const std::vector& GetKeywordsMissingValue() const { return this->KeywordsMissingValue; } - const std::vector& GetParsedKeywords() const + const std::vector& GetParsedKeywords() const { return this->ParsedKeywords; } @@ -121,8 +121,8 @@ public: } private: - mutable std::vector KeywordsMissingValue; - mutable std::vector ParsedKeywords; + mutable std::vector KeywordsMissingValue; + mutable std::vector ParsedKeywords; }; struct OutputVariable diff --git a/Source/cmExecuteProcessCommand.cxx b/Source/cmExecuteProcessCommand.cxx index 222ea80..af56e2d 100644 --- a/Source/cmExecuteProcessCommand.cxx +++ b/Source/cmExecuteProcessCommand.cxx @@ -95,13 +95,13 @@ bool cmExecuteProcessCommand(std::vector const& args, .Bind("COMMAND_ERROR_IS_FATAL"_s, &Arguments::CommandErrorIsFatal); std::vector unparsedArguments; - std::vector keywordsMissingValue; + std::vector keywordsMissingValue; Arguments const arguments = parser.Parse(args, &unparsedArguments, &keywordsMissingValue); if (!keywordsMissingValue.empty()) { - status.SetError(" called with no value for " + - keywordsMissingValue.front() + "."); + status.SetError(cmStrCat(" called with no value for ", + keywordsMissingValue.front(), ".")); return false; } if (!unparsedArguments.empty()) { diff --git a/Source/cmExportCommand.cxx b/Source/cmExportCommand.cxx index 63440a3..9a21a98 100644 --- a/Source/cmExportCommand.cxx +++ b/Source/cmExportCommand.cxx @@ -7,6 +7,7 @@ #include #include +#include #include #include @@ -79,7 +80,7 @@ bool cmExportCommand(std::vector const& args, } std::vector unknownArgs; - std::vector keywordsMissingValue; + std::vector keywordsMissingValue; Arguments const arguments = parser.Parse(args, &unknownArgs, &keywordsMissingValue); diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx index 1cfe29c..6013bf8 100644 --- a/Source/cmFileCommand.cxx +++ b/Source/cmFileCommand.cxx @@ -958,8 +958,8 @@ bool HandleRPathChangeCommand(std::vector const& args, bool removeEnvironmentRPath = false; cmArgumentParser parser; std::vector unknownArgs; - std::vector missingArgs; - std::vector parsedArgs; + std::vector missingArgs; + std::vector parsedArgs; parser.Bind("FILE"_s, file) .Bind("OLD_RPATH"_s, oldRPath) .Bind("NEW_RPATH"_s, newRPath) @@ -1028,8 +1028,8 @@ bool HandleRPathSetCommand(std::vector const& args, std::string newRPath; cmArgumentParser parser; std::vector unknownArgs; - std::vector missingArgs; - std::vector parsedArgs; + std::vector missingArgs; + std::vector parsedArgs; parser.Bind("FILE"_s, file).Bind("NEW_RPATH"_s, newRPath); parser.Parse(cmMakeRange(args).advance(1), &unknownArgs, &missingArgs, &parsedArgs); @@ -1087,7 +1087,7 @@ bool HandleRPathRemoveCommand(std::vector const& args, std::string file; cmArgumentParser parser; std::vector unknownArgs; - std::vector missingArgs; + std::vector missingArgs; parser.Bind("FILE"_s, file); parser.Parse(cmMakeRange(args).advance(1), &unknownArgs, &missingArgs); if (!unknownArgs.empty()) { @@ -1138,8 +1138,8 @@ bool HandleRPathCheckCommand(std::vector const& args, std::string rpath; cmArgumentParser parser; std::vector unknownArgs; - std::vector missingArgs; - std::vector parsedArgs; + std::vector missingArgs; + std::vector parsedArgs; parser.Bind("FILE"_s, file).Bind("RPATH"_s, rpath); parser.Parse(cmMakeRange(args).advance(1), &unknownArgs, &missingArgs, &parsedArgs); @@ -1261,8 +1261,8 @@ bool HandleRealPathCommand(std::vector const& args, .Bind("EXPAND_TILDE"_s, &Arguments::ExpandTilde); std::vector unparsedArguments; - std::vector keywordsMissingValue; - std::vector parsedKeywords; + std::vector keywordsMissingValue; + std::vector parsedKeywords; auto arguments = parser.Parse(cmMakeRange(args).advance(3), &unparsedArguments, &keywordsMissingValue, &parsedKeywords); @@ -2521,8 +2521,8 @@ bool HandleGenerateCommand(std::vector const& args, .Bind("NEWLINE_STYLE"_s, &Arguments::NewLineStyle); std::vector unparsedArguments; - std::vector keywordsMissingValues; - std::vector parsedKeywords; + std::vector keywordsMissingValues; + std::vector parsedKeywords; Arguments const arguments = parser.Parse(cmMakeRange(args).advance(1), &unparsedArguments, &keywordsMissingValues, &parsedKeywords); @@ -2578,7 +2578,7 @@ bool HandleGenerateCommand(std::vector const& args, } const bool inputIsContent = parsedKeywords[1] != "INPUT"_s; - if (inputIsContent && parsedKeywords[1] != "CONTENT") { + if (inputIsContent && parsedKeywords[1] != "CONTENT"_s) { status.SetError("Unknown argument to GENERATE subcommand."); } @@ -3102,7 +3102,7 @@ bool HandleGetRuntimeDependenciesCommand(std::vector const& args, .Bind("POST_EXCLUDE_FILES_STRICT"_s, &Arguments::PostExcludeFilesStrict); std::vector unrecognizedArguments; - std::vector keywordsMissingValues; + std::vector keywordsMissingValues; auto parsedArgs = parser.Parse(cmMakeRange(args).advance(1), &unrecognizedArguments, &keywordsMissingValues); @@ -3114,18 +3114,18 @@ bool HandleGetRuntimeDependenciesCommand(std::vector const& args, } // Arguments that are allowed to be empty lists. Keep entries sorted! - const std::vector LIST_ARGS = { - "DIRECTORIES", - "EXECUTABLES", - "LIBRARIES", - "MODULES", - "POST_EXCLUDE_FILES", - "POST_EXCLUDE_FILES_STRICT", - "POST_EXCLUDE_REGEXES", - "POST_INCLUDE_FILES", - "POST_INCLUDE_REGEXES", - "PRE_EXCLUDE_REGEXES", - "PRE_INCLUDE_REGEXES", + static const std::vector LIST_ARGS = { + "DIRECTORIES"_s, + "EXECUTABLES"_s, + "LIBRARIES"_s, + "MODULES"_s, + "POST_EXCLUDE_FILES"_s, + "POST_EXCLUDE_FILES_STRICT"_s, + "POST_EXCLUDE_REGEXES"_s, + "POST_INCLUDE_FILES"_s, + "POST_INCLUDE_REGEXES"_s, + "PRE_EXCLUDE_REGEXES"_s, + "PRE_INCLUDE_REGEXES"_s, }; auto kwbegin = keywordsMissingValues.cbegin(); auto kwend = cmRemoveMatching(keywordsMissingValues, LIST_ARGS); @@ -3251,8 +3251,8 @@ bool HandleConfigureCommand(std::vector const& args, .Bind("NEWLINE_STYLE"_s, &Arguments::NewlineStyle); std::vector unrecognizedArguments; - std::vector keywordsMissingArguments; - std::vector parsedKeywords; + std::vector keywordsMissingArguments; + std::vector parsedKeywords; auto parsedArgs = parser.Parse(cmMakeRange(args).advance(1), &unrecognizedArguments, &keywordsMissingArguments, &parsedKeywords); @@ -3265,7 +3265,7 @@ bool HandleConfigureCommand(std::vector const& args, return false; } - std::vector mandatoryOptions{ "OUTPUT", "CONTENT" }; + std::vector mandatoryOptions{ "OUTPUT"_s, "CONTENT"_s }; for (auto const& e : mandatoryOptions) { const bool optionHasNoValue = std::find(keywordsMissingArguments.begin(), @@ -3392,7 +3392,7 @@ bool HandleArchiveCreateCommand(std::vector const& args, .Bind("PATHS"_s, &Arguments::Paths); std::vector unrecognizedArguments; - std::vector keywordsMissingValues; + std::vector keywordsMissingValues; auto parsedArgs = parser.Parse(cmMakeRange(args).advance(1), &unrecognizedArguments, &keywordsMissingValues); @@ -3404,12 +3404,12 @@ bool HandleArchiveCreateCommand(std::vector const& args, } // Arguments that are allowed to be empty lists. Keep entries sorted! - const std::vector LIST_ARGS = { - "MTIME", // "MTIME" should not be in this list because it requires one - // value, but it has long been accidentally accepted without - // one and treated as if an empty value were given. - // Fixing this would require a policy. - "PATHS", // "PATHS" is here only so we can issue a custom error below. + static const std::vector LIST_ARGS = { + "MTIME"_s, // "MTIME" should not be in this list because it requires one + // value, but it has long been accidentally accepted without + // one and treated as if an empty value were given. + // Fixing this would require a policy. + "PATHS"_s, // "PATHS" is here only so we can issue a custom error below. }; auto kwbegin = keywordsMissingValues.cbegin(); auto kwend = cmRemoveMatching(keywordsMissingValues, LIST_ARGS); @@ -3525,7 +3525,7 @@ bool HandleArchiveExtractCommand(std::vector const& args, .Bind("TOUCH"_s, &Arguments::Touch); std::vector unrecognizedArguments; - std::vector keywordsMissingValues; + std::vector keywordsMissingValues; auto parsedArgs = parser.Parse(cmMakeRange(args).advance(1), &unrecognizedArguments, &keywordsMissingValues); @@ -3537,7 +3537,7 @@ bool HandleArchiveExtractCommand(std::vector const& args, } // Arguments that are allowed to be empty lists. Keep entries sorted! - const std::vector LIST_ARGS = { "PATTERNS" }; + static const std::vector LIST_ARGS = { "PATTERNS"_s }; auto kwbegin = keywordsMissingValues.cbegin(); auto kwend = cmRemoveMatching(keywordsMissingValues, LIST_ARGS); if (kwend != kwbegin) { @@ -3648,7 +3648,7 @@ bool HandleChmodCommandImpl(std::vector const& args, bool recurse, .Bind("DIRECTORY_PERMISSIONS"_s, &Arguments::DirectoryPermissions); std::vector pathEntries; - std::vector keywordsMissingValues; + std::vector keywordsMissingValues; Arguments parsedArgs = parser.Parse(cmMakeRange(args).advance(1), &pathEntries, &keywordsMissingValues); @@ -3672,7 +3672,7 @@ bool HandleChmodCommandImpl(std::vector const& args, bool recurse, if (!keywordsMissingValues.empty()) { for (const auto& i : keywordsMissingValues) { - status.SetError(i + " is not given any arguments"); + status.SetError(cmStrCat(i, " is not given any arguments")); cmSystemTools::SetFatalErrorOccurred(); } return false; diff --git a/Source/cmInstallCommand.cxx b/Source/cmInstallCommand.cxx index 7ca5b23..46c2d33 100644 --- a/Source/cmInstallCommand.cxx +++ b/Source/cmInstallCommand.cxx @@ -439,7 +439,7 @@ bool HandleTargetsMode(std::vector const& args, std::vector runtimeDependenciesArgVector; std::string runtimeDependencySetArg; std::vector unknownArgs; - std::vector parsedArgs; + std::vector parsedArgs; cmInstallCommandArguments genericArgs(helper.DefaultComponentName); genericArgs.Bind("TARGETS"_s, targetList); genericArgs.Bind("EXPORT"_s, exports); @@ -2106,7 +2106,7 @@ bool HandleRuntimeDependencySetMode(std::vector const& args, // These generic args also contain the runtime dependency set std::string runtimeDependencySetArg; std::vector runtimeDependencyArgVector; - std::vector parsedArgs; + std::vector parsedArgs; cmInstallCommandArguments genericArgs(helper.DefaultComponentName); genericArgs.Bind("RUNTIME_DEPENDENCY_SET"_s, runtimeDependencySetArg); genericArgs.Parse(genericArgVector, &runtimeDependencyArgVector, nullptr, diff --git a/Source/cmParseArgumentsCommand.cxx b/Source/cmParseArgumentsCommand.cxx index 95f3e7e..5ea35e8 100644 --- a/Source/cmParseArgumentsCommand.cxx +++ b/Source/cmParseArgumentsCommand.cxx @@ -42,7 +42,7 @@ namespace { using options_map = std::map; using single_map = std::map; using multi_map = std::map>; -using options_set = std::set; +using options_set = std::set; struct UserArgumentParser : public cmArgumentParser { @@ -208,7 +208,7 @@ bool cmParseArgumentsCommand(std::vector const& args, } } - std::vector keywordsMissingValues; + std::vector keywordsMissingValues; parser.Parse(list, &unparsed, &keywordsMissingValues); diff --git a/Tests/CMakeLib/testArgumentParser.cxx b/Tests/CMakeLib/testArgumentParser.cxx index 965690c..954c96f 100644 --- a/Tests/CMakeLib/testArgumentParser.cxx +++ b/Tests/CMakeLib/testArgumentParser.cxx @@ -47,11 +47,12 @@ std::initializer_list const args = { bool verifyResult(Result const& result, std::vector const& unparsedArguments, - std::vector const& keywordsMissingValue) + std::vector const& keywordsMissingValue) { static std::vector const foobar = { "foo", "bar" }; static std::vector const barfoo = { "bar", "foo" }; - static std::vector const missing = { "STRING_1", "LIST_1" }; + static std::vector const missing = { "STRING_1"_s, + "LIST_1"_s }; #define ASSERT_TRUE(x) \ do { \ @@ -89,7 +90,7 @@ bool testArgumentParserDynamic() { Result result; std::vector unparsedArguments; - std::vector keywordsMissingValue; + std::vector keywordsMissingValue; cmArgumentParser{} .Bind("OPTION_1"_s, result.Option1) @@ -123,7 +124,7 @@ bool testArgumentParserStatic() .Bind("MULTI_3"_s, &Result::Multi3); std::vector unparsedArguments; - std::vector keywordsMissingValue; + std::vector keywordsMissingValue; Result const result = parser.Parse(args, &unparsedArguments, &keywordsMissingValue); -- cgit v0.12 From 2873f41bd9f3636f53abf9c31a0b7492366c5199 Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 28 Jun 2022 16:25:54 -0400 Subject: cmArgumentParser: Require callers to consider unparsed arguments --- Source/cmArgumentParser.h | 8 +++----- Source/cmFileCommand.cxx | 6 ++++-- Source/cmTargetSourcesCommand.cxx | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Source/cmArgumentParser.h b/Source/cmArgumentParser.h index 93ef6c1..aa6cf75 100644 --- a/Source/cmArgumentParser.h +++ b/Source/cmArgumentParser.h @@ -78,7 +78,7 @@ public: template void Parse(Result& result, Range const& args, - std::vector* unparsedArguments = nullptr, + std::vector* unparsedArguments, std::vector* keywordsMissingValue = nullptr, std::vector* parsedKeywords = nullptr) const { @@ -90,8 +90,7 @@ public: } template - Result Parse(Range const& args, - std::vector* unparsedArguments = nullptr, + Result Parse(Range const& args, std::vector* unparsedArguments, std::vector* keywordsMissingValue = nullptr, std::vector* parsedKeywords = nullptr) const { @@ -118,8 +117,7 @@ public: } template - void Parse(Range const& args, - std::vector* unparsedArguments = nullptr, + void Parse(Range const& args, std::vector* unparsedArguments, std::vector* keywordsMissingValue = nullptr, std::vector* parsedKeywords = nullptr) const { diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx index 6013bf8..aa3334f 100644 --- a/Source/cmFileCommand.cxx +++ b/Source/cmFileCommand.cxx @@ -172,7 +172,8 @@ bool HandleReadCommand(std::vector const& args, .Bind("LIMIT"_s, &Arguments::Limit) .Bind("HEX"_s, &Arguments::Hex); - Arguments const arguments = parser.Parse(cmMakeRange(args).advance(3)); + Arguments const arguments = parser.Parse(cmMakeRange(args).advance(3), + /*unparsedArguments=*/nullptr); std::string fileName = fileNameArg; if (!cmsys::SystemTools::FileIsFullPath(fileName)) { @@ -1197,7 +1198,8 @@ bool HandleReadElfCommand(std::vector const& args, .Bind("RPATH"_s, &Arguments::RPath) .Bind("RUNPATH"_s, &Arguments::RunPath) .Bind("CAPTURE_ERROR"_s, &Arguments::Error); - Arguments const arguments = parser.Parse(cmMakeRange(args).advance(2)); + Arguments const arguments = parser.Parse(cmMakeRange(args).advance(2), + /*unparsedArguments=*/nullptr); if (!cmSystemTools::FileExists(fileNameArg, true)) { status.SetError(cmStrCat("READ_ELF given FILE \"", fileNameArg, diff --git a/Source/cmTargetSourcesCommand.cxx b/Source/cmTargetSourcesCommand.cxx index e4244a6..76b0384 100644 --- a/Source/cmTargetSourcesCommand.cxx +++ b/Source/cmTargetSourcesCommand.cxx @@ -197,7 +197,7 @@ std::vector TargetSourcesImpl::ConvertToAbsoluteContent( bool TargetSourcesImpl::HandleFileSetMode( const std::string& scope, const std::vector& content) { - auto args = FileSetsArgsParser.Parse(content); + auto args = FileSetsArgsParser.Parse(content, /*unparsedArguments=*/nullptr); for (auto& argList : args.FileSets) { argList.emplace(argList.begin(), "FILE_SET"_s); -- cgit v0.12 From f3dbf4b89d4e74d30fae9e7696caef4158c707e5 Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 29 Jun 2022 15:41:22 -0400 Subject: cmArgumentParser: Remove unnecessary local names for common types --- Source/cmArgumentParser.cxx | 4 ++-- Source/cmArgumentParser.h | 9 +++------ 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/Source/cmArgumentParser.cxx b/Source/cmArgumentParser.cxx index bc91b01..1a05dbc 100644 --- a/Source/cmArgumentParser.cxx +++ b/Source/cmArgumentParser.cxx @@ -44,14 +44,14 @@ void Instance::Bind(std::string& val) this->ExpectValue = true; } -void Instance::Bind(StringList& val) +void Instance::Bind(std::vector& val) { this->CurrentString = nullptr; this->CurrentList = &val; this->ExpectValue = true; } -void Instance::Bind(MultiStringList& val) +void Instance::Bind(std::vector>& val) { this->CurrentString = nullptr; this->CurrentList = (static_cast(val.emplace_back()), &val.back()); diff --git a/Source/cmArgumentParser.h b/Source/cmArgumentParser.h index aa6cf75..2120a27 100644 --- a/Source/cmArgumentParser.h +++ b/Source/cmArgumentParser.h @@ -15,9 +15,6 @@ namespace ArgumentParser { -using StringList = std::vector; -using MultiStringList = std::vector; - class Instance; using Action = std::function; @@ -39,8 +36,8 @@ public: void Bind(bool& val); void Bind(std::string& val); - void Bind(StringList& val); - void Bind(MultiStringList& val); + void Bind(std::vector& val); + void Bind(std::vector>& val); void Consume(cm::string_view arg, void* result, std::vector* unparsedArguments, @@ -50,7 +47,7 @@ public: private: ActionMap const& Bindings; std::string* CurrentString = nullptr; - StringList* CurrentList = nullptr; + std::vector* CurrentList = nullptr; bool ExpectValue = false; }; -- cgit v0.12 From 0a4c5164c93a9c1c8ef7a8191fc46ca80f643168 Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 20 Jun 2022 17:29:18 -0400 Subject: cmArgumentParser: Offer cm::optional bindings to capture keyword presence Several clients have been using `keywordsMissingValue` or `parsedKeywords` to check for the presence of keywords. Offer them a type-encoded way to explicitly check whether a keyword is present. --- Source/cmArgumentParser.h | 11 ++++++++ Tests/CMakeLib/testArgumentParser.cxx | 49 +++++++++++++++++++++++++++-------- 2 files changed, 49 insertions(+), 11 deletions(-) diff --git a/Source/cmArgumentParser.h b/Source/cmArgumentParser.h index 2120a27..8be5a9c 100644 --- a/Source/cmArgumentParser.h +++ b/Source/cmArgumentParser.h @@ -10,6 +10,7 @@ #include #include +#include #include #include @@ -39,6 +40,16 @@ public: void Bind(std::vector& val); void Bind(std::vector>& val); + // cm::optional<> records the presence the keyword to which it binds. + template + void Bind(cm::optional& optVal) + { + if (!optVal) { + optVal.emplace(); + } + this->Bind(*optVal); + } + void Consume(cm::string_view arg, void* result, std::vector* unparsedArguments, std::vector* keywordsMissingValue, diff --git a/Tests/CMakeLib/testArgumentParser.cxx b/Tests/CMakeLib/testArgumentParser.cxx index 954c96f..52c5861 100644 --- a/Tests/CMakeLib/testArgumentParser.cxx +++ b/Tests/CMakeLib/testArgumentParser.cxx @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -19,29 +20,38 @@ struct Result bool Option2 = false; std::string String1; - std::string String2; + cm::optional String2; + cm::optional String3; std::vector List1; std::vector List2; - std::vector List3; + cm::optional> List3; + cm::optional> List4; + cm::optional> List5; std::vector> Multi1; std::vector> Multi2; - std::vector> Multi3; + cm::optional>> Multi3; + cm::optional>> Multi4; }; std::initializer_list const args = { /* clang-format off */ "OPTION_1", // option + // "OPTION_2", // option that is not present "STRING_1", // string arg missing value - "STRING_2", "foo", "bar", // string arg + unparsed value + "STRING_2", "foo", "bar", // string arg + unparsed value, presence captured + // "STRING_3", // string arg that is not present "LIST_1", // list arg missing values "LIST_2", "foo", "bar", // list arg with 2 elems "LIST_3", "bar", // list arg ... "LIST_3", "foo", // ... with continuation + "LIST_4", // list arg missing values, presence captured + // "LIST_5", // list arg that is not present "MULTI_2", // multi list with 0 lists "MULTI_3", "foo", "bar", // multi list with first list with two elems "MULTI_3", "bar", "foo", // multi list with second list with two elems + // "MULTI_4", // multi list arg that is not present /* clang-format on */ }; @@ -52,7 +62,8 @@ bool verifyResult(Result const& result, static std::vector const foobar = { "foo", "bar" }; static std::vector const barfoo = { "bar", "foo" }; static std::vector const missing = { "STRING_1"_s, - "LIST_1"_s }; + "LIST_1"_s, + "LIST_4"_s }; #define ASSERT_TRUE(x) \ do { \ @@ -66,18 +77,26 @@ bool verifyResult(Result const& result, ASSERT_TRUE(!result.Option2); ASSERT_TRUE(result.String1.empty()); - ASSERT_TRUE(result.String2 == "foo"); + ASSERT_TRUE(result.String2); + ASSERT_TRUE(*result.String2 == "foo"); + ASSERT_TRUE(!result.String3); ASSERT_TRUE(result.List1.empty()); ASSERT_TRUE(result.List2 == foobar); - ASSERT_TRUE(result.List3 == barfoo); + ASSERT_TRUE(result.List3); + ASSERT_TRUE(*result.List3 == barfoo); + ASSERT_TRUE(result.List4); + ASSERT_TRUE(result.List4->empty()); + ASSERT_TRUE(!result.List5); ASSERT_TRUE(result.Multi1.empty()); ASSERT_TRUE(result.Multi2.size() == 1); ASSERT_TRUE(result.Multi2[0].empty()); - ASSERT_TRUE(result.Multi3.size() == 2); - ASSERT_TRUE(result.Multi3[0] == foobar); - ASSERT_TRUE(result.Multi3[1] == barfoo); + ASSERT_TRUE(result.Multi3); + ASSERT_TRUE((*result.Multi3).size() == 2); + ASSERT_TRUE((*result.Multi3)[0] == foobar); + ASSERT_TRUE((*result.Multi3)[1] == barfoo); + ASSERT_TRUE(!result.Multi4); ASSERT_TRUE(unparsedArguments.size() == 1); ASSERT_TRUE(unparsedArguments[0] == "bar"); @@ -97,12 +116,16 @@ bool testArgumentParserDynamic() .Bind("OPTION_2"_s, result.Option2) .Bind("STRING_1"_s, result.String1) .Bind("STRING_2"_s, result.String2) + .Bind("STRING_3"_s, result.String3) .Bind("LIST_1"_s, result.List1) .Bind("LIST_2"_s, result.List2) .Bind("LIST_3"_s, result.List3) + .Bind("LIST_4"_s, result.List4) + .Bind("LIST_5"_s, result.List5) .Bind("MULTI_1"_s, result.Multi1) .Bind("MULTI_2"_s, result.Multi2) .Bind("MULTI_3"_s, result.Multi3) + .Bind("MULTI_4"_s, result.Multi4) .Parse(args, &unparsedArguments, &keywordsMissingValue); return verifyResult(result, unparsedArguments, keywordsMissingValue); @@ -116,12 +139,16 @@ bool testArgumentParserStatic() .Bind("OPTION_2"_s, &Result::Option2) .Bind("STRING_1"_s, &Result::String1) .Bind("STRING_2"_s, &Result::String2) + .Bind("STRING_3"_s, &Result::String3) .Bind("LIST_1"_s, &Result::List1) .Bind("LIST_2"_s, &Result::List2) .Bind("LIST_3"_s, &Result::List3) + .Bind("LIST_4"_s, &Result::List4) + .Bind("LIST_5"_s, &Result::List5) .Bind("MULTI_1"_s, &Result::Multi1) .Bind("MULTI_2"_s, &Result::Multi2) - .Bind("MULTI_3"_s, &Result::Multi3); + .Bind("MULTI_3"_s, &Result::Multi3) + .Bind("MULTI_4"_s, &Result::Multi4); std::vector unparsedArguments; std::vector keywordsMissingValue; -- cgit v0.12 From 298f226cb4f63610cd8a7a851c0867a41c5d422b Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 29 Jun 2022 15:51:50 -0400 Subject: cmExportCommand: Use cm::optional for keyword argument presence --- Source/cmExportCommand.cxx | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/Source/cmExportCommand.cxx b/Source/cmExportCommand.cxx index 9a21a98..198874e 100644 --- a/Source/cmExportCommand.cxx +++ b/Source/cmExportCommand.cxx @@ -7,8 +7,7 @@ #include #include -#include -#include +#include #include #include "cmsys/RegularExpression.hxx" @@ -58,7 +57,7 @@ bool cmExportCommand(std::vector const& args, struct Arguments { std::string ExportSetName; - std::vector Targets; + cm::optional> Targets; std::string Namespace; std::string Filename; std::string AndroidMKFile; @@ -80,9 +79,7 @@ bool cmExportCommand(std::vector const& args, } std::vector unknownArgs; - std::vector keywordsMissingValue; - Arguments const arguments = - parser.Parse(args, &unknownArgs, &keywordsMissingValue); + Arguments const arguments = parser.Parse(args, &unknownArgs); if (!unknownArgs.empty()) { status.SetError("Unknown argument: \"" + unknownArgs.front() + "\"."); @@ -146,9 +143,8 @@ bool cmExportCommand(std::vector const& args, return false; } exportSet = &it->second; - } else if (!arguments.Targets.empty() || - cm::contains(keywordsMissingValue, "TARGETS")) { - for (std::string const& currentTarget : arguments.Targets) { + } else if (arguments.Targets) { + for (std::string const& currentTarget : *arguments.Targets) { if (mf.IsAlias(currentTarget)) { std::ostringstream e; e << "given ALIAS target \"" << currentTarget -- cgit v0.12 From 5446b15c5c86532573baf831fd41f6240605c6e6 Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 29 Jun 2022 15:52:36 -0400 Subject: cmInstallCommand: Use cm::optional for keyword argument presence --- Source/cmInstallCommand.cxx | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/Source/cmInstallCommand.cxx b/Source/cmInstallCommand.cxx index 46c2d33..c03c205 100644 --- a/Source/cmInstallCommand.cxx +++ b/Source/cmInstallCommand.cxx @@ -12,6 +12,7 @@ #include #include +#include #include #include @@ -436,24 +437,22 @@ bool HandleTargetsMode(std::vector const& args, // These generic args also contain the targets and the export stuff std::vector targetList; std::string exports; - std::vector runtimeDependenciesArgVector; + cm::optional> runtimeDependenciesArgVector; std::string runtimeDependencySetArg; std::vector unknownArgs; - std::vector parsedArgs; cmInstallCommandArguments genericArgs(helper.DefaultComponentName); genericArgs.Bind("TARGETS"_s, targetList); genericArgs.Bind("EXPORT"_s, exports); genericArgs.Bind("RUNTIME_DEPENDENCIES"_s, runtimeDependenciesArgVector); genericArgs.Bind("RUNTIME_DEPENDENCY_SET"_s, runtimeDependencySetArg); - genericArgs.Parse(genericArgVector, &unknownArgs, nullptr, &parsedArgs); + genericArgs.Parse(genericArgVector, &unknownArgs); bool success = genericArgs.Finalize(); - bool withRuntimeDependencies = - std::find(parsedArgs.begin(), parsedArgs.end(), "RUNTIME_DEPENDENCIES") != - parsedArgs.end(); RuntimeDependenciesArgs runtimeDependenciesArgs = - RuntimeDependenciesArgHelper.Parse(runtimeDependenciesArgVector, - &unknownArgs); + runtimeDependenciesArgVector + ? RuntimeDependenciesArgHelper.Parse(*runtimeDependenciesArgVector, + &unknownArgs) + : RuntimeDependenciesArgs(); cmInstallCommandArguments archiveArgs(helper.DefaultComponentName); cmInstallCommandArguments libraryArgs(helper.DefaultComponentName); @@ -597,7 +596,7 @@ bool HandleTargetsMode(std::vector const& args, } cmInstallRuntimeDependencySet* runtimeDependencySet = nullptr; - if (withRuntimeDependencies) { + if (runtimeDependenciesArgVector) { if (!runtimeDependencySetArg.empty()) { status.SetError("TARGETS cannot have both RUNTIME_DEPENDENCIES and " "RUNTIME_DEPENDENCY_SET."); @@ -1137,7 +1136,7 @@ bool HandleTargetsMode(std::vector const& args, } } - if (withRuntimeDependencies && !runtimeDependencySet->Empty()) { + if (runtimeDependenciesArgVector && !runtimeDependencySet->Empty()) { AddInstallRuntimeDependenciesGenerator( helper, runtimeDependencySet, runtimeArgs, libraryArgs, frameworkArgs, std::move(runtimeDependenciesArgs), installsRuntime, installsLibrary, -- cgit v0.12 From 2586afa31bbbbe174ce1dac9549c0d8671ff5567 Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 29 Jun 2022 15:53:09 -0400 Subject: cmCTest*Command:: Use cm::optional for keyword argument presence --- Source/CTest/cmCTestCoverageCommand.cxx | 13 +------ Source/CTest/cmCTestCoverageCommand.h | 6 +-- Source/CTest/cmCTestHandlerCommand.cxx | 7 ++-- Source/CTest/cmCTestHandlerCommand.h | 4 +- Source/CTest/cmCTestSubmitCommand.cxx | 66 ++++++++++++++++----------------- Source/CTest/cmCTestSubmitCommand.h | 10 ++--- Source/CTest/cmCTestUploadCommand.cxx | 3 +- Source/CTest/cmCTestUploadCommand.h | 3 +- 8 files changed, 45 insertions(+), 67 deletions(-) diff --git a/Source/CTest/cmCTestCoverageCommand.cxx b/Source/CTest/cmCTestCoverageCommand.cxx index 9351b0b..97b0a89 100644 --- a/Source/CTest/cmCTestCoverageCommand.cxx +++ b/Source/CTest/cmCTestCoverageCommand.cxx @@ -4,8 +4,6 @@ #include -#include -#include #include #include "cmCTest.h" @@ -19,13 +17,6 @@ void cmCTestCoverageCommand::BindArguments() this->Bind("LABELS"_s, this->Labels); } -void cmCTestCoverageCommand::CheckArguments( - std::vector const& keywords) -{ - this->LabelsMentioned = - !this->Labels.empty() || cm::contains(keywords, "LABELS"_s); -} - cmCTestGenericHandler* cmCTestCoverageCommand::InitializeHandler() { this->CTest->SetCTestConfigurationFromCMakeVariable( @@ -37,9 +28,9 @@ cmCTestGenericHandler* cmCTestCoverageCommand::InitializeHandler() handler->Initialize(); // If a LABELS option was given, select only files with the labels. - if (this->LabelsMentioned) { + if (this->Labels) { handler->SetLabelFilter( - std::set(this->Labels.begin(), this->Labels.end())); + std::set(this->Labels->begin(), this->Labels->end())); } handler->SetQuiet(this->Quiet); diff --git a/Source/CTest/cmCTestCoverageCommand.h b/Source/CTest/cmCTestCoverageCommand.h index 20bb1a8..dc8f71e 100644 --- a/Source/CTest/cmCTestCoverageCommand.h +++ b/Source/CTest/cmCTestCoverageCommand.h @@ -9,7 +9,7 @@ #include #include -#include +#include #include "cmCTestHandlerCommand.h" #include "cmCommand.h" @@ -42,9 +42,7 @@ public: protected: void BindArguments() override; - void CheckArguments(std::vector const& keywords) override; cmCTestGenericHandler* InitializeHandler() override; - bool LabelsMentioned; - std::vector Labels; + cm::optional> Labels; }; diff --git a/Source/CTest/cmCTestHandlerCommand.cxx b/Source/CTest/cmCTestHandlerCommand.cxx index 865e27b..af365ad 100644 --- a/Source/CTest/cmCTestHandlerCommand.cxx +++ b/Source/CTest/cmCTestHandlerCommand.cxx @@ -82,11 +82,10 @@ bool cmCTestHandlerCommand::InitialPass(std::vector const& args, // Process input arguments. std::vector unparsedArguments; - std::vector keywordsMissingValue; std::vector parsedKeywords; - this->Parse(args, &unparsedArguments, &keywordsMissingValue, + this->Parse(args, &unparsedArguments, /*keywordsMissingValue=*/nullptr, &parsedKeywords); - this->CheckArguments(keywordsMissingValue); + this->CheckArguments(); std::sort(parsedKeywords.begin(), parsedKeywords.end()); auto it = std::adjacent_find(parsedKeywords.begin(), parsedKeywords.end()); @@ -243,6 +242,6 @@ void cmCTestHandlerCommand::BindArguments() this->Bind("SUBMIT_INDEX"_s, this->SubmitIndex); } -void cmCTestHandlerCommand::CheckArguments(std::vector const&) +void cmCTestHandlerCommand::CheckArguments() { } diff --git a/Source/CTest/cmCTestHandlerCommand.h b/Source/CTest/cmCTestHandlerCommand.h index 4869deb..31942c8 100644 --- a/Source/CTest/cmCTestHandlerCommand.h +++ b/Source/CTest/cmCTestHandlerCommand.h @@ -7,8 +7,6 @@ #include #include -#include - #include "cmArgumentParser.h" #include "cmCTestCommand.h" @@ -44,7 +42,7 @@ protected: // Command argument handling. virtual void BindArguments(); - virtual void CheckArguments(std::vector const& keywords); + virtual void CheckArguments(); bool Append = false; bool Quiet = false; diff --git a/Source/CTest/cmCTestSubmitCommand.cxx b/Source/CTest/cmCTestSubmitCommand.cxx index 288d5b4..a1933cc 100644 --- a/Source/CTest/cmCTestSubmitCommand.cxx +++ b/Source/CTest/cmCTestSubmitCommand.cxx @@ -7,9 +7,7 @@ #include #include -#include #include -#include #include #include "cmCTest.h" @@ -88,7 +86,7 @@ cmCTestGenericHandler* cmCTestSubmitCommand::InitializeHandler() // If FILES are given, but not PARTS, only the FILES are submitted // and *no* PARTS are submitted. // (This is why we select the empty "noParts" set in the - // FilesMentioned block below...) + // if(this->Files) block below...) // // If PARTS are given, only the selected PARTS are submitted. // @@ -97,7 +95,7 @@ cmCTestGenericHandler* cmCTestSubmitCommand::InitializeHandler() // If given explicit FILES to submit, pass them to the handler. // - if (this->FilesMentioned) { + if (this->Files) { // Intentionally select *no* PARTS. (Pass an empty set.) If PARTS // were also explicitly mentioned, they will be selected below... // But FILES with no PARTS mentioned should just submit the FILES @@ -105,14 +103,14 @@ cmCTestGenericHandler* cmCTestSubmitCommand::InitializeHandler() // handler->SelectParts(std::set()); handler->SelectFiles( - std::set(this->Files.begin(), this->Files.end())); + std::set(this->Files->begin(), this->Files->end())); } // If a PARTS option was given, select only the named parts for submission. // - if (this->PartsMentioned) { + if (this->Parts) { auto parts = - cmMakeRange(this->Parts).transform([this](std::string const& arg) { + cmMakeRange(*(this->Parts)).transform([this](std::string const& arg) { return this->CTest->GetPartFromName(arg); }); handler->SelectParts(std::set(parts.begin(), parts.end())); @@ -173,33 +171,31 @@ void cmCTestSubmitCommand::BindArguments() this->cmCTestHandlerCommand::BindArguments(); } -void cmCTestSubmitCommand::CheckArguments( - std::vector const& keywords) +void cmCTestSubmitCommand::CheckArguments() { - this->PartsMentioned = - !this->Parts.empty() || cm::contains(keywords, "PARTS"_s); - this->FilesMentioned = - !this->Files.empty() || cm::contains(keywords, "FILES"_s); - - cm::erase_if(this->Parts, [this](std::string const& arg) -> bool { - cmCTest::Part p = this->CTest->GetPartFromName(arg); - if (p == cmCTest::PartCount) { - std::ostringstream e; - e << "Part name \"" << arg << "\" is invalid."; - this->Makefile->IssueMessage(MessageType::FATAL_ERROR, e.str()); - return true; - } - return false; - }); - - cm::erase_if(this->Files, [this](std::string const& arg) -> bool { - if (!cmSystemTools::FileExists(arg)) { - std::ostringstream e; - e << "File \"" << arg << "\" does not exist. Cannot submit " - << "a non-existent file."; - this->Makefile->IssueMessage(MessageType::FATAL_ERROR, e.str()); - return true; - } - return false; - }); + if (this->Parts) { + cm::erase_if(*(this->Parts), [this](std::string const& arg) -> bool { + cmCTest::Part p = this->CTest->GetPartFromName(arg); + if (p == cmCTest::PartCount) { + std::ostringstream e; + e << "Part name \"" << arg << "\" is invalid."; + this->Makefile->IssueMessage(MessageType::FATAL_ERROR, e.str()); + return true; + } + return false; + }); + } + + if (this->Files) { + cm::erase_if(*(this->Files), [this](std::string const& arg) -> bool { + if (!cmSystemTools::FileExists(arg)) { + std::ostringstream e; + e << "File \"" << arg << "\" does not exist. Cannot submit " + << "a non-existent file."; + this->Makefile->IssueMessage(MessageType::FATAL_ERROR, e.str()); + return true; + } + return false; + }); + } } diff --git a/Source/CTest/cmCTestSubmitCommand.h b/Source/CTest/cmCTestSubmitCommand.h index 65f09c3..903bb64 100644 --- a/Source/CTest/cmCTestSubmitCommand.h +++ b/Source/CTest/cmCTestSubmitCommand.h @@ -8,7 +8,7 @@ #include #include -#include +#include #include "cmCTestHandlerCommand.h" @@ -37,13 +37,11 @@ public: protected: void BindArguments() override; - void CheckArguments(std::vector const& keywords) override; + void CheckArguments() override; cmCTestGenericHandler* InitializeHandler() override; bool CDashUpload = false; - bool FilesMentioned = false; bool InternalTest = false; - bool PartsMentioned = false; std::string BuildID; std::string CDashUploadFile; @@ -52,7 +50,7 @@ protected: std::string RetryDelay; std::string SubmitURL; - std::vector Files; + cm::optional> Files; std::vector HttpHeaders; - std::vector Parts; + cm::optional> Parts; }; diff --git a/Source/CTest/cmCTestUploadCommand.cxx b/Source/CTest/cmCTestUploadCommand.cxx index 8289dad..2ed671c 100644 --- a/Source/CTest/cmCTestUploadCommand.cxx +++ b/Source/CTest/cmCTestUploadCommand.cxx @@ -5,7 +5,6 @@ #include #include -#include #include #include @@ -22,7 +21,7 @@ void cmCTestUploadCommand::BindArguments() this->Bind("CAPTURE_CMAKE_ERROR"_s, this->CaptureCMakeError); } -void cmCTestUploadCommand::CheckArguments(std::vector const&) +void cmCTestUploadCommand::CheckArguments() { cm::erase_if(this->Files, [this](std::string const& arg) -> bool { if (!cmSystemTools::FileExists(arg)) { diff --git a/Source/CTest/cmCTestUploadCommand.h b/Source/CTest/cmCTestUploadCommand.h index 0058c31..0dad2bf 100644 --- a/Source/CTest/cmCTestUploadCommand.h +++ b/Source/CTest/cmCTestUploadCommand.h @@ -9,7 +9,6 @@ #include #include -#include #include "cmCTestHandlerCommand.h" #include "cmCommand.h" @@ -43,7 +42,7 @@ public: protected: void BindArguments() override; - void CheckArguments(std::vector const&) override; + void CheckArguments() override; cmCTestGenericHandler* InitializeHandler() override; std::vector Files; -- cgit v0.12 From bff468c988510196f9942d7e007fb2d8b6255ccb Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 30 Jun 2022 09:45:02 -0400 Subject: cmFileCommand: Use cm::optional for keyword argument presence --- Source/cmFileCommand.cxx | 144 +++++++++------------ .../File_Configure/BadArgContent-stderr.txt | 4 +- .../File_Configure/BadArgOutput-stderr.txt | 4 +- .../File_Generate/EmptyCondition1-stderr.txt | 4 +- .../File_Generate/NewLineStyle-NoArg-stderr.txt | 4 +- 5 files changed, 73 insertions(+), 87 deletions(-) diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx index aa3334f..1082387 100644 --- a/Source/cmFileCommand.cxx +++ b/Source/cmFileCommand.cxx @@ -1254,7 +1254,7 @@ bool HandleRealPathCommand(std::vector const& args, struct Arguments { - std::string BaseDirectory; + cm::optional BaseDirectory; bool ExpandTilde = false; }; static auto const parser = @@ -1264,10 +1264,8 @@ bool HandleRealPathCommand(std::vector const& args, std::vector unparsedArguments; std::vector keywordsMissingValue; - std::vector parsedKeywords; - auto arguments = - parser.Parse(cmMakeRange(args).advance(3), &unparsedArguments, - &keywordsMissingValue, &parsedKeywords); + auto arguments = parser.Parse(cmMakeRange(args).advance(3), + &unparsedArguments, &keywordsMissingValue); if (!unparsedArguments.empty()) { status.SetError("REAL_PATH called with unexpected arguments"); @@ -1278,7 +1276,7 @@ bool HandleRealPathCommand(std::vector const& args, return false; } - if (parsedKeywords.empty()) { + if (!arguments.BaseDirectory) { arguments.BaseDirectory = status.GetMakefile().GetCurrentSourceDirectory(); } @@ -1297,7 +1295,7 @@ bool HandleRealPathCommand(std::vector const& args, } cmCMakePath path(input, cmCMakePath::auto_format); - path = path.Absolute(arguments.BaseDirectory).Normal(); + path = path.Absolute(*arguments.BaseDirectory).Normal(); auto realPath = cmSystemTools::GetRealPath(path.GenericString()); status.GetMakefile().AddDefinition(args[2], realPath); @@ -2499,12 +2497,12 @@ bool HandleGenerateCommand(std::vector const& args, struct Arguments { - std::string Output; - std::string Input; - std::string Content; - std::string Condition; - std::string Target; - std::string NewLineStyle; + cm::optional Output; + cm::optional Input; + cm::optional Content; + cm::optional Condition; + cm::optional Target; + cm::optional NewLineStyle; bool NoSourcePermissions = false; bool UseSourcePermissions = false; std::vector FilePermissions; @@ -2530,7 +2528,9 @@ bool HandleGenerateCommand(std::vector const& args, &keywordsMissingValues, &parsedKeywords); if (!keywordsMissingValues.empty()) { - status.SetError("Incorrect arguments to GENERATE subcommand."); + status.SetError( + cmStrCat("GENERATE keywords missing values:\n ", + cmJoin(cmMakeRange(keywordsMissingValues), "\n "))); return false; } @@ -2539,56 +2539,41 @@ bool HandleGenerateCommand(std::vector const& args, return false; } - bool mandatoryOptionsSpecified = false; - if (parsedKeywords.size() > 1) { - const bool outputOprionSpecified = parsedKeywords[0] == "OUTPUT"_s; - const bool inputOrContentSpecified = - parsedKeywords[1] == "INPUT"_s || parsedKeywords[1] == "CONTENT"_s; - if (outputOprionSpecified && inputOrContentSpecified) { - mandatoryOptionsSpecified = true; - } + if (!arguments.Output || parsedKeywords[0] != "OUTPUT"_s) { + status.SetError("GENERATE requires OUTPUT as first option."); + return false; } - if (!mandatoryOptionsSpecified) { - status.SetError("Incorrect arguments to GENERATE subcommand."); + std::string const& output = *arguments.Output; + + if (!arguments.Input && !arguments.Content) { + status.SetError("GENERATE requires INPUT or CONTENT option."); return false; } + const bool inputIsContent = parsedKeywords[1] == "CONTENT"_s; + if (!inputIsContent && parsedKeywords[1] == "INPUT") { + status.SetError("Unknown argument to GENERATE subcommand."); + } + std::string const& input = + inputIsContent ? *arguments.Content : *arguments.Input; - const bool conditionOptionSpecified = - std::find(parsedKeywords.begin(), parsedKeywords.end(), "CONDITION"_s) != - parsedKeywords.end(); - if (conditionOptionSpecified && arguments.Condition.empty()) { + if (arguments.Condition && arguments.Condition->empty()) { status.SetError("CONDITION of sub-command GENERATE must not be empty " "if specified."); return false; } + std::string const& condition = + arguments.Condition ? *arguments.Condition : std::string(); - const bool targetOptionSpecified = - std::find(parsedKeywords.begin(), parsedKeywords.end(), "TARGET"_s) != - parsedKeywords.end(); - if (targetOptionSpecified && arguments.Target.empty()) { + if (arguments.Target && arguments.Target->empty()) { status.SetError("TARGET of sub-command GENERATE must not be empty " "if specified."); return false; } + std::string const& target = + arguments.Target ? *arguments.Target : std::string(); - const bool outputOptionSpecified = - std::find(parsedKeywords.begin(), parsedKeywords.end(), "OUTPUT"_s) != - parsedKeywords.end(); - if (outputOptionSpecified && parsedKeywords[0] != "OUTPUT"_s) { - status.SetError("Incorrect arguments to GENERATE subcommand."); - return false; - } - - const bool inputIsContent = parsedKeywords[1] != "INPUT"_s; - if (inputIsContent && parsedKeywords[1] != "CONTENT"_s) { - status.SetError("Unknown argument to GENERATE subcommand."); - } - - const bool newLineStyleSpecified = - std::find(parsedKeywords.begin(), parsedKeywords.end(), - "NEWLINE_STYLE"_s) != parsedKeywords.end(); cmNewLineStyle newLineStyle; - if (newLineStyleSpecified) { + if (arguments.NewLineStyle) { std::string errorMessage; if (!newLineStyle.ReadFromArguments(args, errorMessage)) { status.SetError(cmStrCat("GENERATE ", errorMessage)); @@ -2596,11 +2581,6 @@ bool HandleGenerateCommand(std::vector const& args, } } - std::string input = arguments.Input; - if (inputIsContent) { - input = arguments.Content; - } - if (arguments.NoSourcePermissions && arguments.UseSourcePermissions) { status.SetError("given both NO_SOURCE_PERMISSIONS and " "USE_SOURCE_PERMISSIONS. Only one option allowed."); @@ -2658,8 +2638,7 @@ bool HandleGenerateCommand(std::vector const& args, } } - AddEvaluationFile(input, arguments.Target, arguments.Output, - arguments.Condition, inputIsContent, + AddEvaluationFile(input, target, output, condition, inputIsContent, newLineStyle.GetCharacters(), permissions, status); return true; } @@ -3237,8 +3216,8 @@ bool HandleConfigureCommand(std::vector const& args, { struct Arguments { - std::string Output; - std::string Content; + cm::optional Output; + cm::optional Content; bool EscapeQuotes = false; bool AtOnly = false; std::string NewlineStyle; @@ -3253,11 +3232,10 @@ bool HandleConfigureCommand(std::vector const& args, .Bind("NEWLINE_STYLE"_s, &Arguments::NewlineStyle); std::vector unrecognizedArguments; - std::vector keywordsMissingArguments; - std::vector parsedKeywords; + std::vector keywordsMissingValues; auto parsedArgs = parser.Parse(cmMakeRange(args).advance(1), &unrecognizedArguments, - &keywordsMissingArguments, &parsedKeywords); + &keywordsMissingValues); auto argIt = unrecognizedArguments.begin(); if (argIt != unrecognizedArguments.end()) { @@ -3267,28 +3245,28 @@ bool HandleConfigureCommand(std::vector const& args, return false; } - std::vector mandatoryOptions{ "OUTPUT"_s, "CONTENT"_s }; - for (auto const& e : mandatoryOptions) { - const bool optionHasNoValue = - std::find(keywordsMissingArguments.begin(), - keywordsMissingArguments.end(), - e) != keywordsMissingArguments.end(); - if (optionHasNoValue) { - status.SetError(cmStrCat("CONFIGURE ", e, " option needs a value.")); - cmSystemTools::SetFatalErrorOccurred(); - return false; - } + // Arguments that are allowed to be empty lists. Keep entries sorted! + static const std::vector LIST_ARGS = { + "NEWLINE_STYLE"_s, // Filter here so we can issue a custom error below. + }; + auto kwbegin = keywordsMissingValues.cbegin(); + auto kwend = cmRemoveMatching(keywordsMissingValues, LIST_ARGS); + if (kwend != kwbegin) { + status.SetError(cmStrCat("CONFIGURE keywords missing values:\n ", + cmJoin(cmMakeRange(kwbegin, kwend), "\n "))); + cmSystemTools::SetFatalErrorOccurred(); + return false; } - for (auto const& e : mandatoryOptions) { - const bool optionGiven = - std::find(parsedKeywords.begin(), parsedKeywords.end(), e) != - parsedKeywords.end(); - if (!optionGiven) { - status.SetError(cmStrCat("CONFIGURE ", e, " option is mandatory.")); - cmSystemTools::SetFatalErrorOccurred(); - return false; - } + if (!parsedArgs.Output) { + status.SetError("CONFIGURE OUTPUT option is mandatory."); + cmSystemTools::SetFatalErrorOccurred(); + return false; + } + if (!parsedArgs.Content) { + status.SetError("CONFIGURE CONTENT option is mandatory."); + cmSystemTools::SetFatalErrorOccurred(); + return false; } std::string errorMessage; @@ -3300,7 +3278,7 @@ bool HandleConfigureCommand(std::vector const& args, // Check for generator expressions std::string outputFile = cmSystemTools::CollapseFullPath( - parsedArgs.Output, status.GetMakefile().GetCurrentBinaryDirectory()); + *parsedArgs.Output, status.GetMakefile().GetCurrentBinaryDirectory()); std::string::size_type pos = outputFile.find_first_of("<>"); if (pos != std::string::npos) { @@ -3349,7 +3327,7 @@ bool HandleConfigureCommand(std::vector const& args, fout.SetCopyIfDifferent(true); // copy input to output and expand variables from input at the same time - std::stringstream sin(parsedArgs.Content, std::ios::in); + std::stringstream sin(*parsedArgs.Content, std::ios::in); std::string inLine; std::string outLine; bool hasNewLine = false; diff --git a/Tests/RunCMake/File_Configure/BadArgContent-stderr.txt b/Tests/RunCMake/File_Configure/BadArgContent-stderr.txt index a6ea314..dd6a2e7 100644 --- a/Tests/RunCMake/File_Configure/BadArgContent-stderr.txt +++ b/Tests/RunCMake/File_Configure/BadArgContent-stderr.txt @@ -1,4 +1,6 @@ CMake Error at BadArgContent.cmake:[0-9]+ \(file\): - file CONFIGURE CONTENT option needs a value. + file CONFIGURE keywords missing values: + + CONTENT Call Stack \(most recent call first\): CMakeLists.txt:3 \(include\) diff --git a/Tests/RunCMake/File_Configure/BadArgOutput-stderr.txt b/Tests/RunCMake/File_Configure/BadArgOutput-stderr.txt index b5a924c..e1bf7b4 100644 --- a/Tests/RunCMake/File_Configure/BadArgOutput-stderr.txt +++ b/Tests/RunCMake/File_Configure/BadArgOutput-stderr.txt @@ -1,4 +1,6 @@ CMake Error at BadArgOutput.cmake:[0-9]+ \(file\): - file CONFIGURE OUTPUT option needs a value. + file CONFIGURE keywords missing values: + + OUTPUT Call Stack \(most recent call first\): CMakeLists.txt:3 \(include\) diff --git a/Tests/RunCMake/File_Generate/EmptyCondition1-stderr.txt b/Tests/RunCMake/File_Generate/EmptyCondition1-stderr.txt index e823b25..4278bce 100644 --- a/Tests/RunCMake/File_Generate/EmptyCondition1-stderr.txt +++ b/Tests/RunCMake/File_Generate/EmptyCondition1-stderr.txt @@ -1,4 +1,6 @@ CMake Error at EmptyCondition1.cmake:2 \(file\): - file Incorrect arguments to GENERATE subcommand. + file GENERATE keywords missing values: + + CONDITION Call Stack \(most recent call first\): CMakeLists.txt:[0-9]+ \(include\) diff --git a/Tests/RunCMake/File_Generate/NewLineStyle-NoArg-stderr.txt b/Tests/RunCMake/File_Generate/NewLineStyle-NoArg-stderr.txt index bc71f2f..4059bf8 100644 --- a/Tests/RunCMake/File_Generate/NewLineStyle-NoArg-stderr.txt +++ b/Tests/RunCMake/File_Generate/NewLineStyle-NoArg-stderr.txt @@ -1,4 +1,6 @@ CMake Error at NewLineStyle-NoArg.cmake:[0-9]+ \(file\): - file Incorrect arguments to GENERATE subcommand. + file GENERATE keywords missing values: + + NEWLINE_STYLE Call Stack \(most recent call first\): CMakeLists.txt:[0-9]+ \(include\) -- cgit v0.12