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> будет проигнорирована, сохраняя поведение CMake версии ниже 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.30/command/cmake_policy.html