if
Условное выполнение группы команд.
Синтаксис
if(<condition>) <commands> elseif(<condition>) # optional block, can be repeated <commands> else() # optional block <commands> endif()
Оценивает аргумент condition в предложении if в соответствии с Синтаксисом условия, описанным ниже. Если результат — 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((condition) AND (condition OR (condition))) -
Условия внутри скобок вычисляются в первую очередь, а затем остальное условие вычисляется так же, как и в других примерах. Там, где есть вложенные скобки, самые внутренние вычисляются как часть вычисления условия, которое их содержит.
Проверки существования
-
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) -
Добавлено в версии 3.3: Истина, если заданное имя — существующее имя теста, созданное командой
add_test().
-
if(DEFINED <name>|CACHE{<name>}|ENV{<name>}) -
Истина, если переменная, кэшированная переменная или переменная среды с заданным
<name>определена. Значение переменной не имеет значения. Обратите внимание, что аргументы макросов не являются переменными.Добавлено в версии 3.14: Добавлена поддержка переменных
CACHE{<name>}. -
if(<variable|string> IN_LIST <variable>) -
Добавлено в версии 3.3: Истина, если данный элемент содержится в именованной переменной списка.
Операции с файлами
-
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) -
Истина, если данный путь является абсолютным путём. Обратите внимание на следующие частные случаи:
- Пустой
pathоценивается как ложь. - На хостах Windows любой
path, начинающийся с буквы диска и двоеточия (например,C:), слеша или обратного слеша, будет оцениваться как истина. Это означает, что путь, такой какC:no\base\dirбудет оцениваться как истина, даже если небуквенная часть пути является относительной. - На не-Windows хостах любой
path, начинающийся с тильды (~), оценивается как истина.
- Пустой
Сравнения
-
if(<variable|string> MATCHES regex) -
Истина, если заданная строка или значение переменной соответствует данному регулярному условию. См. Спецификацию регулярных выражений для формата регулярных выражений.
Добавлено в версии 3.9: Группы
()захватываются в переменных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>) -
Добавлено в версии 3.7: Истина, если заданное значение строки или переменной является корректным числом и меньше или равно значению справа.
-
if(<variable|string> GREATER_EQUAL <variable|string>) -
Добавлено в версии 3.7: Истина, если заданное значение строки или переменной является корректным числом и больше или равно значению справа.
-
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>) -
Добавлено в версии 3.7: Истина, если заданное значение строки или переменной лексикографически меньше или равно значению справа.
-
if(<variable|string> STRGREATER_EQUAL <variable|string>) -
Добавлено в версии 3.7: Истина, если заданное значение строки или переменной лексикографически больше или равно значению справа.
Сравнения версий
-
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>) -
Новое в версии 3.7: Сравнение версий по компонентам как целых чисел (формат версии —
major[.minor[.patch[.tweak]]], пропущенные компоненты считаются нулями). Любой нецелый компонент версии или нецелая заключительная часть компонента версии эффективно обрезает строку в этой точке.
-
if(<variable|string> VERSION_GREATER_EQUAL <variable|string>) -
Новое в версии 3.7: Сравнение версий по компонентам как целых чисел (формат версии —
major[.minor[.patch[.tweak]]], пропущенные компоненты считаются нулями). Любой нецелый компонент версии или нецелая заключительная часть компонента версии эффективно обрезает строку в этой точке.
Расширение переменных
Команда 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независимо проверяются на булевые константы, если таковы есть, они используются как есть, в противном случае предполагается, что это переменные, и они разыменовываются.
Изменено в версии 3.1: Для предотвращения неоднозначности потенциальные имена переменных или ключевых слов могут быть указаны в Скобочном аргументе или Аргументе в скобках. Процитированная или скобочная переменная или ключевое слово будут интерпретироваться как строка и не будут разыменовываться или интерпретироваться. См. политику CMP0054.
Автоматической оценки для переменных среды или кэша Ссылок на переменные нет. Их значения должны быть указаны как $ENV{<name>} или $CACHE{<name>} там, где вышеупомянутый синтаксис условий принимает <variable|string>.
© 2000–2021 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.21/command/if.html