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, 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 <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возвращает истину, чтобы любые зависимые операции построения выполнялись при ничьей. Это включает случай, когда в качестве 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 <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,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.13/command/if.html