Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用cmake获得彩色输出?_Cmake - Fatal编程技术网

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

如何使用cmake获得彩色输出?,cmake,Cmake,我想在CMakeLists.txt中使用消息函数,输出彩色文本。也许是一个逃跑序列 例如: message("\x1b[31m;This text must be in red") 它不起作用。我得到: 虽然繁琐,但您可以定义一个包含转义字符的变量,并在消息字符串中使用它 string(ASCII 27 ESCAPE) message("${ESCAPE}[34mblue${ESCAPE}[0m") 为了扩展@grim的正确答案,您可以通过设置变量来处理各种颜色,使事情变得更加方便: if(

我想在
CMakeLists.txt
中使用消息函数,输出彩色文本。也许是一个逃跑序列

例如:

message("\x1b[31m;This text must be in red")
它不起作用。我得到:


虽然繁琐,但您可以定义一个包含转义字符的变量,并在消息字符串中使用它

string(ASCII 27 ESCAPE)
message("${ESCAPE}[34mblue${ESCAPE}[0m")

为了扩展@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}")
如果你真的想把船推出,你可以用你自己的功能取代内置的
消息
功能,该功能根据消息类型为输出着色:

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.")

我不能说我建议用这种方式重写内置的
消息
函数,但是,尽管如此,我也没有发现这样做有任何主要问题。

一个更简单的解决方案可能只是使用CMake的内置功能来发出彩色输出,即这些命令

不同颜色 粗体文本 没有新线 在CMake中,您可以使用
execute\u process()
命令调用
${CMake\u command}
。您可以编写一个方便的函数来执行此操作

更新:使用
cmake\u echo\u color
execute\u process()
正如@sjm324所指出的

execute_process(COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --red --bold hello)
不起作用。看看实施情况

我的猜测是,标准输出没有连接到终端,因此当CMake在内部调用
isatty()
时,这会失败

我有两个方法可以解决这个问题,但是如果你真的关心这个问题,你应该联系CMake开发者,寻求一个不那么脆弱的解决方案

HACK 1:Set
CLICOLOR\u FORCE=1
环境变量。 这不是一个好主意。如果将生成的输出记录到文件中 它会有转义序列,因为你强迫他们转义 总是发射

HACK 2:将OUTPUT_文件设置为TTY 不要这样做。黑客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})

错误是因为您没有逃过反斜杠。应该是
消息(\\x1b[31m;红色”)
,但这仍然不起作用…使用
cmake-E echo也不行。我不认为只使用cmake就行,你可能需要调用一个外部命令,比如
echo
。如果编辑器允许,添加一个文本转义对我来说很好。例如,在vim插入模式下键入
ctrl-v
,然后键入e> 转义
,您将得到一个字符^[。查找cmake将实际遵守的转义序列。这对于cmake模块来说似乎是个好主意;)另外,win32检查的操作也很好。scape序列中是否有错误?该示例适用于我,因为更改了颜色。我的工作scape序列已设置(ColorReset“${Esc}[0m”)至少在Windows中使用0(在python子流程和colorama下运行,它可能使用不同的scape?)@drodri我只在Linux上测试过这个,我想你可能是对的。很好!似乎可以使用消息函数,但是,我不确定cmake使用什么函数来打印输出,因为它们的输出不受影响。从Windows 10 th2开始,ANSI转义序列本机受支持。但是,cmake在cmd中仍然存在一些问题,即防止它产生彩色输出(即使批处理文件工作正常)。这不起作用,例如,
execute\u进程(COMMAND${CMAKE\u COMMAND}-e CMAKE\u echo\u color--red--bold hello)
将去除其颜色。如果它对您有效,请用您所做的内容更新您的答案?@sjm324是。
execute\u进程(…)
由于标准输出未连接到终端,因此无法正常工作。不过,我有一些黑客可以做到这一点。哈!哈哈,很好,这绝对是黑客:)STDOUT未被附加是关键。感谢您的解释!一个更好的方法是设置
输出文件/dev/STDOUT ERROR\u文件/dev/stderr
。然后它从父进程继承文件描述符,并且应该正确地确定它是否是tty。虽然我不希望它能够移植,但不确定它的可移植性比黑客2更糟糕。
cmake -E cmake_echo_color --red --bold hello
cmake -E cmake_echo_color --red --no-newline hello
execute_process(COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --red --bold hello)
execute_process(COMMAND 
  ${CMAKE_COMMAND} -E env CLICOLOR_FORCE=1
    ${CMAKE_COMMAND} -E cmake_echo_color --red --bold hello
)
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})