【发布时间】:2022-08-14 15:11:08
【问题描述】:
在调用 ninja 时C 或 C++(因此两个标签)项目,使用 clang 或 gcc 编译器,输出不使用 ANSI 颜色着色。
例如:
error 应该是红色的,但不是。
warning 应该是黄色/橙色,但不是。
一切都是一样的颜色,真的很难说是怎么回事!
在调用 ninja 时C 或 C++(因此两个标签)项目,使用 clang 或 gcc 编译器,输出不使用 ANSI 颜色着色。
例如:
error 应该是红色的,但不是。
warning 应该是黄色/橙色,但不是。
一切都是一样的颜色,真的很难说是怎么回事!
发生这种情况是因为ninja 在内部创建了一个pipe(),来自编译器的stdout 和stderr(在这种情况下为gcc 或clang)被重新路由。这使得检查终端(可能支持颜色)的 gcc 和 clang 内的检查失败。
诸如isatty(stdout) 之类的检查不会为管道返回true,即使该管道随后再次转发到标准输出。
Ninja's FAQ talks about this on GitHub.com,但这个常见问题解答是不包含使用该软件,在--help 中没有提到,没有忍者手册页,常见的搜索引擎(ddg、google)似乎没有找到与颜色相关的常见搜索查询的常见问题解答。
因此,这篇文章,因为 SO 具有良好的 SSO。
将 -fdiagnostics-color=always 添加到您的 C 或 CXX 标志。例如,使用 cmake,您可以附加 -DCMAKE_CXX_FLAGS=-fdiagnostics-color=always(或 C 的 CMAKE_C_FLAGS)。
这适用于 gcc(如其手册页中所述)和 clang(clang 的手册页未提及此选项,但它包含在他们的 command line reference on llvm.org 中。
作为永久性修复,您可以将以下内容附加到您的 .zshrc、.bashrc 或类似内容中:
# force C colored diagnostic output
export CFLAGS="${CFLAGS} -fdiagnostics-color=always"
# force C++ colored diagnostic output
export CXXFLAGS="${CXXFLAGS} -fdiagnostics-color=always"
export CCFLAGS="${CCFLAGS} -fdiagnostics-color=always"
# force C, C++, Cpp (pre-processor) colored diagnostic output
export CPPFLAGS="${CPPFLAGS} -fdiagnostics-color=always"
仅当您知道永远不需要将编译器的输出通过管道传输到其他任何地方时,您才应该这样做。此外,这仅适用于 clang 和 gcc 以及其他支持此功能的编译器 - 因此请确保您不要使用会阻塞此标志的编译器。
【讨论】: