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.29/command/cmake_policy.html