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.31: Совместимость с версиями CMake, более старыми, чем 3.10, устарела. Вызовы cmake_minimum_required(VERSION) или cmake_policy(VERSION), которые не указывают как минимум 3.10 в качестве версии политики (необязательно через ...<max>), будут генерировать предупреждение об устаревании в CMake 3.31 и выше.
Изменено в версии 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/latest/command/cmake_policy.html