Spec-Zone.ru › CMake

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>[...<policy_max>])

Добавлено в версии 3.12: Необязательная версия <policy_max>.

<min> и необязательная <policy_max> — это версии CMake в формате major.minor[.patch[.tweak]], а ... — буквальная строка. Версия <min> должна быть не ниже 2.4 и не выше текущей версии CMake. Версия <policy_max>, если она указана, должна быть не ниже версии <min>, но может быть выше текущей версии CMake. Если текущая версия CMake старше 3.12, дополнительные точки в ... будут рассматриваться как разделители компонентов версии, в результате чего часть ...<policy_max> будет проигнорирована, сохраняя поведение до версии 3.12, при котором политики основывались на <min>.

Это указывает, что текущий код CMake написан для заданного диапазона версий CMake — <min>[...<policy_max>]. При этом «версия политики» устанавливается в:

  • версию <policy_max> диапазона, если она указана, либо в
  • версию <min>, либо в
  • значение переменной CMAKE_POLICY_VERSION_MINIMUM, если оно выше двух остальных версий.

Версия политики фактически запрашивает поведение, предпочтительное начиная с заданной версии CMake, и сообщает более новым версиям CMake, что следует предупреждать о новых политиках. Для всех политик, известных текущей версии CMake и введённых в версии политики или ранее, будет задано поведение NEW. Для всех политик, введённых в более поздних версиях, состояние останется неопределённым (если только значение по умолчанию не задано переменной CMAKE_POLICY_DEFAULT_CMP<NNNN>).

Примечание

...<policy_max> не означает, что использовать более поздние версии CMake запрещено. Это лишь указывает на самую позднюю версию CMake, для которой проект или модуль активно обновлялся и сопровождался.

Обратите внимание, что команда cmake_minimum_required(VERSION) также неявно вызывает cmake_policy(VERSION).

Изменено в версии 4.0: Поддержка версий CMake старше 3.5 удалена. Вызовы cmake_minimum_required(VERSION) или cmake_policy(VERSION), в которых версия политики не указана как минимум 3.5 (при необходимости через ...<policy_max>), в CMake 4.0 и выше приведут к ошибке.

Изменено в версии 3.31: Поддержка версий CMake старше 3.10 объявлена устаревшей. Вызовы cmake_minimum_required(VERSION) или cmake_policy(VERSION), в которых версия политики не указана как минимум 3.10 (при необходимости через ...<policy_max>), в CMake 3.31 и выше приведут к предупреждению об устаревании.

Изменено в версии 3.27: Поддержка версий CMake старше 3.5 объявлена устаревшей. Вызовы cmake_minimum_required(VERSION) или cmake_policy(VERSION), в которых версия политики не указана как минимум 3.5 (при необходимости через ...<policy_max>), в CMake 3.27 и выше приведут к предупреждению об устаревании.

Изменено в версии 3.19: Поддержка версий CMake старше 2.8.12 объявлена устаревшей. Вызовы cmake_minimum_required(VERSION) или cmake_policy(VERSION), в которых версия политики не указана как минимум 2.8.12 (при необходимости через ...<policy_max>), в CMake 3.19 и выше приведут к предупреждению об устаревании.

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

cmake_policy(SET CMP<NNNN> NEW|OLD)

Указывает CMake использовать поведение OLD или NEW для заданной политики. Проекты, зависящие от старого поведения определённой политики, могут подавить предупреждение о политике, задав для неё состояние OLD. Также можно исправить проект, чтобы он работал с новым поведением, и задать для политики состояние NEW.

Примечание

Поведение OLD для политики по определению считается устаревшим и может быть удалено в будущей версии 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) предоставляет более гибкий и надёжный способ управления стеком политик. Удаление записи выполняется автоматически при выходе из области блока, поэтому перед каждым 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–2026 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/latest/command/cmake_policy.html

Spec-Zone.ru

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