Spec-Zone.ru › CMake 3.13

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

Spec-Zone.ru

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