Spec-Zone.ru › CMake 3.20

if

Условно выполнить группу команд.

Синопсис

if(<condition>)
  <commands>
elseif(<condition>) # optional block, can be repeated
  <commands>
else()              # optional block
  <commands>
endif()

Оценивает аргумент condition в предложении if в соответствии с синтаксисом условия, описанным ниже. Если результат — истина, то commands в блоке if выполняются. В противном случае обрабатываются необязательные блоки elseif. Наконец, если ни одно condition не является истинным, commands в необязательном блоке else выполняются.

В соответствии со старой версией, команды else() и endif() допускают необязательный аргумент <condition>. Если он используется, он должен быть точным повтором аргумента открывающей команды if.

Синтаксис условия

Следующий синтаксис применяется к аргументу condition в предложениях if, elseif и while().

Составные условия оцениваются в следующем порядке приоритетов: в первую очередь вычисляются внутренние скобки. Затем следуют унарные проверки, такие как EXISTS, COMMAND и DEFINED. Затем бинарные проверки, такие как EQUAL, LESS, LESS_EQUAL, GREATER, GREATER_EQUAL, STREQUAL, STRLESS, STRLESS_EQUAL, STRGREATER, STRGREATER_EQUAL, VERSION_EQUAL, VERSION_LESS, VERSION_LESS_EQUAL, VERSION_GREATER, VERSION_GREATER_EQUAL и MATCHES. Затем булевы операторы в порядке NOT, AND и, наконец, OR.

Основные выражения

if(<constant>)

Истина, если константа равна 1, ON, YES, TRUE, Y, или ненулевому числу. Ложь, если константа равна 0, OFF, NO, FALSE, N, IGNORE, NOTFOUND, пустой строке или заканчивается суффиксом -NOTFOUND. Имена булевых констант нечувствительны к регистру. Если аргумент не является одной из этих конкретных констант, он обрабатывается как переменная или строка, и используется следующий синтаксис.

if(<variable|string>)

Истина, если задана переменная, определённая значением, которое не является ложной константой. Ложь в противном случае. (Обратите внимание, что аргументы макроса не являются переменными.)

Логические операторы

if(NOT <condition>)

Истина, если условие не истинно.

if(<cond1> AND <cond2>)

Истина, если оба условия были бы истинными индивидуально.

if(<cond1> OR <cond2>)

Истина, если хотя бы одно из условий было бы истинным индивидуально.

if((condition) AND (condition OR (condition)))

Условия внутри скобок вычисляются в первую очередь, а затем оставшееся условие вычисляется так же, как и в других примерах. В случае вложенных скобок внутренние вычисляются как часть вычисления условия, которое их содержит.

Проверки существования

if(COMMAND command-name)

Истина, если данное имя является командой, макросом или функцией, которые можно вызвать.

if(POLICY policy-id)

Истина, если данное имя — существующая политика (формата CMP<NNNN>).

if(TARGET target-name)

Истина, если данное имя — существующее логическое имя цели, созданное вызовом команды add_executable(), add_library() или add_custom_target(), которая уже была вызвана (в любом каталоге).

if(TEST test-name)

Новое в версии 3.3: Истина, если данное имя — существующее имя теста, созданное командой add_test().

if(DEFINED <name>|CACHE{<name>}|ENV{<name>})

Истина, если переменная, переменная кэша или переменная среды с данным <name> определена. Значение переменной не имеет значения. Обратите внимание, что аргументы макроса не являются переменными.

Новое в версии 3.14: Добавлена поддержка CACHE{<name>} переменных.

if(<variable|string> IN_LIST <variable>)

Новое в версии 3.3: Истина, если данный элемент содержится в именованной переменной списка.

Операции с файлами

if(EXISTS path-to-file-or-directory)

Истина, если указанный файл или каталог существует. Поведение определено только для явных полных путей (ведущий ~/ не расшифровывается как домашний каталог и считается относительным путём). Разрешает символические ссылки, т.е. если указанный файл или каталог является символической ссылкой, возвращает истину, если целевой объект символической ссылки существует.

if(file1 IS_NEWER_THAN file2)

Истина, если file1 новее file2 или если один из двух файлов не существует. Поведение определено только для полных путей. Если отметки времени файлов совпадают, сравнение IS_NEWER_THAN возвращает истину, чтобы любые зависимые операции сборки произошли в случае ничьей. Это включает случай, когда для file1 и file2 передаётся одно и то же имя файла.

if(IS_DIRECTORY path-to-directory)

Истина, если данное имя — каталог. Поведение определено только для полных путей.

if(IS_SYMLINK file-name)

Истина, если данное имя — символическая ссылка. Поведение определено только для полных путей.

if(IS_ABSOLUTE path)

Истина, если заданный путь — абсолютный.

Сравнения

if(<variable|string> MATCHES regex)

Истина, если заданная строка или значение переменной соответствует заданному условию регулярного выражения. См. Спецификацию регулярных выражений для формата регулярных выражений.

Новое в версии 3.9: () группы захватываются в переменные CMAKE_MATCH_<n>.

if(<variable|string> LESS <variable|string>)

Истина, если заданная строка или значение переменной является допустимым числом и меньше числа справа.

if(<variable|string> GREATER <variable|string>)

Истина, если заданная строка или значение переменной является допустимым числом и больше числа справа.

if(<variable|string> EQUAL <variable|string>)

Истина, если заданная строка или значение переменной является допустимым числом и равно числу справа.

if(<variable|string> LESS_EQUAL <variable|string>)

