Spec-Zone.ru › CMake 3.26

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) тоже.

Явное указание политик

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() предлагают более гибкий и безопасный способ управления стеком политик. Действие удаления выполняется автоматически при выполнении команды 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–2023 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.26/command/cmake_policy.html

Spec-Zone.ru

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