From c7a8c9c811678bc7ccfbbfe5013d697ce95fc605 Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 20 Jul 2021 12:56:29 -0400 Subject: cmMessenger: Revert to non-color messages on Windows Since commit 0a0a0f8a74 (cmMessenger: Color messages to terminal by type, 2021-05-18, v3.21.0-rc1~146^2) the message output no longer goes through our custom streambuf on Windows that converts output encoding. This can cause messages to be printed with the wrong encoding in a Windows Console. It also causes messages to have a mix of LF and CRLF newlines because `stderr` converts LF to CRLF but our custom streambuf does not. Revert to using just `cerr` for messages on Windows. Another approach will be needed to achieve color output on Windows later. Fixes: #22444 --- Source/cmakemain.cxx | 11 +++++++++++ Tests/RunCMake/message/RunCMakeTest.cmake | 2 ++ Tests/RunCMake/message/newline-script.cmake | 2 ++ Tests/RunCMake/message/newline-stdout.txt | 2 ++ Tests/RunCMake/message/newline.cmake | 9 +++++++++ 5 files changed, 26 insertions(+) create mode 100644 Tests/RunCMake/message/newline-script.cmake create mode 100644 Tests/RunCMake/message/newline-stdout.txt create mode 100644 Tests/RunCMake/message/newline.cmake diff --git a/Source/cmakemain.cxx b/Source/cmakemain.cxx index 1725375..64d93df 100644 --- a/Source/cmakemain.cxx +++ b/Source/cmakemain.cxx @@ -153,9 +153,20 @@ std::string cmakemainGetStack(cmake* cm) void cmakemainMessageCallback(const std::string& m, const cmMessageMetadata& md, cmake* cm) { +#if defined(_WIN32) + // FIXME: On Windows we replace cerr's streambuf with a custom + // implementation that converts our internal UTF-8 encoding to the + // console's encoding. It also does *not* replace LF with CRLF. + // Since stderr does not convert encoding and does convert LF, we + // cannot use it to print messages. Another implementation will + // be needed to print colored messages on Windows. + static_cast(md); + std::cerr << m << cmakemainGetStack(cm) << "\n"; +#else cmsysTerminal_cfprintf(md.desiredColor, stderr, "%s", m.c_str()); fflush(stderr); // stderr is buffered in some cases. std::cerr << cmakemainGetStack(cm) << "\n"; +#endif } void cmakemainProgressCallback(const std::string& m, float prog, cmake* cm) diff --git a/Tests/RunCMake/message/RunCMakeTest.cmake b/Tests/RunCMake/message/RunCMakeTest.cmake index 0313ed1..1233838 100644 --- a/Tests/RunCMake/message/RunCMakeTest.cmake +++ b/Tests/RunCMake/message/RunCMakeTest.cmake @@ -1,5 +1,7 @@ include(RunCMake) +run_cmake_script(newline) + run_cmake(defaultmessage) run_cmake(nomessage) run_cmake(message-internal-warning) diff --git a/Tests/RunCMake/message/newline-script.cmake b/Tests/RunCMake/message/newline-script.cmake new file mode 100644 index 0000000..e9e3d5d --- /dev/null +++ b/Tests/RunCMake/message/newline-script.cmake @@ -0,0 +1,2 @@ +message(STATUS "one\ntwo") +message("one\ntwo") diff --git a/Tests/RunCMake/message/newline-stdout.txt b/Tests/RunCMake/message/newline-stdout.txt new file mode 100644 index 0000000..beca44e --- /dev/null +++ b/Tests/RunCMake/message/newline-stdout.txt @@ -0,0 +1,2 @@ +-- out='2d2d206f6e650a74776f0a' +-- err='6f6e650a74776f0a' diff --git a/Tests/RunCMake/message/newline.cmake b/Tests/RunCMake/message/newline.cmake new file mode 100644 index 0000000..97afba4 --- /dev/null +++ b/Tests/RunCMake/message/newline.cmake @@ -0,0 +1,9 @@ +execute_process( + COMMAND "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_LIST_DIR}/newline-script.cmake" + OUTPUT_FILE newline-script-stdout.txt + ERROR_FILE newline-script-stderr.txt + ) +foreach(f out err) + file(READ newline-script-std${f}.txt hex HEX) + message(STATUS "${f}='${hex}'") +endforeach() -- cgit v0.12