Новое в версии 3.7: Истина, если заданная строка или значение переменной является допустимым числом и меньше или равно числу справа.

if(<variable|string> GREATER_EQUAL <variable|string>)

Новое в версии 3.7: Истина, если заданная строка или значение переменной является допустимым числом и больше или равно числу справа.

if(<variable|string> STRLESS <variable|string>)

Истина, если заданная строка или значение переменной лексикографически меньше строки или переменной справа.

if(<variable|string> STRGREATER <variable|string>)

Истина, если заданная строка или значение переменной лексикографически больше строки или переменной справа.

if(<variable|string> STREQUAL <variable|string>)

Истина, если заданная строка или значение переменной лексикографически равно строке или переменной справа.

if(<variable|string> STRLESS_EQUAL <variable|string>)

Новое в версии 3.7: Истина, если заданная строка или значение переменной лексикографически меньше или равно строке или переменной справа.

if(<variable|string> STRGREATER_EQUAL <variable|string>)

Новое в версии 3.7: Истина, если заданная строка или значение переменной лексикографически больше или равно строке или переменной справа.

Сравнения версий

if(<variable|string> VERSION_LESS <variable|string>)

Компонентное сравнение целочисленных номеров версий (формат версии major[.minor[.patch[.tweak]]], пропущенные компоненты обрабатываются как ноль). Любой нецелочисленный компонент версии или нецелочисленная конечная часть компонента версии фактически обрезают строку в этой точке.

if(<variable|string> VERSION_GREATER <variable|string>)

Сравнение версий по компонентам (формат версии major[.minor[.patch[.tweak]]], пропущенные компоненты рассматриваются как ноль). Любой нецелый компонент версии или нецелая заключительная часть компонента версии эффективно обрезает строку в этом месте.

if(<variable|string> VERSION_EQUAL <variable|string>)

Сравнение версий по компонентам (формат версии major[.minor[.patch[.tweak]]], пропущенные компоненты рассматриваются как ноль). Любой нецелый компонент версии или нецелая заключительная часть компонента версии эффективно обрезает строку в этом месте.

if(<variable|string> VERSION_LESS_EQUAL <variable|string>)

Новое в версии 3.7: Сравнение версий по компонентам (формат версии major[.minor[.patch[.tweak]]], пропущенные компоненты рассматриваются как ноль). Любой нецелый компонент версии или нецелая заключительная часть компонента версии эффективно обрезает строку в этом месте.

if(<variable|string> VERSION_GREATER_EQUAL <variable|string>)

Новое в версии 3.7: Сравнение версий по компонентам (формат версии major[.minor[.patch[.tweak]]], пропущенные компоненты рассматриваются как ноль). Любой нецелый компонент версии или нецелая заключительная часть компонента версии эффективно обрезает строку в этом месте.

Расширение переменных

Команда if была написана очень рано в истории CMake, до появления синтаксиса оценки переменных ${}, и для удобства оценивает переменные, названные её аргументами, как показано в сигнатурах выше. Обратите внимание, что обычная оценка переменных с помощью ${} применяется до того, как команда if даже получит аргументы. Поэтому код, подобный

set(var1 OFF)
set(var2 "var1")
if(${var2})

предстаёт для команды if как

if(var1)

и оценивается в соответствии с документированным выше случаем if(<variable>). Результат — OFF, что ложно. Однако, если мы удалим ${} из примера, то команда увидит

if(var2)

что истинно, потому что var2 определено как var1, что не является ложной константой.

Автоматическая оценка применяется в других случаях, когда вышеупомянутый синтаксис условия допускает <variable|string>:

  • Аргумент слева от MATCHES сначала проверяется на предмет определения как переменной; если это так, используется значение переменной, в противном случае используется исходное значение.
  • Если левого аргумента к MATCHES нет, возвращается ложь без ошибки.
  • Оба левых и правых аргумента к LESS, GREATER, EQUAL, LESS_EQUAL, и GREATER_EQUAL, независимо проверяются на определение как переменных; если это так, используются их определенные значения, в противном случае используются исходные значения.
  • Оба левых и правых аргумента к STRLESS, STRGREATER, STREQUAL, STRLESS_EQUAL, и STRGREATER_EQUAL, независимо проверяются на определение как переменных; если это так, используются их определенные значения, в противном случае используются исходные значения.
  • Оба левых и правых аргумента к VERSION_LESS, VERSION_GREATER, VERSION_EQUAL, VERSION_LESS_EQUAL, и VERSION_GREATER_EQUAL, независимо проверяются на определение как переменных; если это так, используются их определенные значения, в противном случае используются исходные значения.
  • Правый аргумент к NOT проверяется на предмет того, является ли он булевой константой; если это так, используется значение, в противном случае предполагается, что это переменная, и она де-референсируется.
  • Левый и правый аргументы к AND и OR независимо проверяются на предмет того, являются ли они булевыми константами; если это так, они используются как таковые, в противном случае они предполагаются переменными и де-референсируются.

Изменено в версии 3.1: Для предотвращения неоднозначности, потенциальные имена переменных или ключевых слов могут быть указаны в Цитата аргумента или Аргумент в скобках. Цитируемая или заключённая в скобки переменная или ключевое слово будет интерпретироваться как строка, а не де-референсироваться или интерпретироваться. См. политику CMP0054.

Автоматической оценки для окружения или кэшированных Ссылок на переменные нет. Их значения должны быть указаны как $ENV{<name>} или $CACHE{<name>} везде, где вышеуказанный синтаксис условия допускает <variable|string>.

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

Spec-Zone.ru

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