if
Условно выполнить группу команд.
Синопсис
if(<condition>) <commands> elseif(<condition>) # optional block, can be repeated <commands> else() # optional block <commands> endif()
Оценивает аргумент condition в if-блоке согласно синтаксису условий, описанному ниже в разделе Синтаксис условий. Если результат — истина, то выполняется код 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) -
Истина, если указанный файл или директория существуют. Поведение определено только для полных путей.
-
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) -
Истина, если заданная строка или значение переменной соответствуют заданному регулярному выражению. См. Спецификацию регулярных выражений для формата 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.14/command/if.html