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

标签 cmake

我想在 CMakeLists.txt 中有消息功能输出彩色文本。也许是一个转义序列。

例如:

message("\x1b[31m;This text must be in red")

它不起作用。我有:

Syntax error in cmake code at

/home/taurus/cmakecolor/CMakeLists.txt:1

when parsing string

\x1b[31m;This text must be in red

Invalid escape sequence \x

最佳答案

为了扩展@grim 的正确答案,您可以通过设置变量来处理各种颜色来使事情变得更方便:

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()

message("This is normal")
message("${Red}This is Red${ColourReset}")
message("${Green}This is Green${ColourReset}")
message("${Yellow}This is Yellow${ColourReset}")
message("${Blue}This is Blue${ColourReset}")
message("${Magenta}This is Magenta${ColourReset}")
message("${Cyan}This is Cyan${ColourReset}")
message("${White}This is White${ColourReset}")
message("${BoldRed}This is BoldRed${ColourReset}")
message("${BoldGreen}This is BoldGreen${ColourReset}")
message("${BoldYellow}This is BoldYellow${ColourReset}")
message("${BoldBlue}This is BoldBlue${ColourReset}")
message("${BoldMagenta}This is BoldMagenta${ColourReset}")
message("${BoldCyan}This is BoldCyan${ColourReset}")
message("${BoldWhite}This is BoldWhite\n\n${ColourReset}")

如果你真的很喜欢推船,你可以更换内置的message使用您自己的功能,根据消息类型对输出进行着色:
function(message)
  list(GET ARGV 0 MessageType)
  if(MessageType STREQUAL FATAL_ERROR OR MessageType STREQUAL SEND_ERROR)
    list(REMOVE_AT ARGV 0)
    _message(${MessageType} "${BoldRed}${ARGV}${ColourReset}")
  elseif(MessageType STREQUAL WARNING)
    list(REMOVE_AT ARGV 0)
    _message(${MessageType} "${BoldYellow}${ARGV}${ColourReset}")
  elseif(MessageType STREQUAL AUTHOR_WARNING)
    list(REMOVE_AT ARGV 0)
    _message(${MessageType} "${BoldCyan}${ARGV}${ColourReset}")
  elseif(MessageType STREQUAL STATUS)
    list(REMOVE_AT ARGV 0)
    _message(${MessageType} "${Green}${ARGV}${ColourReset}")
  else()
    _message("${ARGV}")
  endif()
endfunction()

message("No colour at all.")
message(STATUS "\"Colour\" is spelled correctly.")
message(AUTHOR_WARNING "\"Color\" is misspelled.")
message(WARNING "Final warning: spell \"color\" correctly.")
message(SEND_ERROR "Game over.  It's \"colour\", not \"color\".")
message(FATAL_ERROR "And there's no \"z\" in \"colourise\" either.")

我不能说我建议覆盖内置 message以这种方式运行,但话虽如此,我也没有发现这样做有任何重大问题。

关于cmake - 如何使用cmake获得彩色输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18968979/

相关文章:

c - zlib-1.2.11 是 "too old"- 编译 libzip-1.3.0 需要 1.1.2

CMAKE 字符串选项

ubuntu - 在没有root权限的ubuntu上安装openslide及其依赖openjpeg

c - 如何在 CLion 中添加链接器标志

c++ - CMake:将第三方库链接到项目库

c++ - 如何将正确的库与 GLFW 链接为 cmake 中的外部项目?

c++ - 链接LLVM导致gcov失败

c++ - 如何通过cmake使用-fPIC编译jsoncpp

CMake:find_file() 不递归搜索

c++ - cmake 的 find_package 找不到 boost