Принципы работы систем автоматического построения В этой главе мы коротко повторим основные принципы модульного программирования, которые понадобятся для дальнейшего изложения материала. <...> При использовании относительных путей расположение выходного каталога фиксируется относительно каталога проекта, изменение его требует очередного массового изменения настроек проектов. <...> В диалоговых окнах среды Qt Creator можно только устанавливать настройки, не указываемые в файлах проекта: каталог построения, параметры командной строки при вызове qmake и т. д. <...> Принципы работы систем автоматического построения — Возможность работы над проектами в средах Visual Studio, XCode, Qt Creator. <...> Принцип работы инструмента CMake аналогичен принципу работыqmake: из каталога исходных кодов считывается файл CMakeLists.txt с описанием проекта, на выходе инструмент генерирует файлы проекта для одной из множества конечных систем построения (рис. <...> Принципы работы систем автоматического построения Visual Studio (*.sln, *.vcxproj) Eclipse CMakeLists.txt cmake Code::Blocks (*.cbp) Makefile . <...> Генерация проектов при помощи утилиты CMake Следует отметить, что современные версии интегрированной среды Qt Creator в дополнение к описаниям проектов на языке qmake также поддерживают язык CMake. <...> Система CMake управляется при помощи универсального процедурного языка. <...> В то время как инструмент qmake позволяет в более простой и компактной форме выполнять описание проектов, использующих набор библиотек и инструментов Qt, при помощи CMake легче описывать проекты, которые используют другие библиотекииинструменты, а также решать нестандартные задачи, которые возникают при организации процесса построения [14]. <...> В состав CMake входит большое количество сценариев (модулей поиска) для наиболее популярных и распространённых в среде разработчиков пакетов. <...> Можно создавать собственные модули поиска на языке CMake, также можно встраивать поддержку CMake в собственные наборы библиотек. <...> Входные файлы Входными файлами на языке CMake являются <...>
Система_построения_проектов_Cmake.pdf
УДК 681.3
ББК 32.85
Д79
Печатается по решению Редакционно-издательского совета
Южного федерального университета
(протокол №3 от 23 ноября 2015 г.)
Рецензенты:
кандидат физико-математических наук, доцент кафедры алгебры и
дискретной математики мехмата ЮФУ
М. Э. Абрамян;
кандидат физико-математических наук, доцент кафедры программного
обеспечения вычислительной техники и автоматизированных систем
факультета информатики и вычислительной техники ДГТУ
В. А. Стукопин
Дубров, Д. В.
Д79 Система построения проектов CMake : учебник / Д. В. Дубров ; Южный
федеральный университет. — Ростов-на-Дону : Издательство Южного
федерального университета, 2015. — 419 с.
ISBN 978-5-9275-1852-4
Работа посвящена инструменту CMake, который является современной
системой для описания программных проектов и обладает богатыми
возможностями. В учебнике изложен материал, достаточный для создания
при помощи CMake проектов со сложной структурой, использующих
внешние библиотеки или вспомогательные инструменты разработчика.
Учебник предназначен для магистрантов Института математики, механики
и компьютерных наук им. И.И. Воровича Южного федерального
университета по направлению подготовки «Фундаментальная информатика
и информационные технологии», изучающих курс «Разработка кроссплатформенных
приложений». Также учебник может быть полезен всем
студентам, аспирантам и специалистам, которые участвуют в разработке
сложных программных проектов.
ISBN 978-5-9275-1852-4
УДК 681.3
ББК 32.85
© Южный федеральный университет, 2015
© Дубров Д. В., 2015
Стр.2
Оглавление
Введение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1. Принципы работы систем автоматического
построения . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.1. Модульное программирование . . . . . . . . . . . . . 11
1.2. Автоматизация построения проектов . . . . . . . . . 16
1.3. Обзор инструментов построения проектов . . . . . . 22
1.3.1. make . . . . . . . . . . . . . . . . . . . . . . . . . 23
1.3.2. Autotools. . . . . . . . . . . . . . . . . . . . . . . 26
1.3.3. Интегрированные среды разработки . . . . . . 29
1.3.4. qmake . . . . . . . . . . . . . . . . . . . . . . . . 35
1.3.5. CMake . . . . . . . . . . . . . . . . . . . . . . . . 39
1.4. Упражнения . . . . . . . . . . . . . . . . . . . . . . . . 42
1.4.1. Тест рубежного контроля . . . . . . . . . . . . . 42
1.4.2. Проектное задание . . . . . . . . . . . . . . . . 43
2. Основы языка CMake . . . . . . . . . . . . . . . . . . . . . 45
2.1. Основные концепции . . . . . . . . . . . . . . . . . . . 45
2.1.1. Генераторы . . . . . . . . . . . . . . . . . . . . . 45
2.1.2. Входные файлы . . . . . . . . . . . . . . . . . . 47
2.1.3. Пути . . . . . . . . . . . . . . . . . . . . . . . . . 48
3
Стр.3
Оглавление
2.2. Синтаксис . . . . . . . . . . . . . . . . . . . . . . . . . 50
2.2.1. Команды . . . . . . . . . . . . . . . . . . . . . . 50
2.2.2. Строки. . . . . . . . . . . . . . . . . . . . . . . . 51
2.2.3. Переменные . . . . . . . . . . . . . . . . . . . . 56
2.2.4. Свойства . . . . . . . . . . . . . . . . . . . . . . 60
2.2.5. Регулярные выражения. . . . . . . . . . . . . . 62
2.3. Примеры простых проектов . . . . . . . . . . . . . . . 65
2.4. Команды общего назначения . . . . . . . . . . . . . . 73
2.4.1. cmake_minimum_required() . . . . . . . . . . . 73
2.4.2. project(). . . . . . . . . . . . . . . . . . . . . . 74
2.4.3. include(). . . . . . . . . . . . . . . . . . . . . . 76
2.4.4. message(). . . . . . . . . . . . . . . . . . . . . . 79
2.5. Команды описания целей . . . . . . . . . . . . . . . . 81
2.5.1. add_executable(). . . . . . . . . . . . . . . . . 81
2.5.2. add_library() . . . . . . . . . . . . . . . . . . . 83
2.5.3. add_subdirectory() . . . . . . . . . . . . . . . 91
2.6. Команды настроек целей . . . . . . . . . . . . . . . . . 92
2.6.1. include_directories() . . . . . . . . . . . . . 92
2.6.2. target_include_directories() . . . . . . . . 94
2.6.3. add_definitions(), add_compile_options(). 98
2.6.4. target_compile_definitions() . . . . . . . . 101
2.6.5. target_compile_options() . . . . . . . . . . . 102
2.6.6. target_compile_features() . . . . . . . . . . 103
2.6.7. target_link_libraries() . . . . . . . . . . . . 105
2.6.8. add_dependencies() . . . . . . . . . . . . . . . 113
2.7. Команды обработки данных . . . . . . . . . . . . . . . 114
2.7.1. set(), unset(), option() . . . . . . . . . . . . . 114
4
Стр.4
Оглавление
2.7.2. math(). . . . . . . . . . . . . . . . . . . . . . . . 118
2.7.3. list(). . . . . . . . . . . . . . . . . . . . . . . . 119
2.7.4. string() . . . . . . . . . . . . . . . . . . . . . . 123
2.8. Команды управляющих конструкций . . . . . . . . . 130
2.8.1. if(), elseif(), else(), endif(). . . . . . . . . 130
2.8.2. while(), endwhile(), break(), continue() . . 140
2.8.3. foreach(), endforeach(). . . . . . . . . . . . . 141
2.8.4. function(), endfunction(), return() . . . . . 146
2.9. Команды работы с файлами . . . . . . . . . . . . . . . 150
2.9.1. get_filename_component() . . . . . . . . . . . 150
2.9.2. find_file(), find_library(), find_path(),
find_program() . . . . . . . . . . . . . . . . . . 155
2.10. Команды добавления специальных целей . . . . . . . 160
2.10.1. configure_file(). . . . . . . . . . . . . . . . . 160
2.10.2. add_test(), enable_testing() . . . . . . . . . 166
2.10.3. install(). . . . . . . . . . . . . . . . . . . . . . 174
2.10.4. add_custom_target(). . . . . . . . . . . . . . . 189
2.10.5. add_custom_command() . . . . . . . . . . . . . . 195
2.11. Прочие команды. . . . . . . . . . . . . . . . . . . . . . 201
2.11.1. find_package() . . . . . . . . . . . . . . . . . . 201
2.11.2. get_property(), set_property(). . . . . . . . 209
2.12. Поддержка нескольких конфигураций построения . 217
2.12.1. Виды конфигураций. . . . . . . . . . . . . . . . 217
2.12.2. Выражения генераторов . . . . . . . . . . . . . 222
2.12.3. Информационные выражения. . . . . . . . . . 227
2.12.4. Логические выражения . . . . . . . . . . . . . . 235
2.12.5. Преобразующие выражения . . . . . . . . . . . 237
5
Стр.5
Оглавление
2.12.6. Вспомогательные выражения . . . . . . . . . . 247
2.13. Упражнения . . . . . . . . . . . . . . . . . . . . . . . . 248
2.13.1. Тест рубежного контроля . . . . . . . . . . . . . 248
2.13.2. Проектное задание . . . . . . . . . . . . . . . . 254
3. Примеры использования пакетов. . . . . . . . . . . . . . 256
3.1. OpenCV . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
3.2. Boost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
3.2.1. Интерфейс подключения библиотек . . . . . . 267
3.2.2. Подключение заголовочной библиотеки. . . . 272
3.2.3. Подключение библиотеки с модулем
компоновки . . . . . . . . . . . . . . . . . . . . 278
3.2.4. Частичная подмена стандартной библиотеки. 284
3.3. Qt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292
3.3.1. Интерфейс подключения библиотек . . . . . . 292
3.3.2. Использование инструментов Qt . . . . . . . . 303
3.3.3. Локализация приложения . . . . . . . . . . . . 324
3.3.4. Установка приложения . . . . . . . . . . . . . . 334
3.4. Crypto++ . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
3.5. Инструменты разработки . . . . . . . . . . . . . . . . 371
3.5.1. Управление версиями. . . . . . . . . . . . . . . 371
3.5.2. Генерирование документации. . . . . . . . . . 378
3.6. Упражнения . . . . . . . . . . . . . . . . . . . . . . . . 394
3.6.1. Тест рубежного контроля . . . . . . . . . . . . . 394
3.6.2. Проектное задание . . . . . . . . . . . . . . . . 397
Заключение . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401
Библиография . . . . . . . . . . . . . . . . . . . . . . . . . . . 407
Ответы на тесты . . . . . . . . . . . . . . . . . . . . . . . . . . 409
6
Стр.6
Оглавление
Предметный указатель. . . . . . . . . . . . . . . . . . . . . . 409
7
Стр.7