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)
Оценивает заданное выражение. Если результат истинный, вызываются команды в разделе THEN. В противном случае вызываются команды в разделе else. Разделы elseif и else являются необязательными. Можно использовать несколько предложений elseif. Обратите внимание, что выражение в разделе else и endif необязательно. Можно использовать длинные выражения, и существует традиционный порядок приоритетов. Вначале вычисляются выражения в скобках, затем унарные тесты, такие как EXISTS, COMMAND, и DEFINED. Затем любые бинарные тесты, такие как EQUAL, LESS, GREATER, STRLESS, STRGREATER, STREQUAL, и MATCHES будут вычислены. Затем булевы NOT операторы и, наконец, булевы AND и затем OR операторы будут вычислены.
Возможные выражения:
-
if(<constant>) - Истина, если константа равна
1,ON,YES,TRUE,Y, или ненулевое число. Ложь, если константа равна0,OFF,NO,FALSE,N,IGNORE,NOTFOUND, пустая строка или заканчивается суффиксом-NOTFOUND. Названия булевых констант нечувствительны к регистру. Если аргумент не является одной из этих специфических констант, он обрабатывается как переменная или строка, и используется следующая подпись. -
if(<variable|string>) - Истина, если заданной переменной присвоено значение, которое не является ложной константой. Ложь в противном случае. (Обратите внимание, что макроаргументы не являются переменными.)
-
if(NOT <expression>) - Истина, если выражение не является истинным.
-
if(<expr1> AND <expr2>) - Истина, если оба выражения считаются истинными индивидуально.
-
if(<expr1> OR <expr2>) - Истина, если хотя бы одно из выражений считается истинным индивидуально.
-
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возвращает true, так что любые зависимые операции сборки будут выполняться в случае ничьей. Это включает случай, когда одно и то же имя файла передается для file1 и file2. -
if(IS_DIRECTORY path-to-directory) - Истина, если заданное имя является каталогом. Поведение определено только для полных путей.
-
if(IS_SYMLINK file-name) - Истина, если заданное имя является символической ссылкой. Поведение определено только для полных путей.
-
if(IS_ABSOLUTE path) - Истина, если указанный путь является абсолютным.
-
if(<variable|string> MATCHES regex) - Истина, если значение заданной строки или переменной соответствует заданному регулярному выражению.
-
if(<variable|string> LESS <variable|string>) - Истина, если значение заданной строки или переменной является допустимым числом и меньше значения справа.
-
if(<variable|string> GREATER <variable|string>) - Истина, если значение заданной строки или переменной является допустимым числом и больше значения справа.
-
if(<variable|string> EQUAL <variable|string>) - Истина, если значение заданной строки или переменной является допустимым числом и равно значению справа.
-
if(<variable|string> STRLESS <variable|string>) - Истина, если значение заданной строки или переменной лексикографически меньше строки или переменной справа.
-
if(<variable|string> STRGREATER <variable|string>) - Истина, если значение заданной строки или переменной лексикографически больше строки или переменной справа.
-
if(<variable|string> STREQUAL <variable|string>) - Истина, если значение заданной строки или переменной лексикографически равно строке или переменной справа.
-
if(<variable|string> VERSION_LESS <variable|string>) - Сравнение версий целочисленных номеров компонент (формат версии
major[.minor[.patch[.tweak]]]). -
if(<variable|string> VERSION_EQUAL <variable|string>) - Сравнение версий целочисленных номеров компонент (формат версии
major[.minor[.patch[.tweak]]]). -
if(<variable|string> VERSION_GREATER <variable|string>) - Сравнение версий целочисленных номеров компонент (формат версии
major[.minor[.patch[.tweak]]]). -
if(<variable|string> IN_LIST <variable>) - Истина, если заданный элемент содержится в именованной переменной списка.
-
if(DEFINED <variable>) - Истина, если заданная переменная определена. Не имеет значения, истинно или ложно значение переменной, только то, что она была установлена. (Обратите внимание, что макроаргументы не являются переменными.)
-
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отсутствует, он возвращает ложь без ошибок - Оба левых и правых аргумента
LESS,GREATER, иEQUALнезависимо проверяются на определение переменных. Если переменные определены, используются их значения; в противном случае используются исходные значения. - Оба левых и правых аргумента
STRLESS,STREQUAL, иSTRGREATERнезависимо проверяются на определение переменных. Если переменные определены, используются их значения; в противном случае используются исходные значения. - Оба левых и правых аргумента
VERSION_LESS,VERSION_EQUAL, иVERSION_GREATERнезависимо проверяются на определение переменных. Если переменные определены, используются их значения; в противном случае используются исходные значения. - Правый аргумент
NOTпроверяется на предмет того, является ли он булевой константой. Если да, используется значение; в противном случае предполагается, что это переменная, и она дериференцируется. - Левый и правый аргументы
ANDиORнезависимо проверяются на предмет того, являются ли они булевыми константами. Если да, они используются как таковые; в противном случае предполагается, что это переменные, и они дериференцируются.
Для предотвращения неоднозначности, потенциальные имена переменных или ключевых слов могут быть указаны в Цитата аргумента или Аргументе в скобках. Цитата или переменная в скобках будут интерпретированы как строка и не будут дериференцированы или интерпретированы. См. политику CMP0054.
© 2000–2019 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.6/command/if.html