if
Условно выполните группу команд.
Синопсис
if(<condition>) <commands> elseif(<condition>) # optional block, can be repeated <commands> else() # optional block <commands> endif()
Оценивает аргумент condition в соответствии с синтаксисом условия, описанным ниже. Если результат равен true, тогда commands в блоке if выполняется. В противном случае обрабатываются необязательные блоки elseif аналогичным образом. Наконец, если ни одно condition не является истинным, выполняется commands в необязательном блоке else.
По унаследованным причинам команды else() и endif() допускают необязательный аргумент <condition>. Если он используется, он должен быть точным повторением аргумента открывающей команды if.
Синтаксис условия
Следующий синтаксис применяется к аргументу condition в if, elseif и while() операторных конструкциях.
Составные условия оцениваются в следующем порядке приоритета: В первую очередь оцениваются внутренние скобки. Затем идут унарные тесты, такие как 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 <condition>) -
Истина, если условие не является истинным.
-
if(<cond1> AND <cond2>) -
Истина, если оба условия истинны индивидуально.
-
if(<cond1> OR <cond2>) -
Истина, если хотя бы одно из условий истинно индивидуально.
-
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) -
Истина, если указанный файл или каталог существует. Поведение определено только для полных путей. Разрешает символические ссылки, т.е. если указанный файл или каталог является символической ссылкой, возвращает true, если цель символической ссылки существует.
-
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 <name>|CACHE{<name>}|ENV{<name>}) -
Истина, если переменная, переменная кэша или переменная среды с заданным именем
<name>определена. Значение переменной не имеет значения. Обратите внимание, что аргументы макросов не являются переменными. -
if((condition) AND (condition OR (condition))) -
Условия в скобках оцениваются в первую очередь, а затем оставшееся условие оценивается, как в предыдущих примерах. При наличии вложенных скобок, самые внутренние скобки оцениваются как часть оценки содержащего их условия.
Расширение переменных
Команда 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нет, возвращается значение 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.
Автоматической оценки для переменных среды или кэша ссылок на переменные нет. Их значения должны быть указаны как $ENV{<name>} или $CACHE{<name>} там, где синтаксис вышеуказанных условий допускает <variable|string>.
© 2000–2020 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.16/command/if.html