Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Система построения проектов CMake. Учебник.pdf
X
- •Введение
- •Модульное программирование
- •Автоматизация построения проектов
- •Обзор инструментов построения проектов
- •qmake
- •Генераторы
- •Входные файлы
- •Пути
- •Синтаксис
- •Команды
- •Упражнения
- •Тест рубежного контроля
- •Проектное задание
- •Основные концепции
- •Строки
- •Свойства
- •Примеры простых проектов
- •Команды общего назначения
- •cmake_minimum_required()
- •project()
- •include()
- •message()
- •Команды описания целей
- •add_executable()
- •add_library()
- •add_subdirectory()
- •Команды настроек целей
- •include_directories()
- •target_include_directories()
- •add_definitions(), add_compile_options()
- •target_compile_definitions()
- •target_compile_options()
- •target_compile_features()
- •target_link_libraries()
- •add_dependencies()
- •Команды обработки данных
- •math()
- •list()
- •Команды управляющих конструкций
- •foreach(), endforeach()
- •Команды работы с файлами
- •get_filename_component()
- •Команды добавления специальных целей
- •configure_file()
- •add_test(), enable_testing()
- •install()
- •add_custom_target()
- •Прочие команды
- •find_package()
- •get_property(), set_property()
- •Виды конфигураций
- •Выражения генераторов
- •Информационные выражения
- •Логические выражения
- •Преобразующие выражения
- •Вспомогательные выражения
- •Упражнения
- •Тест рубежного контроля
- •Проектное задание
- •Интерфейс подключения библиотек
- •Подключение заголовочной библиотеки
- •Частичная подмена стандартной библиотеки
- •Интерфейс подключения библиотек
- •Локализация приложения
- •Установка приложения
- •Инструменты разработки
- •Управление версиями
- •Генерирование документации
- •Упражнения
- •Тест рубежного контроля
- •Проектное задание
- •Заключение
- •Библиография
- •Ответы на тесты

Заключение
На этом мы завершаем изучение системы CMake. Надеемся,
что к этому моменту читатели должны понять причины столь
высокой популярности этого инструмента в среде разработчиков программного обеспечения. Несмотря на то что представленный здесь материал больше подходит для начального освоения CMake, его вполне достаточно для решения многих типичных задач построения проектов, в том числе таких, решение которых с помощью других систем требует больших усилий. В настоящем руководстве были рассмотрены методы решения следующих задач:
— Описание простых проектов, состоящих из целей приложе-
ний и библиотек, настройка взаимосвязей между целями.
— Организация крупных проектов в виде нескольких более
простых проектов нижнего уровня, расположенных в разных подкаталогах.
— Настройка построения целей: определение параметров
компиляции и компоновки, определение подкаталогов поиска подключаемых файлов и подкаталогов для выходных файлов. Определение настроек для зависимых целей,
что существенно упрощает подключение библиотек.
401

Заключение
— Организация хранения данных и пользовательских на-
строек построения в кэше, что позволяет ускорять последующие запуски построения и организовать интерфейс его
настроек.
— Реализация специальных целей, выполняющих генериро-
вание файлов исходных текстов по шаблону (аналогично
Autotools).
— Реализация целей, выполняющих тестирование проекта.
— Реализация целей установки результатов работы других
целей проекта, файлов, необходимых разработчикам (заголовочные файлы, библиотеки импорта, документация
и т. д.), а также сценариев CMake, облегчающих подключение библиотек сторонними проектами.
— Реализация аналогов фальшивых целей системы make, вы-
полняющих заданные последовательности вызова инструментов, а также целей, генерирующих файлы при помощи произвольных наборов инструментов. Добавление вызовов собственных инструментов к другим целям. Вызываемые инструменты могут быть как внешними, так и результатами исполнения других целей.
— Организация передачи различных настроек целям в зави-
симости от используемого набора инструментов компилятора, платформы, конфигурации и т. д.
— Использование в проектах некоторых популярных внеш-
них наборов библиотек и инструментов: Boost, Qt, OpenCV,
402

