Spec-Zone.ru › CMake 3.27

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(), записывают настройки политик при их создании и используют предварительно записанные политики при их вызове. Если функция или макрос устанавливают политики, изменения автоматически распространяются вверх через вызывающие стороны, пока не достигнут ближайшего вложенного элемента стека политик.

См. также

  • cmake_minimum_required()

© 2000–2024 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.27/command/cmake_policy.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API