Spec-Zone.ru › CMake 3.6

if

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

if(expression)
  # then section.
  COMMAND1(ARGS ...)
  COMMAND2(ARGS ...)
  ...
elseif(expression2)
  # elseif section.
  COMMAND1(ARGS ...)
  COMMAND2(ARGS ...)
  ...
else(expression)
  # else section.
  COMMAND1(ARGS ...)
  COMMAND2(ARGS ...)
  ...
endif(expression)

Оценивает заданное выражение. Если результат истинный, вызываются команды в разделе THEN. В противном случае вызываются команды в разделе else. Разделы elseif и else являются необязательными. Можно использовать несколько предложений elseif. Обратите внимание, что выражение в разделе else и endif необязательно. Можно использовать длинные выражения, и существует традиционный порядок приоритетов. Вначале вычисляются выражения в скобках, затем унарные тесты, такие как EXISTS, COMMAND, и DEFINED. Затем любые бинарные тесты, такие как EQUAL, LESS, GREATER, STRLESS, STRGREATER, STREQUAL, и MATCHES будут вычислены. Затем булевы NOT операторы и, наконец, булевы AND и затем OR операторы будут вычислены.

Возможные выражения:

if(<constant>)
Истина, если константа равна 1, ON, YES, TRUE, Y, или ненулевое число. Ложь, если константа равна 0, OFF, NO, FALSE, N, IGNORE, NOTFOUND, пустая строка или заканчивается суффиксом -NOTFOUND. Названия булевых констант нечувствительны к регистру. Если аргумент не является одной из этих специфических констант, он обрабатывается как переменная или строка, и используется следующая подпись.
if(<variable|string>)
Истина, если заданной переменной присвоено значение, которое не является ложной константой. Ложь в противном случае. (Обратите внимание, что макроаргументы не являются переменными.)
if(NOT <expression>)
Истина, если выражение не является истинным.
if(<expr1> AND <expr2>)
Истина, если оба выражения считаются истинными индивидуально.
if(<expr1> OR <expr2>)
Истина, если хотя бы одно из выражений считается истинным индивидуально.
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 возвращает true, так что любые зависимые операции сборки будут выполняться в случае ничьей. Это включает случай, когда одно и то же имя файла передается для file1 и file2.
if(IS_DIRECTORY path-to-directory)
Истина, если заданное имя является каталогом. Поведение определено только для полных путей.
if(IS_SYMLINK file-name)
Истина, если заданное имя является символической ссылкой. Поведение определено только для полных путей.
if(IS_ABSOLUTE path)
Истина, если указанный путь является абсолютным.
if(<variable|string> MATCHES regex)
Истина, если значение заданной строки или переменной соответствует заданному регулярному выражению.
if(<variable|string> LESS <variable|string>)
Истина, если значение заданной строки или переменной является допустимым числом и меньше значения справа.
if(<variable|string> GREATER <variable|string>)
Истина, если значение заданной строки или переменной является допустимым числом и больше значения справа.
if(<variable|string> EQUAL <variable|string>)
Истина, если значение заданной строки или переменной является допустимым числом и равно значению справа.
if(<variable|string> STRLESS <variable|string>)
Истина, если значение заданной строки или переменной лексикографически меньше строки или переменной справа.
if(<variable|string> STRGREATER <variable|string>)
Истина, если значение заданной строки или переменной лексикографически больше строки или переменной справа.
if(<variable|string> STREQUAL <variable|string>)
Истина, если значение заданной строки или переменной лексикографически равно строке или переменной справа.
if(<variable|string> VERSION_LESS <variable|string>)
Сравнение версий целочисленных номеров компонент (формат версии major[.minor[.patch[.tweak]]]).
if(<variable|string> VERSION_EQUAL <variable|string>)
Сравнение версий целочисленных номеров компонент (формат версии major[.minor[.patch[.tweak]]]).
if(<variable|string> VERSION_GREATER <variable|string>)
Сравнение версий целочисленных номеров компонент (формат версии major[.minor[.patch[.tweak]]]).
if(<variable|string> IN_LIST <variable>)
Истина, если заданный элемент содержится в именованной переменной списка.
if(DEFINED <variable>)
Истина, если заданная переменная определена. Не имеет значения, истинно или ложно значение переменной, только то, что она была установлена. (Обратите внимание, что макроаргументы не являются переменными.)
if((expression) AND (expression OR (expression)))
Выражения в скобках вычисляются сначала, а затем оставшееся выражение вычисляется так же, как в предыдущих примерах. При наличии вложенных скобок самые внутренние скобки оцениваются как часть оценки содержащего их выражения.

Команда 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 независимо проверяются на определение переменных. Если переменные определены, используются их значения; в противном случае используются исходные значения.
  • Оба левых и правых аргумента STRLESS, STREQUAL, и STRGREATER независимо проверяются на определение переменных. Если переменные определены, используются их значения; в противном случае используются исходные значения.
  • Оба левых и правых аргумента VERSION_LESS, VERSION_EQUAL, и VERSION_GREATER независимо проверяются на определение переменных. Если переменные определены, используются их значения; в противном случае используются исходные значения.
  • Правый аргумент NOT проверяется на предмет того, является ли он булевой константой. Если да, используется значение; в противном случае предполагается, что это переменная, и она дериференцируется.
  • Левый и правый аргументы AND и OR независимо проверяются на предмет того, являются ли они булевыми константами. Если да, они используются как таковые; в противном случае предполагается, что это переменные, и они дериференцируются.

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

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

Spec-Zone.ru

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