From ca3b93d9c6a816afd7a07bf218c8884510219cf4 Mon Sep 17 00:00:00 2001 From: Brad King Date: Fri, 6 Mar 2009 10:04:06 -0500 Subject: [PATCH] ENH: Teach message() how to display warnings This adds message(WARNING) and message(AUTHOR_WARNING) command modes and fully documents the command behavior in all modes. --- Source/cmMessageCommand.cxx | 42 ++++++++++-------------- Source/cmMessageCommand.h | 30 ++++++++++++----- Tests/CMakeTests/CMakeLists.txt | 1 + Tests/CMakeTests/MessageTest.cmake.in | 30 +++++++++++++++++ Tests/CMakeTests/MessageTestScript.cmake | 4 +++ 5 files changed, 74 insertions(+), 33 deletions(-) create mode 100644 Tests/CMakeTests/MessageTest.cmake.in create mode 100644 Tests/CMakeTests/MessageTestScript.cmake diff --git a/Source/cmMessageCommand.cxx b/Source/cmMessageCommand.cxx index a6f5808b6..7e66e05db 100644 --- a/Source/cmMessageCommand.cxx +++ b/Source/cmMessageCommand.cxx @@ -28,29 +28,27 @@ bool cmMessageCommand std::string message; std::vector::const_iterator i = args.begin(); - bool send_error = false; - bool fatal_error = false; + cmake::MessageType type = cmake::MESSAGE; bool status = false; - if (*i == "SEND_ERROR") + if (*i == "SEND_ERROR" || *i == "FATAL_ERROR") { - send_error = true; + type = cmake::FATAL_ERROR; ++i; } - else + else if (*i == "WARNING") { - if (*i == "STATUS") - { - status = true; - ++i; - } - else - { - if (*i == "FATAL_ERROR") - { - fatal_error = true; - ++i; - } - } + type = cmake::WARNING; + ++i; + } + else if (*i == "AUTHOR_WARNING") + { + type = cmake::AUTHOR_WARNING; + ++i; + } + else if (*i == "STATUS") + { + status = true; + ++i; } for(;i != args.end(); ++i) @@ -58,9 +56,9 @@ bool cmMessageCommand message += *i; } - if (send_error || fatal_error) + if (type != cmake::MESSAGE) { - this->Makefile->IssueMessage(cmake::FATAL_ERROR, message.c_str()); + this->Makefile->IssueMessage(type, message.c_str()); } else { @@ -73,10 +71,6 @@ bool cmMessageCommand cmSystemTools::Message(message.c_str()); } } - if(fatal_error ) - { - cmSystemTools::SetFatalErrorOccured(); - } return true; } diff --git a/Source/cmMessageCommand.h b/Source/cmMessageCommand.h index 54cccd436..f2496f48d 100644 --- a/Source/cmMessageCommand.h +++ b/Source/cmMessageCommand.h @@ -65,16 +65,28 @@ public: virtual const char* GetFullDocumentation() { return - " message([SEND_ERROR | STATUS | FATAL_ERROR]\n" + " message([STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR]\n" " \"message to display\" ...)\n" - "By default the message is displayed in a pop up window (CMakeSetup), " - "or in the stdout of cmake, or the error section of ccmake. " - "If the first argument is " - "SEND_ERROR then an error is raised, and the generate phase will " - "be skipped. If the first argument is FATAL_ERROR, all processing " - "is halted. If the first argument is STATUS then the message is " - "displayed in the progress line for the GUI, or with a -- in the " - "command line cmake."; + "The optional keyword determines the type of message:\n" + " (none) = Important information\n" + " STATUS = Incidental information\n" + " WARNING = CMake Warning, continue processing\n" + " AUTHOR_WARNING = CMake Warning (dev), continue processing\n" + " FATAL_ERROR = CMake Error, stop all processing\n" + " SEND_ERROR = CMake Error, stop all processing (legacy)\n" + "The CMake command-line tool displays STATUS messages on stdout " + "and all other message types on stderr. " + "The CMake GUI displays all messages in its log area. " + "The interactive dialogs (ccmake and CMakeSetup) show STATUS messages " + "one at a time on a status line and other messages in interactive " + "pop-up boxes." + "\n" + "CMake Warning and Error message text displays using a simple " + "markup language. " + "Non-indented text is formatted in line-wrapped paragraphs delimited " + "by newlines. " + "Indented text is considered pre-formatted." + ; } cmTypeMacro(cmMessageCommand, cmCommand); diff --git a/Tests/CMakeTests/CMakeLists.txt b/Tests/CMakeTests/CMakeLists.txt index e8ed3a3a4..e197302c4 100644 --- a/Tests/CMakeTests/CMakeLists.txt +++ b/Tests/CMakeTests/CMakeLists.txt @@ -16,6 +16,7 @@ AddCMakeTest(FindBase "") AddCMakeTest(Toolchain "") AddCMakeTest(GetFilenameComponentRealpath "") AddCMakeTest(Version "") +AddCMakeTest(Message "") SET(GetPrerequisites_PreArgs "-DCTEST_CONFIGURATION_TYPE:STRING=\\\${CTEST_CONFIGURATION_TYPE}" diff --git a/Tests/CMakeTests/MessageTest.cmake.in b/Tests/CMakeTests/MessageTest.cmake.in new file mode 100644 index 000000000..a9833b99c --- /dev/null +++ b/Tests/CMakeTests/MessageTest.cmake.in @@ -0,0 +1,30 @@ +execute_process( + COMMAND ${CMAKE_COMMAND} -P + "@CMAKE_CURRENT_SOURCE_DIR@/MessageTestScript.cmake" + OUTPUT_VARIABLE out + ERROR_VARIABLE err + RESULT_VARIABLE result + ) + +message("out=[${out}]") +message("err=[${err}]") + +if(NOT "${result}" STREQUAL "0") + message(FATAL_ERROR "message script failed: [${result}]") +endif() + +if(NOT "${out}" MATCHES "message-status") + message(FATAL_ERROR "message(STATUS) did not go to stdout") +endif() + +if(NOT "${err}" MATCHES "message-default") + message(FATAL_ERROR "message() did not go to stderr by default") +endif() + +if(NOT "${err}" MATCHES "CMake Warning at[^\n]*:\r?\n message-warning") + message(FATAL_ERROR "message(WARNING) did not appear properly") +endif() + +if(NOT "${err}" MATCHES "CMake Warning \\(dev\\) at[^\n]*:\r?\n message-author") + message(FATAL_ERROR "message(AUTHOR_WARNING) did not appear properly") +endif() diff --git a/Tests/CMakeTests/MessageTestScript.cmake b/Tests/CMakeTests/MessageTestScript.cmake new file mode 100644 index 000000000..c56f88e15 --- /dev/null +++ b/Tests/CMakeTests/MessageTestScript.cmake @@ -0,0 +1,4 @@ +message("message-default") +message(STATUS "message-status") +message(WARNING "message-warning") +message(AUTHOR_WARNING "message-author")