在C或C++(因此两个标记(项目上调用ninja
时,使用clang
或gcc
编译器,输出不使用ANSI颜色。
例如:
error
应该是红色的,但不是。warning
应该是黄色/橙色,但不是。
所有的东西都是一样的颜色,真的很难判断发生了什么!
为什么会发生这种情况
之所以会发生这种情况,是因为ninja
在内部创建了一个pipe()
,来自编译器的stdout和stderr(在本例中为gcc或clang(将被重新路由。这使得gcc和clang内部的检查失败,后者检查终端(可能支持颜色(。
检查(如isatty(stdout)
(不会返回管道的true
,即使该管道随后再次转发到stdout。
有文件记录
Ninja的常见问题解答在GitHub.com上谈到了这一点,但该常见问题解答未包含在软件中,--help
中未提及,没有忍者手册页,常见搜索引擎(ddg、谷歌(似乎没有找到与颜色相关的常见搜索查询的常见问题。
因此,这篇文章,因为SO有很好的SSO。
修复
将-fdiagnostics-color=always
添加到C或CXX标志中。例如,使用cmake,可以附加-DCMAKE_CXX_FLAGS=-fdiagnostics-color=always
(或CMAKE_C_FLAGS
表示C((或者,如果使用的是cmake 3.24或更高版本,则可以使用CMAKE_COLOR_DIAGNOSTICS
变量或环境变量(。
这适用于gcc(如手册页中所述(和clang(clang的手册页没有提到这个选项,但它包含在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,以及其他支持这一功能的编译器,所以请确保不要使用受此标志影响的编译器。