cmake_policy
Управление настройками политики CMake. См. cmake-policies(7) руководство по определённым политикам.
По мере развития CMake иногда необходимо изменить существующее поведение, чтобы исправить ошибки или улучшить реализацию существующих функций. Механизм политики CMake разработан для помощи в сохранении работоспособности существующих проектов при внедрении новых версий CMake с изменениями поведения. Каждая новая политика (изменение поведения) получает идентификатор вида CMP<NNNN> где <NNNN> — целочисленный индекс. Документация, связанная с каждой политикой, описывает OLD и NEW поведение, а также причину её введения. Проекты могут устанавливать каждую политику для выбора желаемого поведения. Когда CMake необходимо узнать, какое поведение использовать, он проверяет установленное проектом значение. Если значение не доступно, предполагается OLD поведение, и генерируется предупреждение с просьбой установить политику.
Установка политик по версии CMake
Команда cmake_policy используется для установки политик в OLD или NEW поведение. Хотя установка политик по отдельности поддерживается, мы рекомендуем проектам устанавливать политики на основе версий CMake:
-
cmake_policy(VERSION <min>[...<max>])
Новое в версии 3.12: Необязательная версия <max>.
<min> и необязательная <max> — это версии CMake вида major.minor[.patch[.tweak]], а ... — это литеральное значение. Версия <min> должна быть не меньше 2.4 и не больше текущей версии CMake. Версия <max>, если указана, должна быть не меньше версии <min>, но может превышать текущую версию CMake. Если текущая версия CMake старше 3.12, дополнительные точки ... будут восприниматься как разделители компонентов версии, что приведёт к игнорированию части ...<max> и сохранению поведения до 3.12, основанного на <min>.
Это указывает, что текущий код CMake написан для заданного диапазона версий CMake. Все политики, известные текущей версии CMake и введённые в версии <min> (или <max>, если указано) или ранее, будут установлены для использования NEW поведения. Все политики, введённые в более поздних версиях, будут сброшены (если переменная CMAKE_POLICY_DEFAULT_CMP<NNNN> не установит значение по умолчанию). Это фактически запрашивает поведение, предпочтительное по состоянию на определённую версию CMake, и сообщает более новым версиям CMake о предупреждении об их новых политиках.
Обратите внимание, что команда cmake_minimum_required(VERSION) неявным образом вызывает cmake_policy(VERSION) тоже.
Изменено в версии 3.27: Совместимость с версиями CMake, более старыми чем 3.5, устарела. Вызовы cmake_minimum_required(VERSION) или cmake_policy(VERSION), не указывающие как минимум 3.5 как версию политики (необязательно через ...<max>), будут выводить предупреждение об устаревании в CMake 3.27 и выше.
Изменено в версии 3.19: Совместимость с версиями CMake, более старыми чем 2.8.12, устарела. Вызовы cmake_minimum_required(VERSION) или cmake_policy(VERSION), не указывающие как минимум 2.8.12 как версию политики (необязательно через ...<max>), будут выводить предупреждение об устаревании в CMake 3.19 и выше.
Установка политик явно
-
cmake_policy(SET CMP<NNNN> NEW|OLD)
Указать CMake использовать OLD или NEW поведение для данной политики. Проекты, зависящие от старого поведения данной политики, могут заглушить предупреждение о политике, установив состояние политики в OLD. В качестве альтернативы, можно исправить проект, чтобы он работал с новым поведением, и установить состояние политики в NEW.
Примечание
OLD поведение политики deprecated by definition и может быть удалено в будущих версиях CMake.
Проверка настроек политики
-
cmake_policy(GET CMP<NNNN> <variable>)
Проверить, установлено ли данное значение политики в OLD или NEW поведение. Выходное значение <variable> будет OLD или NEW если политика установлена, и пустое в противном случае.
Стек политик CMake
CMake хранит настройки политик в стеке, поэтому изменения, внесенные командой cmake_policy , влияют только на верхнюю часть стека. Новый элемент в стеке политик управляется автоматически для каждого подкаталога, чтобы защитить его родительские и братские каталоги. CMake также управляет новым элементом для скриптов, загруженных командами include() и find_package(), за исключением случаев вызова с параметром NO_POLICY_SCOPE (см. также политику CMP0011). Команда cmake_policy предоставляет интерфейс для управления пользовательскими элементами в стеке политик:
-
cmake_policy(PUSH) -
Создать новый элемент в стеке политик.
-
cmake_policy(POP) -
Удалить последний элемент стека политик, созданный с помощью
cmake_policy(PUSH).
Каждый PUSH должен иметь соответствующий POP для удаления любых изменений. Это полезно для внесения временных изменений в настройки политики. Вызовы команд cmake_minimum_required(VERSION), cmake_policy(VERSION) или cmake_policy(SET) влияют только на текущую вершину стека политик.
Новое в версии 3.25: Команда block(SCOPE_FOR POLICIES) предлагает более гибкий и безопасный способ управления стеком политик. Действие pop выполняется автоматически при выходе из области блока, поэтому нет необходимости предварять каждый return() вызовом cmake_policy(POP).
# stack management with cmake_policy()
function(my_func)
cmake_policy(PUSH)
cmake_policy(SET ...)
if (<cond1>)
...
cmake_policy(POP)
return()
elseif(<cond2>)
...
cmake_policy(POP)
return()
endif()
...
cmake_policy(POP)
endfunction()
# stack management with block()/endblock()
function(my_func)
block(SCOPE_FOR POLICIES)
cmake_policy(SET ...)
if (<cond1>)
...
return()
elseif(<cond2>)
...
return()
endif()
...
endblock()
endfunction()
Команды, созданные командами function() и macro(), записывают настройки политики при их создании и используют предварительно записанные политики при их вызове. Если реализация функции или макроса устанавливает политики, изменения автоматически передаются вверх по вызывающим сторонам до достижения ближайшего вложенного элемента стека политик.
См. также
© 2000–2024 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.28/command/cmake_policy.html