Заключение
Crypto++, системы управления версиями и создания документации.
Вместе с тем в настоящий учебник ввиду ограниченности
его объёма не вошло рассмотрение следующих важных вопросов:
— Реализация конфигурационных файлов CMake для разра-
батываемых пакетов при помощи стандартного модуля
CMakePackageConfigHelpers. Конфигурационные файлы
необходимы для того, чтобы пакеты можно было использовать в сторонних проектах, подключая их командой
find_package(). При этом пакеты могут быть установлены в произвольные каталоги, все вспомогательные пути
в конфигурационных файлах будут вычисляться относительно их расположения.
— Аналогично, реализация модулей поиска для сторонних
пакетов, в составе которых отсутствуют конфигурационные файлы CMake. Модули поиска позволяют подключать такие пакеты при помощи той же команды
find_package(). В их реализации, как и в реализации конфигурационных файлов, активно используются низкоуровневые средства CMake для описания импортируемых целей.
— Создание пакетов установки в различных форматах (NSIS24,
ZIP, 7Z, RPM и т. д.) при помощи инструмента CPack и одноимённого пакета, входящих в состав CMake.
24
http://nsis.sourceforge.net/ (дата обращения: 10.04.2015).
403

Заключение
— Использование других стандартных модулей CMake (око-
ло 160) для решения различных вспомогательных задач.
В настоящем учебнике были рассмотрены лишь некоторые из них.
— Создание сложных сценариев тестирования с возможно-
стями запуска тестов покрытия, анализа использования
памяти, выгрузки результатов на сервер сбора статистики
тестирования CDash25и т. д. при помощи сценариев инструмента CTest.
— Организация кросс-компиляции.
— Определение пользовательских свойств и определение
совместимости свойств целей библиотек и соответствующих свойств зависимых целей — аналогично некоторым стандартным свойствам. Например, стандартное логическое свойство POSITION_INDEPENDENT_CODE для цели
определяет, будет ли она скомпилирована в код, не зависящий от адреса загрузки (используется для разделяемых библиотек в системе Linux и т. д.). Свойство
INTERFACE_POSITION_INDEPENDENT_CODE определяет требование для зависимых целей устанавливать для себя
свойство POSITION_INDEPENDENT_CODE таким же значением. В противном случае система CMake выведет диагностическое сообщение. Такое же поведение можно определять
для пользовательских свойств (логические значения, номера версий и т. д.).
25
http://www.cdash.org/ (дата обращения: 10.04.2015).
404

Заключение
— Работа с файлами на низком уровне (чтение, запись,
копирование, поиск, загрузка и т. д.) при помощи
команды file(), запуск процессов при помощи команды execute_process(). В отличие от рассмотренных в настоящем учебнике команд configure_file(),
add_custom_target() и т. д., эти команды не определяют
правил целей и выполняются только на этапе запуска инструмента CMake. Чтобы использовать их в определении
целей (add_custom_target(), add_custom_command()),
можно использовать вызов инструмента CMake (при помощи переменной CMAKE_COMMAND) с ключом «-P» (исполнение сценария, п. 2.1.2). Таким способом можно определять
кроссплатформенные цели, запускающие процессы и выполняющие обработку файлов со сложной логикой.
— Определение экспериментов с компиляцией тестовых ис-
ходных файлов с возможными последующими попытка-
ми исполнения скомпилированных программ на этапе запуска инструмента CMake (аналогично системе Autotools)
при помощи низкоуровневых команд. Были рассмотрены только некоторые стандартные модули, использующие
эти команды, такие как CheckCXXSourceCompiles.
— Определение целей библиотек, состоящих из объектных
модулей, и определение исходных файлов и объектных модулей для подключения к зависимым целям.
— Организация логически взаимосвязанных наборов файлов
и целей в виде именованных групп в генерируемых описа-
405

Заключение
ниях проектов для интегрированных сред разработки (Visual Studio и т. д.). Интегрированные среды отображают та-
кие проекты в виде деревьев с именованными раскрывающимися группами целей и файлов, что существенно упрощает для разработчиков ориентирование в крупных проектах.
Как можно видеть, несмотря на актуальность всех этих задач, их изучение может быть отложено начинающими пользователями системы CMake на более поздние этапы её освоения.
Мы желаем всем разработчикам успехов в освоении любых технологий, которые помогут облегчить их труд, а всем
пользователям — как можно больше качественных программных продуктов.
406

