Spec-Zone.ru › CMake 3.5

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.5/command/if.html

Spec-Zone.ru

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