CMakePushCheckState

此模組提供巨集來管理影響各種 CMake 檢查命令(例如,check_symbol_exists() 等)執行方式的變數狀態。這些巨集會儲存、重設和還原以下變數

  • CMAKE_REQUIRED_FLAGS

  • CMAKE_REQUIRED_DEFINITIONS

  • CMAKE_REQUIRED_INCLUDES

  • CMAKE_REQUIRED_LINK_OPTIONS

  • CMAKE_REQUIRED_LIBRARIES

  • CMAKE_REQUIRED_LINK_DIRECTORIES

  • CMAKE_REQUIRED_QUIET

  • CMAKE_EXTRA_INCLUDE_FILES

巨集

cmake_push_check_state

將上述變數的目前狀態儲存(推入)到堆疊中。這通常用於在為特定檢查進行臨時修改之前,保留目前的配置。

cmake_push_check_state([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() 配對。

這些巨集對於範圍配置非常有用,例如,在 尋找模組 中,或在受控環境中執行檢查時,確保臨時修改被隔離在檢查範圍內,並且不會傳播到建置系統的其他部分。

注意

其他 CMake 變數,例如 CMAKE_<LANG>_FLAGS,會傳播到所有檢查,而與這些巨集無關,因為這些基本變數旨在影響建置系統的整體狀態。

範例

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