如何配置 CMake 来生成发出彩色错误和警告的构建系统?

问题描述 投票:0回答:6

有没有办法从 CMake 生成的构建系统中的工具(如

gcc
make
)生成彩色输出(例如诊断消息和状态消息)?

c++ shell cmake
6个回答
9
投票

自 CMake v3.24 起,就有了

CMAKE_COLOR_DIAGNOSTICS
变量。请点击该链接获取最新版本的文档。以下是 3.24.2 文档中的引用:

全程启用颜色诊断。

该变量使用三种状态:

ON
OFF
且未定义。

未定义时:

ON
时:

  • Makefile Generators 默认生成颜色构建系统消息。

    CMAKE_COLOR_MAKEFILE
    未初始化,但可以显式设置为
    OFF
    以禁用颜色构建系统消息。

  • 使用启用颜色诊断的标志来调用 GNU/Clang 编译器 (

    -fcolor-diagnostics
    )。

OFF
时:

  • Makefile Generators 默认情况下不生成颜色构建系统消息。

    CMAKE_COLOR_MAKEFILE
    未初始化,但可以显式设置为
    ON
    以启用颜色构建系统消息。

  • 使用禁用颜色诊断的标志来调用 GNU/Clang 编译器 (

    -fno-color-diagnostics
    )。

如果设置了

CMAKE_COLOR_DIAGNOSTICS
环境变量,则使用其值。否则,默认情况下不会定义
CMAKE_COLOR_DIAGNOSTICS


注意:Ninja Build System + gcc/clang 不输出诊断颜色


6
投票

您想要

cmake
二进制文件的彩色输出吗?为此我不知道任何解决方案。

CMake
可以生成
Makefiles
,提供有关构建过程的详细(且丰富多彩)信息。可以通过以下方式启用此功能:

SET(CMAKE_COLOR_MAKEFILE ON)
# And optionally
SET(CMAKE_VERBOSE_MAKEFILE ON)

如果您想让

gcc
输出着色,请查看
colorgcc
perl 脚本。安装完毕后尝试这样的操作:

CC=/usr/bin/colorgcc cmake .....

或者使用 gfour 的另一个答案中提出的更新的解决方案 - gccfilter


5
投票

现在不需要其他工具了。 GCC 和 Clang 生成颜色输出,但当它们检测到它们正在像 CMake Makefiles 使用的管道中使用时隐藏它。不过他们有标志来强制颜色。

CMakeLists.txt

if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
    add_compile_options(-fdiagnostics-color=always)
elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
    add_compile_options(-fcolor-diagnostics)
endif()

如果您有时通过管道传输 make 的输出,则可以将其放在标志后面。

颜色输出预览:

Example color output

参考: https://medium.com/@alasher/colored-c-compiler-output-with-ninja-clang-gcc-10bfe7f2b949


3
投票

下载gccfilter(需要perl、libregexp和libgetopt-argvfile),然后运行:

gccfilter -c cmake ...

这将使构建过程中的消息着色(我假设是 gcc 消息)。


3
投票

尝试 colout,它旨在为任何命令的输出无缝着色,并附带 g++cmake 主题,您可以一起使用:

make something 2>&1 | colout -t cmake | colout -t g++

除了改进 cmake 颜色方案之外,它甚至在 g++ 打印的代码上应用了 syntax coloring


0
投票

基于此讨论我在

~/.bashrc
中为
make
创建了一个别名:

alias make="make VERBOSE=1 2>&1 | sed -e 's%^.*: error: .*$%\x1b[37;41m&\x1b[m%' -e 's%^.*: warning: .*$%\x1b[30;43m&\x1b[m%'"

这不是一个很好的解决方案,但它确实有效。

© www.soinside.com 2019 - 2024. All rights reserved.