CMP0077
Добавлено в версии 3.13.
option() учитывает обычные переменные.
Команда option() обычно используется для создания записи кэша, чтобы пользователи могли задавать значение параметра. Однако бывают случаи, когда проект до вызова команды option() может определить обычную переменную (не кэшированную) с тем же именем, что и параметр. Например, проект, включающий другой проект в качестве подкаталога, может захотеть жёстко задать параметры подпроекта, чтобы собрать его нужным образом.
По историческим причинам в CMake 3.12 и более ранних версиях команда option() удаляет обычную переменную (не кэшированную) с тем же именем, если:
- запись кэша с указанным именем вообще не существует или
- запись кэша с указанным именем существует, но ей не был задан тип (например, с помощью
-D<name>=ONв командной строке).
В обоих этих случаях (обычно при первом запуске в новом дереве сборки) команда option() задаёт для записи кэша тип BOOL и удаляет любую обычную переменную (не кэшированную) с тем же именем. В оставшемся случае, когда запись кэша с указанным именем уже существует и имеет тип (обычно при последующих запусках в дереве сборки), команда option() ничего не меняет, и любая обычная переменная с тем же именем остаётся заданной.
В CMake 3.13 и более поздних версиях команда option() предпочитает ничего не делать, если обычная переменная с указанным именем уже существует. Она не создаёт и не обновляет запись кэша и не удаляет обычную переменную. Новое поведение одинаково при первом и последующих запусках в дереве сборки. Эта политика обеспечивает совместимость с проектами, которые ещё не были обновлены для учёта нового поведения.
Когда команда option() обнаруживает обычную переменную с указанным именем:
- Поведение
OLDдля этой политики — продолжить работу, даже если существует обычная переменная с тем же именем. Если запись кэша ещё не существует и не имеет типа, она создаётся и/или ей задаётся тип, а обычная переменная удаляется. - Поведение
NEWдля этой политики — ничего не делать, если существует обычная переменная с тем же именем. Обычная переменная не удаляется. Запись кэша не создаётся и не обновляется, а если она существует, то игнорируется.
См. CMP0126 — аналогичную политику для команды set(CACHE), но обратите внимание, что поведение NEW в этих двух политиках несколько различается.
Эта политика была добавлена в CMake версии 3.13. Её можно задать с помощью cmake_policy() или cmake_minimum_required(). Если она не задана, CMake выдаёт предупреждение и использует поведение OLD.
Используйте переменную CMAKE_POLICY_DEFAULT_CMP0077, чтобы задать политику для стороннего проекта в подкаталоге, не изменяя его.
Примечание
Поведение OLD политики по определению считается устаревшим и может быть удалено в будущей версии CMake.
© 2000–2026 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/latest/policy/CMP0077.html