Spec-Zone.ru › CMake 3.7

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, 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 <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 возвращает истину, так что любые зависимые операции сборки будут выполняться в случае ничьей. Это включает случай, когда одно и то же имя файла передается как для 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> 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 <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, 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.

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

Spec-Zone.ru

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