我想在CMakeLists.txt中使用消息功能输出彩色文本。也许逃脱序列。 例如
message("\x1b[31m;This text must be in red")
它不起作用。我得到了
中cmake代码中的语法错误
/home/taurus/cmakecolor/CMakeLists.txt:1
解析字符串
时\x1b[31m;This text must be in red
无效的转义序列\ x
答案 0 :(得分:54)
要扩展@ 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
函数,但话虽如此,我也没有发现任何重大问题。
答案 1 :(得分:11)
一个更简单的解决方案可能只是使用CMake的内置功能来发出彩色输出,即这些命令
cmake -E cmake_echo_color --normal hello
cmake -E cmake_echo_color --black hello
cmake -E cmake_echo_color --red hello
cmake -E cmake_echo_color --green hello
cmake -E cmake_echo_color --yellow hello
cmake -E cmake_echo_color --blue hello
cmake -E cmake_echo_color --magenta hello
cmake -E cmake_echo_color --cyan hello
cmake -E cmake_echo_color --white hello
cmake -E cmake_echo_color --red --bold hello
cmake -E cmake_echo_color --red --no-newline hello
从CMake,您可以使用execute_process()
命令来调用${CMAKE_COMMAND}
。你可以写一个方便的功能来做这件事。
cmake_echo_color
与execute_process()
正如@ sjm324所指出的那样
execute_process(COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --red --bold hello)
我的猜测是标准输出没有附加到终端,因此当CMake内部调用isatty()
时,这会失败。
我有两个黑客可以解决这个问题,但如果你关心这个问题,你应该联系CMake开发人员寻找一个不那么脆弱的解决方案
CLICOLOR_FORCE=1
环境变量。execute_process(COMMAND
${CMAKE_COMMAND} -E env CLICOLOR_FORCE=1
${CMAKE_COMMAND} -E cmake_echo_color --red --bold hello
)
这不是一个好主意。如果将构建的输出记录到文件中 它会有转义序列,因为你强迫它们 总是发出。
不要这样做。 HACK 1可能更便携。
execute_process(COMMAND
/usr/bin/tty
OUTPUT_VARIABLE TTY_NAME
OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(COMMAND
${CMAKE_COMMAND} -E cmake_echo_color --red --bold hello
OUTPUT_FILE ${TTY_NAME})
答案 2 :(得分:6)
虽然单调乏味,但您可以定义一个包含转义字符的变量并在消息字符串中使用它
string(ASCII 27 ESCAPE)
message("${ESCAPE}[34mblue${ESCAPE}[0m")