有没有一种在CMake中在stdout上显示“干净”文本的好方法

时间:2013-04-05 20:21:35

标签: cmake

Cmake版本2.8.10.2,OS centos 6.3

我们正在尝试从我们的cmake文件中的stdout上“清晰”显示文本。也就是说,文本就像我们想要的那样,没有前缀。到目前为止,我已尝试过这些变化

这是stderr(让我感到惊讶):

MESSAGE("my text")

这是stdout,但每行前缀为' - ':

MESSAGE(STATUS "my text")

这种作品,但副作用很奇怪,使我们不受欢迎:

FILE(WRITE /dev/stdout "my text")

以上是stdout,但如果cmake本身的输出被重定向到文件(cmake>文件),则会中断,尽管如果你先管道stdout(cmake | cat>文件)就可以了,但那是hacky并且意味着我们必须告诉每个人有关不会发生的变通方法。

1 个答案:

答案 0 :(得分:6)

您可以提供以下功能:

function(CleanMessage)
  execute_process(COMMAND ${CMAKE_COMMAND} -E echo "${ARGN}")
endfunction()

并像这样使用它:

CleanMessage("Clean text")


如果您想将船推出,您甚至可以扩展内置的message选项以包含CLEAN一个:

function(message MessageType)
  if(${ARGV0} STREQUAL "CLEAN")
    execute_process(COMMAND ${CMAKE_COMMAND} -E echo "${ARGN}")
  else()
    _message(${MessageType} "${ARGN}")
  endif()
endfunction()

并像这样使用它:

message(STATUS "Incidental information")
message(CLEAN "Clean Incidental information")
message(WARNING "CMake Warning, continue processing")

在您的顶级CMakeLists.txt中定义一次是安全的。但是,如果它在例如一个可以包含多次的实用程序文件,它将导致无限递归。为避免这种情况,在定义函数的实用程序文件的开头,添加:

if(OverloadMessageIncluded)
  return()
endif()
set(OverloadMessageIncluded TRUE)

这实际上是一个标题保护的CMake版本。