CMakePushCheckState¶
此模块提供了用于管理影响各种 CMake 检查命令(例如,check_symbol_exists() 等)执行方式的变量状态的命令。
在 CMake 项目中加载此模块,使用
include(CMakePushCheckState)
此模块提供了以下命令,这些命令对于作用域配置非常有用,例如,在 CMake 模块中或在受控环境中执行检查时,确保临时修改与检查的作用域隔离,并且不会传播到构建系统的其他部分。
受影响的变量¶
以下 CMake 变量会被此模块的命令保存、重置和恢复。
CMAKE_REQUIRED_FLAGS传递给编译器的附加标志的空格分隔字符串。分号分隔的列表将不起作用。
CMAKE_<LANG>_FLAGS及其关联的特定于配置的CMAKE_<LANG>_FLAGS_<CONFIG>变量的内容会自动预置到编译器命令中,位于此变量内容之前。
CMAKE_REQUIRED_DEFINITIONScompiler 定义的分号分隔列表,每项形式为
-DFOO或-DFOO=bar。检查命令的结果变量参数指定的名称的定义也会被自动添加。
CMAKE_REQUIRED_INCLUDES传递给编译器的头文件搜索路径的分号分隔列表。这些将是唯一使用的头文件搜索路径;
INCLUDE_DIRECTORIES目录属性的内容将被忽略。
CMAKE_REQUIRED_LINK_OPTIONS3.14 版新增。
添加到链接命令的选项的分号分隔列表(有关更多详细信息,请参阅
try_compile())。
CMAKE_REQUIRED_LIBRARIES添加到链接命令的库的分号分隔列表。这些可以是系统库的名称,也可以是 导入的目标(有关更多详细信息,请参阅
try_compile())。
CMAKE_REQUIRED_LINK_DIRECTORIES在版本 3.31 中添加。
传递给链接器的库搜索路径的分号分隔列表(有关更多详细信息,请参阅
try_compile())。
CMAKE_REQUIRED_QUIET版本 3.1 中新增。
如果此变量评估为布尔真值,则与检查关联的所有状态消息都将被抑制。
CMAKE_EXTRA_INCLUDE_FILES3.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()