message¶
记录一条消息。
概要¶
General messages message([<mode>] "message text" ...) Reporting checks message(<checkState> "message text" ...) Configure Log message(CONFIGURE_LOG <text>...)
通用消息¶
message([<mode>] "message text" ...)
将指定的消息文本记录到日志中。如果给出多个消息字符串,则将它们连接成一个单一的消息,字符串之间没有分隔符。
可选的 <mode> 关键字决定了消息的类型,这会影响消息的处理方式
FATAL_ERRORCMake 错误,停止处理和生成。
SEND_ERRORCMake 错误,继续处理,但跳过生成。
WARNINGCMake 警告,继续处理。
AUTHOR_WARNINGCMake 警告 (dev),继续处理。
DEPRECATION如果变量
CMAKE_ERROR_DEPRECATED或CMAKE_WARN_DEPRECATED已启用,则分别为 CMake 弃用错误或警告,否则不显示消息。- (none) 或
NOTICE 打印到 stderr 的重要消息,以吸引用户注意。
STATUS项目用户可能感兴趣的主要有趣消息。理想情况下,这些消息应该简洁,不超过单行,但仍具有信息量。
VERBOSE为项目用户提供的详细信息性消息。这些消息应提供大多数情况下不感兴趣的额外详细信息,但对于构建项目的用户来说,当他们想要更深入地了解正在发生的事情时,这些消息可能会很有用。
DEBUG为处理项目本身的开发者而不是仅希望构建它的用户提供的详细信息性消息。这些消息通常不会引起构建项目的其他用户的兴趣,并且通常与内部实现细节密切相关。
TRACE带有非常底层实现细节的细粒度消息。使用此日志级别的消息通常只是暂时的,并且预计在发布项目、打包文件等之前会被删除。
3.15 版新增: 添加了 NOTICE、VERBOSE、DEBUG 和 TRACE 级别。
CMake 命令行工具将 STATUS 到 TRACE 消息显示在 stdout 上,并在消息前加上两个连字符和一个空格。所有其他消息类型都发送到 stderr,并且前面没有连字符。 CMake GUI 在其日志区域显示所有消息。 curses 界面 在状态行上一次显示 STATUS 到 TRACE 消息,并在交互式弹出框中显示其他消息。这些工具的 --log-level 命令行选项可用于控制显示哪些消息。
3.17 版新增: 要使日志级别在 CMake 运行之间持久存在,可以改用设置 CMAKE_MESSAGE_LOG_LEVEL 变量。请注意,命令行选项优先于缓存变量。
3.16 版新增: 日志级别为 NOTICE 及更低级别的消息,每行前面都会加上 CMAKE_MESSAGE_INDENT 变量的内容(通过连接其列表项转换为单个字符串)。对于 STATUS 到 TRACE 消息,此缩进内容将插入到连字符之后。
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_PASS记录检查的成功结果。
CHECK_FAIL记录检查的失败结果。
在记录检查结果时,命令会重复最近开始但尚未报告结果的检查的消息,然后是一些分隔符字符,然后是 CHECK_PASS 或 CHECK_FAIL 关键字后面的消息文本。检查消息始终以 STATUS 日志级别报告。
检查可以嵌套,每个 CHECK_START 都应恰好有一个匹配的 CHECK_PASS 或 CHECK_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 脚本模式下,此命令无效。