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. Определение для имени, указанного в аргументе команды проверки, задающем переменную результата, также добавляется автоматически.
-
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.
Если значение этой переменной является логическим значением true, все сообщения о состоянии, связанные с проверкой, будут подавлены.
-
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()
© 2000–2026 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/latest/module/CMakePushCheckState.html