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

5
当在使用clanggcc编译器的C或C++项目上调用ninja时,输出不会带有ANSI颜色。
例如: error应该是红色的,但实际上并不是。 warning应该是黄色/橙色的,但实际上并不是。
所有内容都是相同的颜色,很难知道发生了什么!
2个回答

8

为什么会发生这种情况

这是因为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等支持此标志的编译器-因此,请确保不要使用无法处理此标志的编译器。


1
是的,这在手册和常见问题解答中都有。你为什么认为它值得在这里发布? - 273K
@273K 我的帖子涵盖了这一点:"常见搜索引擎(ddg,google)似乎无法找到与颜色相关的常见搜索查询的FAQ"。 - lionkor
1
不幸的是,最近这些天在使用Ninja和Apple Clang时,无论是-fdiagnostics-color=always还是所谓的clang等效选项-fcolor-diagnostics,都没有任何作用。 - oarfish
或许这与ccache有关,谁知道呢。无论如何,在macOS上似乎不可能同时使用cmake、ninja、ccache和color。 - oarfish
对于我来说,在 Linux 上直接在 zsh shell 中调用时,-fdiagnostics-color=always 对于 gcc 12.2.1 和 clang 15.0.7 都有效,但是当使用 ninja 时,只对 gcc 有效,而对于 clang 则无效(我可以在调用中看到 -fdiagnostics-color=always)。 - Emile Vrijdags

0
Windows 10 增加了对 ANSI 转义码的支持。
-fansi-escape-codes

-fcolor-diagnostics

LLVM(Clang)在Windows上的支持始于:

since

-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


忍者应该处理它:

ninja test


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接