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, если выражение не равно 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, если значение заданной строки или переменной соответствует заданному регулярному выражению.
-
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, если заданная переменная определена. Не имеет значения, истинна или ложна переменная, важно лишь, что она установлена. (Примечание: аргументы макросов не являются переменными.)
-
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отсутствует, то возвращается 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.8/command/if.html