Spec-Zone.ru › CMake 3.29

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

См. также

  • cmake_minimum_required()

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

Spec-Zone.ru

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