Библиография
1.
Бланшет Ж., Саммерфилд М. Qt 4. Программирование GUI на C++ : пер.
с англ. — 2-е изд. — СПб. : КУДИЦ-Пресс, 2008. — 718 с. — ISBN 978-5-
91136-059-7.
2.
Боровский А. Интроспекция и логика//Linux Format. — 2008. — Окт. —
10 (110). — С. 92—95. — URL:
phtml (дата обращения: 18.12.2014).
3.
Боровский А. Раздвигая горизонты//Linux Format. — 2008. — Нояб. —
11 (111). — С. 82—84. — URL:
phtml (дата обращения: 18.12.2014).
4.
Боровский А. Собираясь в путь//Linux Format. — 2008. — Сент. — 9
(109). — С. 92—95. — URL:
phtml (дата обращения: 18.12.2014).
5.
Саммерфилд М. Qt. Профессиональное программирование. Разработка
кроссплатформенных приложений на С++ : пер. с англ. — СПб. : Символплюс, 2011. — 560 с. — ISBN 978-5-93286-207-0.
6.
Соммервилл И. Инженерия программного обеспечения : пер. с англ. —
6-е изд. — М. : Вильямс, 2002. — 624 с. — ISBN 5-8459-0330-0.
http://www.linuxformat.ru/anons110.
http://www.linuxformat.ru/anons111.
http:/ / www . linuxformat . ru / anons109 .
7.
Хоффман Б., Мартин К. Разработка программного обеспечения в
небольшой организации : пер. с англ.//Открытые системы. — 2007. —
№ 03. — URL:
ния: 18.12.2014).
http://www.osp.ru/os/2007/03/4158385/
(дата обраще-
407

Библиография
8.
Шлее М. Qt 5.3. Профессиональное программирование на C++. — СПб. :
БХВ-Петербург, 2015. — 928 с. — (В подлиннике). — ISBN 978-5-9775-3346-
1.
9.
CMake 3.2 Documentation / Kitware, Inc. — Apr. 2015. — URL:
http://www.
cmake.org/cmake/help/v3.2/ (дата обращения: 02.05.2015).
10.
GNU Make Manual / Free Software Foundation. — 5 Oct. 2014. — URL:
http:
//www.gnu.org/software/make/manual/
11.
Martin K., Hoffman B. Mastering CMake. — 6th ed. — Kitware, Inc., Sept.
(дата обращения: 23.12.2014).
2013. — 641 p. — ISBN 978-1-930934-26-9.
12.
Miller P. A. Recursive Make Considered Harmful//AUUGN: The Journal of
AUUG Inc. — 1998. — Sept. — Vol. 19, no. 1. — P. 14–25. — ISSN 1035-
7521. — URL:
http://miller.emu.id.au/pmiller/books/rmch/
обращения: 26.12.2014).
13.
The Open Group Base Specifications Issue 7: IEEE Std 1003.1™, 2013 Edition /
The IEEE, The Open Group. — URL:
http : / / pubs . opengroup . org /
onlinepubs/9699919799/ (дата обращения: 24.12.2014).
14.
Thelin J. Foundations of Qt Development. — Apress, 2007. — 528 p. — ISBN
978-1-59059-831-3. — DOI: 10.1007/978-1-4302-0251-6.
(дата
408

Ответы на тесты
С. 42:
1. (a), (c). 2. (a), (b), (c), (e).
С. 248:
1. (a). 2. (a). 3. (a). 4. (b). 5. (a). 6. (c). 7. (c). 8. (b). 9. (b).
10. (b). 11. (d). 12. (e), (h). 13. (c). 14. (b). 15. (g).
С. 394:
1. (a). 2. (b). 3. (c). 4. (a). 5. (b). 6. (a). 7. (c). 8. (b).
409

Предметный указатель
Б
библиотека, 14
библиотека импорта, 87
В
входной файл, 17
выражения генераторов CMake, 222
выходной файл, 17
Г
генератор CMake, 45
Д
двухэтапное построение, 15
З
зависимость (по построению), 18
И
инкрементное построение, 15, 18
интегрированная среда разработки, 29
исполняемый модуль, 13
исходный модуль, 12
410
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
