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) тоже.
Явное задание политик
cmake_policy(SET CMP<NNNN> NEW) cmake_policy(SET CMP<NNNN> 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)
Каждый PUSH должен иметь соответствующий POP для удаления любых изменений. Это полезно для временного изменения настроек политик. Вызовы команд cmake_minimum_required(VERSION), cmake_policy(VERSION), или cmake_policy(SET) влияют только на текущий верхний элемент стека политик.
Новое в версии 3.25: Команды block() и endblock() предлагают более гибкий и безопасный способ управления стеком политик. Действие «pop» выполняется автоматически при выполнении команды endblock(), поэтому избегается вызов команды cmake_policy(POP) перед каждой командой return().
# 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–2022 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.25/command/cmake_policy.html