Spec-Zone.ru › CMake 3.11

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, если выражение не является истинным.
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, если значение заданной строки или переменной соответствует заданному регулярному выражению. См. Спецификацию регулярных выражений для формата регулярных выражений. Группы () захватываются в переменные CMAKE_MATCH_<n>.
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, если заданная переменная определена. Неважно, true или false её значение, важно лишь, что она установлена. (Обратите внимание, что аргументы макроса не являются переменными.)
if((expression) AND (expression OR (expression)))
Выражения в скобках оцениваются в первую очередь, а затем оставшееся выражение оценивается, как в предыдущих примерах. Там, где есть вложенные скобки, самые внутренние оцениваются как часть оценки содержащего их выражения.

Команда if была написана очень рано в истории CMake, до появления синтаксиса оценки переменной ${}, и для удобства оценивает переменные, имена которых заданы её аргументами, как показано в вышеуказанных подписях. Обратите внимание, что обычная оценка переменных с ${} применяется до того, как команда if даже получит аргументы. Поэтому код вида:

set(var1 OFF)
set(var2 "var1")
if(${var2})

выглядит для команды if как:

if(var1)

и оценивается в соответствии с документированным выше случаем if(<variable>). Результат — OFF, что является false. Однако, если мы удалим ${} из примера, то команда видит:

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

Spec-Zone.ru

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