信息

记录一条消息。

概要

General messages
  message([<mode>] "message text" ...)

Reporting checks
  message(<checkState> "message text" ...)

Configure Log
  message(CONFIGURE_LOG <text>...)

一般信息

message([<mode>] "message text" ...)

在日志中记录指定的消息文本。如果给出了多个消息字符串,它们将连接成一条消息,字符串之间没有分隔符。

可选的 <mode> 关键字确定消息的类型,这会影响消息的处理方式:

致命错误

CMake Error,停止处理和生成。

cmake(1) 可执行文件将返回一个非零的 exit code

发送错误

CMake 错误,继续处理,但跳过生成。

警告

CMake 警告,继续处理。

AUTHOR_WARNING

CMake Warning (dev),继续处理。

弃用

如果变量 CMAKE_ERROR_DEPRECATEDCMAKE_WARN_DEPRECATED 分别启用,则 CMake 弃用错误或警告,否则没有消息。

(无)或``注意``

打印到 stderr 以引起用户注意的重要消息。

状态

项目用户可能感兴趣的主要有趣消息。理想情况下,这些消息应该简明扼要,不超过一行,但仍能提供信息。

冗长

针对项目用户的详细信息消息。这些消息应提供在大多数情况下不会引起人们兴趣的其他详细信息,但对于那些希望更深入地了解正在发生的事情的构建项目的人员来说,这些信息可能会有用。

调试

详细的信息性消息适用于从事项目本身的开发人员,而不是只想构建项目的用户。这些消息通常不会引起构建项目的其他用户的兴趣,并且通常与内部实现细节密切相关。

追踪

具有非常低级实现细节的细粒度消息。使用此日志级别的消息通常只是临时的,预计会在发布项目、打包文件等之前被删除。

在 3.15 版本加入: 添加了 NOTICEVERBOSEDEBUGTRACE 级别。

CMake 命令行工具在标准输出上显示 STATUSTRACE 消息,消息前面有两个连字符和一个空格。所有其他消息类型都发送到 stderr,并且不以连字符为前缀。 CMake GUI 在其日志区域中显示所有消息。 curses 接口 在状态行上一次一条地显示 STATUSTRACE 消息,并在交互式弹出框中显示其他消息。这些工具的 --log-level 命令行选项可用于控制将显示哪些消息。

在 3.17 版本加入: 要在 CMake 运行之间保持日志级别,可以改为设置 CMAKE_MESSAGE_LOG_LEVEL 变量。请注意,命令行选项优先于缓存变量。

在 3.16 版本加入: 日志级别 NOTICE 及以下的消息将在每一行前面加上 CMAKE_MESSAGE_INDENT 变量的内容(通过连接其列表项转换为单个字符串)。对于 STATUSTRACE 消息,这个缩进内容将被插入到连字符之后。

在 3.17 版本加入: 日志级别 NOTICE 及以下的消息也可以在每一行前面加上 [some.context.example] 形式的上下文。方括号之间的内容是通过将 CMAKE_MESSAGE_CONTEXT 列表变量转换为点分隔字符串获得的。消息上下文将始终出现在任何缩进内容之前,但出现在任何自动添加的前导连字符之后。默认情况下,不显示消息上下文,必须通过提供 cmake --log-context 命令行选项或通过将 CMAKE_MESSAGE_CONTEXT_SHOW 变量设置为 true 来显式启用它。有关使用示例,请参阅 CMAKE_MESSAGE_CONTEXT 文档。

CMake 警告和错误消息文本使用简单的标记语言显示。非缩进文本被格式化为由换行符分隔的换行段落。缩进文本被认为是预先格式化的。

报告检查

在 3.17 版本加入.

CMake 输出中的一个常见模式是一条消息指示某种检查的开始,然后是另一条消息报告该检查的结果。例如:

message(STATUS "Looking for someheader.h")
#... do the checks, set checkSuccess with the result
if(checkSuccess)
  message(STATUS "Looking for someheader.h - found")
else()
  message(STATUS "Looking for someheader.h - not found")
endif()

这可以使用 message() 命令的 CHECK_... 关键字形式更稳健和方便地表达:

message(<checkState> "message" ...)

其中 <checkState> 必须是以下之一:

CHECK_START

记录有关即将执行的检查的简明消息。

检查通过

记录检查的成功结果。

CHECK_FAIL

记录检查不成功的结果。

记录检查结果时,该命令会重复最近开始的尚未报告结果的检查的消息,然后是一些分隔符,然后是“CHECK_PASS”或“CHECK_FAIL”关键字后提供的消息文本.检查消息总是在 STATUS 日志级别报告。

检查可以嵌套,每个 CHECK_START 应该恰好有一个匹配的 CHECK_PASSCHECK_FAIL。如果需要,CMAKE_MESSAGE_INDENT 变量也可用于为嵌套检查添加缩进。例如:

message(CHECK_START "Finding my things")
list(APPEND CMAKE_MESSAGE_INDENT "  ")
unset(missingComponents)

message(CHECK_START "Finding partA")
# ... do check, assume we find A
message(CHECK_PASS "found")

message(CHECK_START "Finding partB")
# ... do check, assume we don't find B
list(APPEND missingComponents B)
message(CHECK_FAIL "not found")

list(POP_BACK CMAKE_MESSAGE_INDENT)
if(missingComponents)
  message(CHECK_FAIL "missing components: ${missingComponents}")
else()
  message(CHECK_PASS "all components found")
endif()

上面的输出将如下所示:

-- Finding my things
--   Finding partA
--   Finding partA - found
--   Finding partB
--   Finding partB - not found
-- Finding my things - missing components: B

配置日志

在 3.26 版本加入.

message(CONFIGURE_LOG <text>...)

使用指定的 <text> 记录 configure-log 消息事件。按照惯例,如果文本包含多行,第一行应该是事件的摘要。

此模式旨在记录系统检查检查或其他由缓存条目保护的一次性操作的详细信息,但不会使用 try_compile()try_run() 执行,它们会自动记录其详细信息.项目应避免在每次 CMake 运行时调用它。例如:

if (NOT DEFINED MY_CHECK_RESULT)
  # Print check summary in configure output.
  message(CHECK_START "My Check")

  # ... perform system inspection, e.g., with execute_process ...

  # Cache the result so we do not run the check again.
  set(MY_CHECK_RESULT "${MY_CHECK_RESULT}" CACHE INTERNAL "My Check")

  # Record the check details in the cmake-configure-log.
  message(CONFIGURE_LOG
    "My Check Result: ${MY_CHECK_RESULT}\n"
    "${details}"
  )

  # Print check result in configure output.
  if(MY_CHECK_RESULT)
    message(CHECK_PASS "passed")
  else()
    message(CHECK_FAIL "failed")
  endif()
endif()

如果当前没有配置任何项目,例如在 cmake -P 脚本模式下,此命令不执行任何操作。

也可以看看

  • cmake_language(GET_MESSAGE_LOG_LEVEL)()