Spec-Zone.ru › CMake 3.17

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. Затем булевы операторы в порядке 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(COMMAND command-name)

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

if(POLICY policy-id)

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

if(TARGET target-name)

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

if(TEST test-name)

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

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

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

if(file1 IS_NEWER_THAN file2)

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

if(IS_DIRECTORY path-to-directory)

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

if(IS_SYMLINK file-name)

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

if(IS_ABSOLUTE path)

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

if(<variable|string> MATCHES regex)

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

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

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

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

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>)

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

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

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

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>)

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

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

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

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

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

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

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

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

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

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

Команда 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 нет, возвращается false без ошибки.
  • Левый и правый аргументы в 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 независимо проверяются на то, являются ли они булевыми константами; если да, они используются как таковые, иначе предполагается, что это переменные, и они разыменовываются.

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

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

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

Spec-Zone.ru

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