Spec-Zone.ru › CMake 3.15

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

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

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)

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

Spec-Zone.ru

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