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) 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–2024 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.27/command/cmake_policy.html