Commit f4131e4e authored by Craig Scott's avatar Craig Scott Committed by Kitware Robot

Merge topic 'feature/message-indent'

5f6fd917 message(): Control indentation via CMAKE_MESSAGE_INDENT
Acked-by: Kitware Robot's avatarKitware Robot <kwrobot@kitware.com>
Merge-request: !3464
parents f3bbbb42 5f6fd917
Pipeline #141803 passed with stage
in 0 seconds
...@@ -60,6 +60,11 @@ messages one at a time on a status line and other messages in an ...@@ -60,6 +60,11 @@ messages one at a time on a status line and other messages in an
interactive pop-up box. The ``--loglevel`` command-line option to each of interactive pop-up box. The ``--loglevel`` command-line option to each of
these tools can be used to control which messages will be shown. these tools can be used to control which messages will be shown.
Messages of log levels ``NOTICE`` and below will also have each line preceded
by the content of the :variable:`CMAKE_MESSAGE_INDENT` variable (converted to
a single string by concatenating its list items). For ``STATUS`` to ``TRACE``
messages, this indenting content will be inserted after the hyphens.
CMake Warning and Error message text displays using a simple markup CMake Warning and Error message text displays using a simple markup
language. Non-indented text is formatted in line-wrapped paragraphs language. Non-indented text is formatted in line-wrapped paragraphs
delimited by newlines. Indented text is considered pre-formatted. delimited by newlines. Indented text is considered pre-formatted.
...@@ -69,6 +69,7 @@ Variables that Provide Information ...@@ -69,6 +69,7 @@ Variables that Provide Information
/variable/CMAKE_MAKE_PROGRAM /variable/CMAKE_MAKE_PROGRAM
/variable/CMAKE_MATCH_COUNT /variable/CMAKE_MATCH_COUNT
/variable/CMAKE_MATCH_n /variable/CMAKE_MATCH_n
/variable/CMAKE_MESSAGE_INDENT
/variable/CMAKE_MINIMUM_REQUIRED_VERSION /variable/CMAKE_MINIMUM_REQUIRED_VERSION
/variable/CMAKE_MINOR_VERSION /variable/CMAKE_MINOR_VERSION
/variable/CMAKE_NETRC /variable/CMAKE_NETRC
......
message-indent
--------------
* The :command:`message` command learned indentation control with the new
:variable:`CMAKE_MESSAGE_INDENT` variable.
CMAKE_MESSAGE_INDENT
--------------------
The :command:`message` command joins the strings from this list and for
log levels of ``NOTICE`` and below, it prepends the resultant string to
each line of the message.
Example:
.. code-block:: cmake
list(APPEND listVar one two three)
message(VERBOSE [[Collected items in the "listVar":]])
list(APPEND CMAKE_MESSAGE_INDENT " ")
foreach(item IN LISTS listVar)
message(VERBOSE ${item})
endforeach()
list(POP_BACK CMAKE_MESSAGE_INDENT)
message(VERBOSE "No more indent")
Which results in the following output:
-- Collected items in the "listVar":
-- one
-- two
-- tree
-- No more indent
...@@ -25,7 +25,6 @@ bool cmMessageCommand::InitialPass(std::vector<std::string> const& args, ...@@ -25,7 +25,6 @@ bool cmMessageCommand::InitialPass(std::vector<std::string> const& args,
auto i = args.cbegin(); auto i = args.cbegin();
auto type = MessageType::MESSAGE; auto type = MessageType::MESSAGE;
auto status = false;
auto fatal = false; auto fatal = false;
auto level = cmake::LogLevel::LOG_UNDEFINED; auto level = cmake::LogLevel::LOG_UNDEFINED;
if (*i == "SEND_ERROR") { if (*i == "SEND_ERROR") {
...@@ -55,19 +54,15 @@ bool cmMessageCommand::InitialPass(std::vector<std::string> const& args, ...@@ -55,19 +54,15 @@ bool cmMessageCommand::InitialPass(std::vector<std::string> const& args,
} }
++i; ++i;
} else if (*i == "STATUS") { } else if (*i == "STATUS") {
status = true;
level = cmake::LogLevel::LOG_STATUS; level = cmake::LogLevel::LOG_STATUS;
++i; ++i;
} else if (*i == "VERBOSE") { } else if (*i == "VERBOSE") {
status = true;
level = cmake::LogLevel::LOG_VERBOSE; level = cmake::LogLevel::LOG_VERBOSE;
++i; ++i;
} else if (*i == "DEBUG") { } else if (*i == "DEBUG") {
status = true;
level = cmake::LogLevel::LOG_DEBUG; level = cmake::LogLevel::LOG_DEBUG;
++i; ++i;
} else if (*i == "TRACE") { } else if (*i == "TRACE") {
status = true;
level = cmake::LogLevel::LOG_TRACE; level = cmake::LogLevel::LOG_TRACE;
++i; ++i;
} else if (*i == "DEPRECATION") { } else if (*i == "DEPRECATION") {
...@@ -105,17 +100,46 @@ bool cmMessageCommand::InitialPass(std::vector<std::string> const& args, ...@@ -105,17 +100,46 @@ bool cmMessageCommand::InitialPass(std::vector<std::string> const& args,
auto message = cmJoin(cmMakeRange(i, args.cend()), ""); auto message = cmJoin(cmMakeRange(i, args.cend()), "");
if (type != MessageType::MESSAGE) { if (cmake::LogLevel::LOG_NOTICE <= level) {
// we've overridden the message type, above, so display it directly // Check if any indentation has requested:
cmMessenger* m = this->Makefile->GetMessenger(); // `CMAKE_MESSAGE_INDENT` is a list of "padding" pieces
m->DisplayMessage(type, message, this->Makefile->GetBacktrace()); // to be joined and prepended to the message lines.
} else { auto indent =
if (status) { cmJoin(cmSystemTools::ExpandedListArgument(
this->Makefile->DisplayStatus(message, -1); this->Makefile->GetSafeDefinition("CMAKE_MESSAGE_INDENT")),
} else { "");
// Make every line of the `message` indented
// NOTE Can't reuse `cmDocumentationFormatter::PrintPreformatted`
// here cuz it appends `\n` to the EOM ;-(
cmSystemTools::ReplaceString(message, "\n", "\n" + indent);
message = indent + message;
}
switch (level) {
case cmake::LogLevel::LOG_ERROR:
case cmake::LogLevel::LOG_WARNING:
// we've overridden the message type, above, so display it directly
this->Makefile->GetMessenger()->DisplayMessage(
type, message, this->Makefile->GetBacktrace());
break;
case cmake::LogLevel::LOG_NOTICE:
cmSystemTools::Message(message); cmSystemTools::Message(message);
} break;
case cmake::LogLevel::LOG_STATUS:
case cmake::LogLevel::LOG_VERBOSE:
case cmake::LogLevel::LOG_DEBUG:
case cmake::LogLevel::LOG_TRACE:
this->Makefile->DisplayStatus(message, -1);
break;
default:
assert("Unexpected log level! Review the `cmMessageCommand.cxx`." &&
false);
break;
} }
if (fatal) { if (fatal) {
cmSystemTools::SetFatalErrorOccured(); cmSystemTools::SetFatalErrorOccured();
} }
......
...@@ -52,3 +52,12 @@ run_cmake_command( ...@@ -52,3 +52,12 @@ run_cmake_command(
message-loglevel-trace message-loglevel-trace
${CMAKE_COMMAND} --loglevel=trace -P ${RunCMake_SOURCE_DIR}/message-all-loglevels.cmake ${CMAKE_COMMAND} --loglevel=trace -P ${RunCMake_SOURCE_DIR}/message-all-loglevels.cmake
) )
run_cmake_command(
message-indent
${CMAKE_COMMAND} -P ${RunCMake_SOURCE_DIR}/message-indent.cmake
)
run_cmake_command(
message-indent-multiline
${CMAKE_COMMAND} -P ${RunCMake_SOURCE_DIR}/message-indent-multiline.cmake
)
-- >This is
>the multiline
>message
>
>
-- >This is
>the multiline
>message
# NOTE Use non-space indent string, to check indentation
# of line endings and "empty" lines.
# ALERT Do not put any space characters after the non-space!
list(APPEND CMAKE_MESSAGE_INDENT " >")
set(msg [[This is
the multiline
message]]) # No `\n` at the end!
# NOTE Two empty lines after the text
message(STATUS "${msg}\n\n")
message(STATUS "${msg}")
# This is just to make sure NOTICE messages are also get indented:
# https://gitlab.kitware.com/cmake/cmake/issues/19418#note_588011
message(NOTICE "${msg}")
-- COUNTING:
-- COUNTING_ENGLISH:
-- one
-- two
-- three
-- four
-- five
-- COUNTING_BAHASA:
-- satu
-- dua
-- tiga
-- empat
-- lima
function(debug_list LIST_VAR)
message(STATUS "${LIST_VAR}:")
list(APPEND CMAKE_MESSAGE_INDENT " ")
foreach(_item IN LISTS ${LIST_VAR})
list(LENGTH ${_item} _item_len)
if(_item_len GREATER 1)
debug_list(${_item})
else()
message(STATUS "${_item}")
endif()
endforeach()
endfunction()
list(APPEND COUNTING_ENGLISH one two three four five)
list(APPEND COUNTING_BAHASA satu dua tiga empat lima)
list(APPEND COUNTING COUNTING_ENGLISH COUNTING_BAHASA)
debug_list(COUNTING)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment