clang
或gcc
编译器的C或C++项目上调用ninja
时,输出不会带有ANSI颜色。例如:
error
应该是红色的,但实际上并不是。
warning
应该是黄色/橙色的,但实际上并不是。所有内容都是相同的颜色,很难知道发生了什么!
这是因为ninja
在内部创建了一个pipe()
,将编译器(在此情况下为gcc或clang)的stdout和stderr重新路由。这使得gcc和clang内部的检查失败,它们检查终端是否支持颜色。
例如,isatty(stdout)
这样的检查不会对管道返回true
,即使该管道随后再次转发到stdout。
Ninja的常见问题解答在GitHub.com上讨论了这个问题,但是该FAQ未包含在该软件中,也没有在--help
中提到,没有ninja manpages,并且常见搜索引擎(ddg、google)似乎无法针对与颜色相关的常见搜索查询找到该FAQ。
因此,发布本文,因为SO具有良好的SSO。
在您的C或CXX标志中添加-fdiagnostics-color=always
。例如,使用cmake,您可以附加-DCMAKE_CXX_FLAGS=-fdiagnostics-color=always
(或CMAKE_C_FLAGS用于C)(或者,如果您使用的是CMake 3.24或更高版本,则可以使用CMAKE_COLOR_DIAGNOSTICS变量或环境变量)。
这适用于gcc(如其manpage中所述)和clang(clang的manpages未提及此选项,但它包含在他们的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等支持此标志的编译器-因此,请确保不要使用无法处理此标志的编译器。
-fansi-escape-codes
-fcolor-diagnostics
-fansi-escape-codes
Controls whether ANSI escape codes are used instead of the Windows Console API to output colored diagnostics. This option is only used on Windows and defaults to off.
https://clang.llvm.org/docs/UsersManual.html#cmdoption-fansi-escape-codes
-fdiagnostics-color=always
还是所谓的clang等效选项-fcolor-diagnostics
,都没有任何作用。 - oarfish-fdiagnostics-color=always
对于 gcc 12.2.1 和 clang 15.0.7 都有效,但是当使用 ninja 时,只对 gcc 有效,而对于 clang 则无效(我可以在调用中看到-fdiagnostics-color=always
)。 - Emile Vrijdags