Spec-Zone.ru › CMake 3.12

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

Spec-Zone.ru

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