Spec-Zone.ru › CMake 3.10

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

Spec-Zone.ru

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