Spec-Zone.ru › CMake 3.8

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)

Оценивает заданное выражение. Если результат — true, вызываются команды в секции 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>)
True, если константа равна 1, ON, YES, TRUE, Y, или ненулевому числу. False, если константа равна 0, OFF, NO, FALSE, N, IGNORE, NOTFOUND, пустой строке или заканчивается на суффикс -NOTFOUND. Имена булевых констант нечувствительны к регистру. Если аргумент не является одной из этих специальных констант, он обрабатывается как переменная или строка, и используется следующая сигнатура.
if(<variable|string>)
True, если заданная переменная определена и имеет значение, отличное от ложной константы. False в противном случае. (Примечание: аргументы макросов не являются переменными.)
if(NOT <expression>)
True, если выражение не равно true.
if(<expr1> AND <expr2>)
True, если оба выражения истинны.
if(<expr1> OR <expr2>)
True, если хотя бы одно из выражений истинно.
if(COMMAND command-name)
True, если указанное имя является командой, макросом или функцией, которые можно вызвать.
if(POLICY policy-id)
True, если указанное имя является существующей политикой (формата CMP<NNNN>).
if(TARGET target-name)
True, если указанное имя является существующим логическим именем целевого объекта, созданным вызовом команды add_executable(), add_library() или add_custom_target() (в любом каталоге).
if(TEST test-name)
True, если указанное имя является существующим именем теста, созданным командой add_test().
if(EXISTS path-to-file-or-directory)
True, если указанный файл или каталог существует. Поведение определено только для полных путей.
if(file1 IS_NEWER_THAN file2)
True, если file1 является более новым, чем file2 или если один из двух файлов не существует. Поведение определено только для полных путей. Если метки времени файлов совпадают, сравнение IS_NEWER_THAN возвращает true, так что любые зависимые операции сборки будут выполняться в случае ничьи. Это включает случай, когда в качестве file1 и file2 передаётся одно и то же имя файла.
if(IS_DIRECTORY path-to-directory)
True, если указанное имя — это каталог. Поведение определено только для полных путей.
if(IS_SYMLINK file-name)
True, если указанное имя — это символическая ссылка. Поведение определено только для полных путей.
if(IS_ABSOLUTE path)
True, если указанный путь — это абсолютный путь.
if(<variable|string> MATCHES regex)
True, если значение заданной строки или переменной соответствует заданному регулярному выражению.
if(<variable|string> LESS <variable|string>)
True, если значение заданной строки или переменной является допустимым числом и меньше, чем значение справа.
if(<variable|string> GREATER <variable|string>)
True, если значение заданной строки или переменной является допустимым числом и больше, чем значение справа.
if(<variable|string> EQUAL <variable|string>)
True, если значение заданной строки или переменной является допустимым числом и равно значению справа.
if(<variable|string> LESS_EQUAL <variable|string>)
True, если значение заданной строки или переменной является допустимым числом и меньше или равно значению справа.
if(<variable|string> GREATER_EQUAL <variable|string>)
True, если значение заданной строки или переменной является допустимым числом и больше или равно значению справа.
if(<variable|string> STRLESS <variable|string>)
True, если значение заданной строки или переменной лексикографически меньше, чем строка или переменная справа.
if(<variable|string> STRGREATER <variable|string>)
True, если значение заданной строки или переменной лексикографически больше, чем строка или переменная справа.
if(<variable|string> STREQUAL <variable|string>)
True, если значение заданной строки или переменной лексикографически равно строке или переменной справа.
if(<variable|string> STRLESS_EQUAL <variable|string>)
True, если значение заданной строки или переменной лексикографически меньше или равно строке или переменной справа.
if(<variable|string> STRGREATER_EQUAL <variable|string>)
True, если значение заданной строки или переменной лексикографически больше или равно строке или переменной справа.
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>)
True, если заданный элемент содержится в переменной списка с указанным именем.
if(DEFINED <variable>)
True, если заданная переменная определена. Не имеет значения, истинна или ложна переменная, важно лишь, что она установлена. (Примечание: аргументы макросов не являются переменными.)
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 отсутствует, то возвращается 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.

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

Spec-Zone.ru

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