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()