summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2021-07-20 12:56:29 -0400
committerBrad King <brad.king@kitware.com>2021-07-20 13:30:11 -0400
commitc7a8c9c811678bc7ccfbbfe5013d697ce95fc605 (patch)
treec524f300b78aa14a183f13cfb24fb1d1e1b45751 /Source
parent31ecd3718047874b5eeb939e9608fa1bd386c1a7 (diff)
downloadcmake-c7a8c9c811678bc7ccfbbfe5013d697ce95fc605.tar.gz
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
Diffstat (limited to 'Source')
-rw-r--r--Source/cmakemain.cxx11
1 files changed, 11 insertions, 0 deletions
diff --git a/Source/cmakemain.cxx b/Source/cmakemain.cxx
index 1725375d95..64d93df7fc 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<void>(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)