Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Система построения проектов CMake. Учебник.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
2.8. Команды управляющих конструкций
hзначениеi MATCHES hрегулярное_выражениеi
COMMAND hимяi
TARGET hимяi
DEFINED hимя_переменнойi
hзначениеi F
hимя_переменнойi
hоперацияi F
 
  
 
hстрокаi
  
EXISTS
hбинарная_операцияi F
LESS
STRLESS
VERSION_LESS
— Команда if() вычисляет логическое выражение, которое
составляют её аргументы. Если его значение истинно, ис-
полняются команды от текущей команды if() до первой
соответствующей ей else(), elseif() или endif().
IS_DIRECTORY
 
GREATER
  
 
EQUAL
STRGREATER
 
VERSION_GREATER
 
IS_SYMLINK
  
 
STREQUAL
 
IS_ABSOLUTE
  
 
VERSION_EQUAL
— Иначе следующая команда elseif() проверяет условие.
Если оно истинно, исполняются команды до следующей
elseif() и т. п.
— . . .
— Если все условия в if() и elseif() оказываются ложными,
исполняются команды между else() и endif().
131
2. Основы языка CMake
Наличие команд elseif() и else() необязательно. Од-
ной команде if() может соответствовать несколько команд
elseif().
Вычисление выражений происходит следующим образом:
— Скобки и операции AND, OR, NOT имеют ту же семантику, что
и в других языках программирования.
— Строка, соответствующая одному из значений логических
констант табл. 2.1, интерпретируется в соответствии с этой таблицей. Названия логических констант нечувствитель­ны к регистру.
— Иначе строка интерпретируется как имя переменной. Вы-
ражение считается истинным, если в этой переменной не содержится значения «ложь» в соответствии с табл. 2.1.
— Также выражением может состоять из нескольких значе-
ний со строковыми обозначениями операций (табл. 2.6). Имена переменных в выражениях (hимя_переменнойi) эк­вивалентны их подстановкам: ${hимя_переменнойi}. Га­рантируется, что операции с путями будут давать правиль­ные результаты для абсолютных путей.
Таблица 2.6
132
Операции в логических выражениях
Операция Значение
Унарные
2.8. Команды управляющих конструкций
Продолжение табл. 2.6
Операция Значение
EXISTS Проверка того, является ли указанная
строка путём к существующему файлу или каталогу в файловой системе
IS_DIRECTORY Проверка того, является ли указанная
строка путём к существующему каталогу в файловой системе
IS_SYMLINK Проверка того, является ли указанная
строка путём к существующей символи­ческой ссылке в файловой системе
IS_ABSOLUTE Проверка того, является ли указанная
строка полным путём в файловой систе­ме
COMMAND Проверка того, является ли указанная
строка именем команды CMake, макроса или функции (определённой при помо­щи команды function(), п. 2.8.4)
TARGET Проверка того, является ли указанная
строка именем цели (определённой при помощи команд add_executable(), п. 2.5.1 и т. д.)
DEFINED Проверка того, является ли указанная
строка именем переменной с ранее уста­новленным значением
133
2. Основы языка CMake
Операция Значение
Продолжение табл. 2.6
Бинарные
LESS, EQUAL,
GREATER
STRLESS, STREQUAL,
STRGREATER
VERSION_LESS, VERSION_EQUAL,
VERSION_GREATER
Аргументы операций интерпретируют-
ся как десятичная запись с плавающей точкой вещественных чисел. Выполня­ется проверка того, является ли первое число соответственно меньше, равным или больше второго
Проверка того, является ли первая стро­ка соответственно лексикографически меньше, равной или больше второй
Аргументы операций интерпретируются
как номера версий, содержащие до трёх точек. Выполняется проверка того, явля­ется ли первый номер соответственно меньше, равным или больше второго
MATCHES Проверка того, соответствует ли стро-
ка заданному регулярному выражению
(п. 2.2.5)
134
2.8. Команды управляющих конструкций
Окончание табл. 2.6
Операция Значение
IS_NEWER_THAN Проверка того, является ли время измене-
ния первого файла или каталога больше или равным времени изменения второго. Выражение истинно также в том случае, когда какой-либо из двух файлов или ка­талогов не существует в файловой си­стеме. Таким образом, эта операция под-
ходит для проверки зависимости между
файлами во время построения проекта
Для операций установлены следующие приоритеты в по­рядке убывания:
1) унарные; 2) бинарные; 3) NOT; 4) AND; 5) OR.
Чтобы избежать неоднозначности, строки в выражениях можно указывать в кавычках. В этом случае они не будут ин­терпретироваться как имена переменных или операций.
Основной областью применения команды if() является организация передачи различных настроек компилятору, ком­поновщику и т. д. в зависимости от целевой операционной си­стемы и используемого компилятора. Для этого существует ряд специальных переменных CMake, доступных только на чтение, значения которых зависят от используемой среды (табл. 2.7, 2.8,
2.9)2.
2
Часть этих переменных описана на публичной странице Wiki проекта CMake, но отсут-
ствует в официальной документации.
135
2. Основы языка CMake
Логические переменные для тестирования целевой
Таблица 2.7
операционной системы
APPLE
*
UNIX
**
WIN32
WINCE WINDOWS_PHONE WINDOWS_STORE
*
OS X.
**
Переменная содержит истину для всех UNIX-подобных систем, таких как системы, основанные на ядре Linux, OS X, Windows с набором инструментов cygwin и т. д.
Таблица 2.8
Логические переменные для тестирования используемого
компилятора и окружения
Константа Значение
BORLAND Любой компилятор фирмы Bor-
land/Embarcadero
CMAKE_CL_64 64-битный компилятор Mi-
crosoft
CMAKE_COMPILER_IS_GNUCC Любая реализация компилято-
ра gcc C
CMAKE_COMPILER_IS_GNUCXX Любая реализация компилято-
ра gcc C
++
CYGWIN Реализация CMake для cygwin
136
2.8. Команды управляющих конструкций
Продолжение табл. 2.8
Константа Значение
MINGW Реализация компилятора
MinGW для Windows
MSVC Microsoft Visual C++любой вер-
сии
MSVC_IDE Microsoft Visual C++с проекта-
ми для среды Microsoft Visual Studio в отличие от использо-
вания компилятора из команд­ной строки
MSVC60 Microsoft Visual C++6.0
MSVC70 Microsoft Visual C++.NET 2002
(7.0)
MSVC71 Microsoft Visual C++.NET 2003
(7.1)
MSVC80 Microsoft Visual C++2005 (8.0)
MSVC90 Microsoft Visual C++2008 (9.0)
MSVC10 Microsoft Visual C++2010 (10.0)
MSVC11 Microsoft Visual C++2012 (11.0)
MSVC12 Microsoft Visual C++2013 (12.0)
MSVC14 Microsoft Visual C++2015 (14.0)
MSYS Реализация компилятора
MinGW с make-файлами для оболочки MSYS
137
2. Основы языка CMake
Окончание табл. 2.8
Константа Значение
WATCOM Компилятор Open Watcom для
Windows
Таблица 2.9
Переменные, хранящие версии компиляторов
MSVC_VERSION XCODE_VERSION
Значения переменной MSVC_VERSION соответстуют значе­ниям макроса _MSC_VER компилятора Microsoft Visual C++. Эти значения соответствуют первым двум компонентам версии компилятора и не совпадают с номером версии Visual Studio (табл. 2.10).
Таблица 2.10
Значения переменной MSVC_VERSION
Константа Значение
1200 Microsoft Visual C++6.0
1300 Microsoft Visual C++.NET 2002 (7.0)
1310 Microsoft Visual C++.NET 2003 (7.1)
1400 Microsoft Visual C++2005 (8.0)
1500 Microsoft Visual C++2008 (9.0)
1600 Microsoft Visual C++2010 (10.0)
1700 Microsoft Visual C++2012 (11.0)
138
2.8. Команды управляющих конструкций
Константа Значение
1800 Microsoft Visual C++2013 (12.0)
1900 Microsoft Visual C++2015 (14.0)
Например, в Visual Studio 2015 версия компилятора имеет
два старших компонента, равных 19.0.
Переменная XCODE_VERSION содержит номер версии среды
XCode, например "3.1.2".
Пример на с. 99 демонстрирует применение команды if()
Окончание табл. 2.10
для проверки использования конечной системой построения компилятора Microsoft Visual C++заданной версии. Это использу­ется для передачи компилятору требуемых аргументов. Пример на с. 142 демонстрирует применение команды if() для провер­ки сложного условия: значение переменной кэша и существова­ние файла в системе.
ПРИМЕР Следующий код, будучи помещённым в файл CMakeLists.txt корневого проекта перед командой project() (п. 2.4.2), выпол­няет аварийный останов инструмента CMake в случае, если пользователь пытается запустить построение проекта в том же каталоге, где находятся его исходные файлы:
if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
message(
FATAL_ERROR
139
2. Основы языка CMake
"Use build directory different from source "
"directory!")
endif()
Для определения путей к каталогам проекта и построения используются специальные переменные CMAKE_SOURCE_DIR и CMAKE_BINARY_DIR. При сравнении их значений использует­ся тот факт, что система CMake хранит все пути в абсолютном представлении (п. 2.1.3). Команда message() (п. 2.4.4) с аргумен­том FATAL_ERROR выполняет прерывание обработки проекта. ∗
Замечание: продемонстрированная в примере проверка может быть особенно полезной, если в результате построения в выход­ном каталоге генерируются файлы с именами, совпадающими с именами исходных файлов. Такая проверка выполняется, на­пример, в проекте LLVM.
N
2.8.2. while(), endwhile(), break(), continue()
while(hусловиеi)
hкомандыi
endwhile()
break()
continue()
Команда while() вычисляет условие по таким же прави­лам, что и команда if() (п. 2.8.1). Пока это условие истин-
140
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]