CMakePushCheckState¶
此模块提供了用于管理影响各种 CMake 检查命令(例如 check_symbol_exists() 等)执行方式的变量状态的命令。
在 CMake 项目中加载此模块,使用
include(CMakePushCheckState)
此模块提供了以下命令,这些命令对于作用域配置非常有用,例如,在 CMake 模块中或在受控环境中执行检查时,确保临时修改仅限于检查的作用域,并且不会传播到构建系统的其他部分。
受影响的变量¶
此模块的命令会保存、重置和恢复以下 CMake 变量:
CMAKE_REQUIRED_FLAGS一个由空格分隔的字符串,包含传递给编译器的附加标志。一个分号分隔的列表将无法正常工作。在编译器命令之前,会自动添加
CMAKE_<LANG>_FLAGS及其关联的特定于配置的CMAKE_<LANG>_FLAGS_<CONFIG>变量的内容。
CMAKE_REQUIRED_DEFINITIONS分号分隔的编译器定义列表,每个定义的形式为
-DFOO或-DFOO=bar。还将自动添加对检查命令的 result variable 参数指定的名称的定义。
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()