用过 Ninja 的静默编译模式后,感觉我们原来的 CMake 系统编译时的输出实在太多了,导致编译时看报错挺不方便的,在读取和处理编译日志时也容易因为日志过大产生问题。因此这次给 CMake 编译输出做了个 “瘦身”。

# 1. 原编译输出

原来的编译输出大概长这样:

origin

可以看到有很多 “Entering directory”、“Leaving directory” 和 “Building CXX object” 的输出非常多,当工程量比较大时,这些输出其实是比较没用的。

# 2. 去除 “Building CXX object” 日志

set_property(GLOBAL PROPERTY RULE_MESSAGES OFF)

RULE_MESSAGES 设置为 off 以后,就可以屏蔽这些被编译文件的日志了:

building

最后把这个这个开关使用环境变量控制并输出个启用的日志(顺便记录下 cmake 中颜色输出的函数):

if(NOT WIN32)
  string(ASCII 27 Esc)
  set(ColourReset "${Esc}[m")
  set(ColourBold  "${Esc}[1m")
  set(Red         "${Esc}[31m")
  set(Green       "${Esc}[32m")
  set(Yellow      "${Esc}[33m")
  set(Blue        "${Esc}[34m")
  set(Magenta     "${Esc}[35m")
  set(Cyan        "${Esc}[36m")
  set(White       "${Esc}[37m")
  set(BoldRed     "${Esc}[1;31m")
  set(BoldGreen   "${Esc}[1;32m")
  set(BoldYellow  "${Esc}[1;33m")
  set(BoldBlue    "${Esc}[1;34m")
  set(BoldMagenta "${Esc}[1;35m")
  set(BoldCyan    "${Esc}[1;36m")
  set(BoldWhite   "${Esc}[1;37m")
endif()
if($ENV{CMAKE_SLIENT} MATCHES "on")
  message("${BoldMagenta}slient mode${ColourReset}")
  set_property(GLOBAL PROPERTY RULE_MESSAGES OFF)
endif()

print

# 3. 去除 “directory” 相关日志

> make -j64 --no-print-directory

在 make 时,加上 --no-print-directory 参数,便可以把 “directory” 相关的日志屏蔽了:

directory

可以把这个参数加进环境变量 MAKEFLAGS 中,就可以不用每次加了:

export MAKEFLAGS='--no-print-directory'

# 4. 报错染色

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-color=always")

cmake 默认的报错警告等日志是没有颜色的,可以加上 -fdiagnostics-color=always 参数,error 就会带颜色了:

error

# 参考资料

  • How to customize cmake output

  • cmake: How to suppress “Entering directory” messages?

  • Color output of compiler warnings and errors show incorrectly in Output panel and are not parsed for Problems panel

  • 如何使用 cmake 获得彩色输出?

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Nirvana 支付宝

支付宝