有没有一个好的方式来显示;“干净”;CMake中标准输出上的文本

有没有一个好的方式来显示;“干净”;CMake中标准输出上的文本,cmake,Cmake,Cmake版本2.8.10.2,操作系统centos 6.3 我们正试图从cmake文件中获得标准输出上文本的“干净”显示。也就是说,文本就像我们想要的一样,没有前缀。到目前为止,我已经尝试过这些变化 这是stderr(让我吃惊): 这将转到标准输出,但每行的前缀都是“---”: 这种方法有效,但副作用很奇怪,使我们不喜欢: FILE(WRITE /dev/stdout "my text") 上面提到的是标准输出,但是如果cmake本身的输出被重定向到一个文件(cmake>文件),则会中断,尽

Cmake版本2.8.10.2,操作系统centos 6.3

我们正试图从cmake文件中获得标准输出上文本的“干净”显示。也就是说,文本就像我们想要的一样,没有前缀。到目前为止,我已经尝试过这些变化

这是stderr(让我吃惊):

这将转到标准输出,但每行的前缀都是“---”:

这种方法有效,但副作用很奇怪,使我们不喜欢:

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

上面提到的是标准输出,但是如果cmake本身的输出被重定向到一个文件(cmake>文件),则会中断,尽管如果您首先使用标准输出(cmake | cat>文件)是可以的,但这是一个很难解决的问题,这意味着我们必须告诉所有人不可能发生的解决方法。

您可以提供以下功能:

function(CleanMessage)
  execute_process(COMMAND ${CMAKE_COMMAND} -E echo "${ARGN}")
endfunction()
然后像这样使用它:

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

如果您想将船推出,您甚至可以扩展内置的
消息
选项,以包括一个
清洁
选项:

function(message MessageType)
  if(${ARGV0} STREQUAL "CLEAN")
    execute_process(COMMAND ${CMAKE_COMMAND} -E echo "${ARGN}")
  else()
    _message(${MessageType} "${ARGN}")
  endif()
endfunction()
然后像这样使用它:

CleanMessage("Clean text")
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版本的header guard。

执行\u进程并使用它调用批处理/shell脚本?考虑过它,但我希望找到一个解决方案,在这个解决方案中,我不必担心平台类型。(它现在在Linux上,明天可能是Windows。)我想我可以将cmake本身与
cmake-E echo…
?宾果。这就是诀窍。如果你想回答这个问题,我会检查一下。由于某种原因,我在上面留下我的“宾果”评论时没有看到这个答案。(看起来你是在回答我第一次发表评论的时候,就在黎明时分:-)我真的很喜欢你关于扩展消息的建议(),我可以这样做,谢谢!复制并粘贴您的扩展消息函数,但我得到一个分段错误,除了作为消息类型的CLEAN之外。它不喜欢_消息调用。抱歉-我没有访问CentOS的权限。我已经检查过这在Windows8和Ubuntu12.10上是否有效。我认为可能的原因是函数递归地调用自己。为了避免这种情况,请在顶级CMakeLists.txt中定义函数一次。从CMake邮件列表中查看更完整的信息。嗯,看起来它只定义了一次,但它位于一个包含在许多地方的文件中,所以。。。对于生产来说,这似乎不是一个足够稳定的黑客(我们不能将它放在顶级的CMakeLists.txt文件中,该文件是用户从我们的小文件系统之外提供的)。不过,这可能是一个很好的技巧。@William-我为这个问题添加了一个(更标准的)修复程序。