CMakePushCheckState

此模块提供了用于管理影响各种 CMake 检查命令(例如,check_symbol_exists() 等)执行方式的变量状态的命令。

在 CMake 项目中加载此模块,使用

include(CMakePushCheckState)

此模块提供了以下命令,这些命令对于作用域配置非常有用,例如,在 CMake 模块中或在受控环境中执行检查时,确保临时修改与检查的作用域隔离,并且不会传播到构建系统的其他部分。

受影响的变量

以下 CMake 变量会被此模块的命令保存、重置和恢复。

CMAKE_REQUIRED_FLAGS

传递给编译器的附加标志的空格分隔字符串。分号分隔的列表将不起作用。 CMAKE_<LANG>_FLAGS 及其关联的特定于配置的 CMAKE_<LANG>_FLAGS_<CONFIG> 变量的内容会自动预置到编译器命令中,位于此变量内容之前。

CMAKE_REQUIRED_DEFINITIONS

compiler 定义的分号分隔列表,每项形式为 -DFOO-DFOO=bar。检查命令的结果变量参数指定的名称的定义也会被自动添加。

CMAKE_REQUIRED_INCLUDES

传递给编译器的头文件搜索路径的分号分隔列表。这些将是唯一使用的头文件搜索路径;INCLUDE_DIRECTORIES 目录属性的内容将被忽略。

CMAKE_REQUIRED_LINK_OPTIONS

3.14 版新增。

添加到链接命令的选项的分号分隔列表(有关更多详细信息,请参阅 try_compile())。

CMAKE_REQUIRED_LIBRARIES

添加到链接命令的库的分号分隔列表。这些可以是系统库的名称,也可以是 导入的目标(有关更多详细信息,请参阅 try_compile())。

CMAKE_REQUIRED_LINK_DIRECTORIES

在版本 3.31 中添加。

传递给链接器的库搜索路径的分号分隔列表(有关更多详细信息,请参阅 try_compile())。

CMAKE_REQUIRED_QUIET

版本 3.1 中新增。

如果此变量评估为布尔真值,则与检查关联的所有状态消息都将被抑制。

CMAKE_EXTRA_INCLUDE_FILES

3.6 版本新增: 之前已被 check_type_size() 命令使用;现在也得到了此模块的支持。

进行检查时要包含的额外头文件分号分隔列表。

注意

其他 CMake 变量,例如 CMAKE_<LANG>_FLAGS,会传播到所有检查,而与此模块提供的命令无关,因为这些基本变量旨在影响构建系统的全局状态。

命令

cmake_push_check_state

将上述变量的当前状态推(保存)到堆栈上。

cmake_push_check_state([RESET])

使用此命令在进行特定检查的临时修改之前保留当前配置。

RESET

如果指定此选项,该命令不仅会保存列出变量的当前状态,还会将其重置为空,从而允许从干净状态重新配置它们。

cmake_reset_check_state

将上面列出的变量的内容重置(清空)为空状态。

cmake_reset_check_state()

当执行多个需要全新配置的顺序检查时,使用此命令,确保不会意外地沿用之前的配置。

cmake_pop_check_state

将上面列出的变量的状态恢复到最近一次调用 cmake_push_check_state() 时的值。

cmake_pop_check_state()

使用此命令可以撤销在检查期间所做的临时更改。为防止意外行为,请将每个 cmake_push_check_state() 与相应的 cmake_pop_check_state() 配对使用。

示例

示例:带编译定义的隔离检查

在以下示例中,对 C 符号 memfd_create() 的检查是在添加了 _GNU_SOURCE 编译定义的情况下进行的,而不会影响全局编译标志。 RESET 选项用于确保在检查之前,与检查相关的变量的任何先前值都被明确清除。

include(CMakePushCheckState)

# Save and reset the current state
cmake_push_check_state(RESET)

# Perform check with specific compile definitions
set(CMAKE_REQUIRED_DEFINITIONS -D_GNU_SOURCE)
include(CheckSymbolExists)
check_symbol_exists(memfd_create "sys/mman.h" HAVE_MEMFD_CREATE)

# Restore the original state
cmake_pop_check_state()

示例:嵌套配置作用域

在以下示例中,变量状态被多次推送到堆栈,从而实现了顺序或嵌套检查。每次调用 cmake_pop_check_state() 都会恢复最近推入的状态。

include(CMakePushCheckState)

# Save and reset the current state
cmake_push_check_state(RESET)

# Perform the first check with additional libraries
set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_DL_LIBS})
include(CheckSymbolExists)
check_symbol_exists(dlopen "dlfcn.h" HAVE_DLOPEN)

# Save current state
cmake_push_check_state()

# Perform the second check with libraries and additional compile definitions
set(CMAKE_REQUIRED_DEFINITIONS -D_GNU_SOURCE)
check_symbol_exists(dladdr "dlfcn.h" HAVE_DLADDR)

message(STATUS "${CMAKE_REQUIRED_DEFINITIONS}")
# Output: -D_GNU_SOURCE

# Restore the previous state
cmake_pop_check_state()

message(STATUS "${CMAKE_REQUIRED_DEFINITIONS}")
# Output here is empty

# Reset variables to prepare for the next check
cmake_reset_check_state()

# Perform the next check only with additional compile definitions
set(CMAKE_REQUIRED_DEFINITIONS -D_GNU_SOURCE)
check_symbol_exists(dl_iterate_phdr "link.h" HAVE_DL_ITERATE_PHDR)

# Restore the original state
cmake_pop_check_state()