Spec-Zone.ru › CMake 3.9

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

Spec-Zone.ru

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