告诉CMake保持安静

20

在cmake中有没有一种变量可以像传递了-q选项一样使用?这将很好,因为我的构建非常模块化,而且cmake的输出会让它变得混乱。 我正在一个c++项目中使用它。

4个回答

12

从CMake 3.1开始,设置CMAKE_INSTALL_MESSAGE也非常有用。例如,set(CMAKE_INSTALL_MESSAGE LAZY)将跳过-- Up-to-date:消息。


4
也可以设置为set(CMAKE_INSTALL_MESSAGE NEVER)。 - chrisdembia

12

我不知道有任何变量。然而,你可以在顶层的CMakeLists.txt文件(在project命令之前)添加以下hack来控制输出:

function(message)
  list(GET ARGV 0 MessageType)
  if(MessageType STREQUAL FATAL_ERROR OR
     MessageType STREQUAL SEND_ERROR OR
     MessageType STREQUAL WARNING OR
     MessageType STREQUAL AUTHOR_WARNING)
    list(REMOVE_AT ARGV 0)
    _message(${MessageType} "${ARGV}")
  endif()
endfunction()

这将覆盖CMake内置的message命令,并抑制所有STATUS和未指定类型的消息,使更重要的类型能够正确输出。

例如,WARNING消息的输出将会改变:

CMake Warning at CMakeLists.txt:14 (message):
  This is a dummy warning message.

为了

CMake Warning at CMakeLists.txt:8 (_message):
  This is a dummy warning message.
Call Stack (most recent call first):
  CMakeLists.txt:14 (message)
请注意,警告信息生成的实际行在调用堆栈中列出,而不是输出消息的第一行。
最后,这对指示配置尝试成功或失败的摘要输出没有影响。

太酷了!那么你可以发送任何类型的消息,对吧? - alexmherrmann
有没有办法停止那个调用堆栈的东西?谢谢回答! - alexmherrmann
@alexhairyman,不是很必要,但是你需要它来跟踪错误/警告的实际来源。如果你不想看到任何错误/警告,你可以剥离function主体内的所有内容,这样message就变成了一个无操作。或者只留下if中的错误类型,忽略警告。 - Fraser

2

对于CMake的安装部分,它通常会针对每个文件打印一行信息(例如:-- Up-to-date: /some/destination/path-- Installing: /some/destination/path),您可以执行以下操作:

set(CMAKE_INSTALL_MESSAGE LAZY)  # Don't tell us about up-to-date files.

这不会为已经存在的文件打印输出(如果您在开发过程中多次运行安装程序,可能会出现这种情况),甚至

set(CMAKE_INSTALL_MESSAGE NEVER)  # Install silently.

自CMake 3.1版本以来,此选项已存在


1

对我来说没有改变任何事情。 - Andrew Mackenzie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接