忍者构建系统 + gcc/clang 不输出诊断颜色



C或C++(因此两个标记(项目上调用ninja时,使用clanggcc编译器,输出不使用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,以及其他支持这一功能的编译器,所以请确保不要使用受此标志影响的编译器。

最新更新