Введение в CMake
Утилита cmake является кроссплатформенной утилитой с открытым исходным кодом (open source), используемой для создания традиционных сценариев сборки проектов для следующих платформ.
- Unix/Linux -> Makefile (для утилиты GNU make)
- Windows -> VS Projects/Workspaces
- Apple -> Xcode
Процесс сборки проекта, при использовании cmake, состоит из следующих этапов.
- Создание файла конфигурации CMakeLists.txt в котором через систему команд, свойств и переменных описываются исходные файлы проекта, цель сборки и все сопутствующие сборке детали.
- Выполнение утилиты cmake. При это будет произведена обработка файла конфигурации CMakeLists.txt в процессе которой будет сгенерирован файл традиционного для данной операционной системы сценария сборки. Например, Makefile.
- Выполнение традиционных сценариев сборки. Например, утилитой make.
Используя специальные генераторы можно привязать систему CMake к определенным системам сборки, таким как Qt, Borland C++ Builder, MS Visual C++ и пр. Это свойство системы, само по себе интересно, но привязка кроссплатформенной сборки к какому-то конкретному продукту, выглядит, в общем случае, неразумно. Не считая, разумеется, вариант с поддержкой Qt SDK. Здесь особый разговор, так как сборка остается кроссплатформенной, но составляет альтернативу собственной системе сборки для Qt, qmake, которая не лишена некоторых недостатков.
Я вспоминаю о CMake всегда, когда не делаю проект в Qt. Вот почему.
- Проект не привязывается к какой-то среде разработке и его можно писать хоть в vim. Для небольших проектов это исключительно удобно. Для тех, кто относится к vim с предубеждением путь представят себе вместо vim любой другой редактор плоского кода с подсветкой синтаксиса, который им кажется удобным. Сейчас таких много под любой платформой.
- Проект удобно передавать в виде исходников для сборки у заказчика или какого-то иного лица потребляющего этот код. Удобно в контексте его простой компиляции. Не придется ставить среду разработки. Потребуется только наличие CMake, а это уже может быть много проще. Особенно с этим нет проблем в Linux.
- Сборка проекта по Makefile, который был сгенерирован системой CMake достаточно зрелищная. Во-первых, выполняется в цвете, а, во-вторых, с отображением процента исполнения.
Из написанного выше не следует, что CMake удобен только для небольших проектов. Просто большие проекты это дело особого обсуждения. Часто тут решение принимает не один человек и, в некоторых случаях, это решение определяется самой постановкой задачи. Зачем, например, городить огород, если задача заказана в MS Visual Studio и будет использована только там. В случае, если CMake допустим для проекта, то это позволит получить удобства описанные в списке выше.
Изучение системы CMake особая тема по которой через Google можно найти много статей и специальной документации. Цель данной статьи - дать простую заготовку конфигурационного файла системы CMake. Создавая в консоли новый проект надо будет просто скопировать эту заготовку и внести в нее изменения характерные для вашего проекта.
CMakeLists.txt для простого проекта
Итак, мы начали простой проект. Создали каталог my-project и создали в нем подкаталог src для размещения источников кода нашего проекта. Напишем заготовку в файл src/main.cpp и теперь настроим CMake для сборки по этому проекту. Потом мы будем добавлять в сборку новые файлы и, возможно, библиотеки. Отразим все эти возможности в нашей заготовке.
Конфигурационный файл для системы CMake должен называться CMakeLists.txt. Расположим его в каталоге my-project и получим следующую систему файлов.
my-project - каталог проекта my-project/src - каталог источников проекта my-project/src/main.cpp - исходный файл (пока один; только *.cpp файла) my-project/CMakeLists.txt - конфигурационный файл системы CMake
Представим шаблон файла CMakeLists.txt для простого проекта.
cmake_minimum_required ( VERSION 2.6 ) # Укажите здесь имя вашего проекта. # Учитываете установку переменных # <project_name>_BINARY_DIR и <project_name>_SOURCE_DIR # в значение имени каталога с проектом. project ( project_name ) set ( SRC_DIR ${PROJECT_SOURCE_DIR}/src ) # Укажите вместо my-project имя своего приложения # - имя исполняемого файла set ( APP_NAME my-project ) # Управление типом сборки через задание значения # предопределенной переменной CMAKE_BUILD_TYPE # Возможные значения: # DEBUG|RELEASE|RELWITHDEBINFO|MINSIZEREL set( CMAKE_BUILD_TYPE RELEASE ) # Снять комментарий для добавления пути на # заголовочные файлы, которые следует добавить # для компиляции проекта #include_directories ( /path/to/headers_1 ) #include_directories ( /path/to/headers_2 ) # ... #include_directories ( /path/to/headers_N ) # Снять комментарий для добавления пути на # библиотеки, которые следует добавить # для линковки проекта #link_directories ( /path/to/lib_1 ) #link_directories ( /path/to/lib_2 ) # ... #link_directories ( /path/to/lib_N ) list(APPEND SRC ${SRC_DIR}/main.cpp ) # снять комментарий для добавления других *.cpp файлов # list(APPEND SRC ${SRC_DIR}/file_1.cpp ) # list(APPEND SRC ${SRC_DIR}/file_2.cpp ) # ... # list(APPEND SRC ${SRC_DIR}/file_N.cpp ) add_executable ( ${APP_NAME} ${SRC} ) # Снять комментарий для добавления имени библиотеки # требуемой для линковки проекта #target_link_libraries( ${APP_NAME} name_1 ) #target_link_libraries( ${APP_NAME} name_2 ) # ... #target_link_libraries( ${APP_NAME} name_N )
Рассмотрим значение представленных в файле команд.
cmake_minimum_required - выставляет требование по минимальной версии CMake, требуемой для обработки даного файла конфигурации.
project(<project_name>) - задает имя проекта. Необходимо учитывать, что дополнительной функцией данной команды является установка переменных <project_name>_BINARY_DIR и <project_name>_SOURCE_DIR в значение имени каталога проекта.
set - задает значение переменной для дальнейшего использования. Здесь создаем переменную SRC_DIR по значению подставленному из предопределенной переменной PROJECT_SOURCE_DIR и подстроки "/src". Чтобы получить значение переменной, её идентификатор надо поместить в фигурные скобки и предварить знаком доллара - ${...}.
include_directories - добавить указанный в скобках каталог к списку каталогов поиска заголовочных файлов. В одной команде можно указать несколько каталогов заголовочных файлов, разделив их пробелом.
link_directories - добавить указанный в скобках каталог к списку каталогов поиска библиотек для линковки. В одной команде можно указать несколько каталогов библиотек, разделив их пробелом.
list с первым аргументом APPEND выполняет добавление к списку, указанному вторым аргументом, элемента заданного третьим аргументом. В нашем случае, к списку под именем SRC добавлено имя файла main.cpp с путем, указанным значением переменной SRC_DIR.
add_executable - для сборки исполняемого файла представленного первым аргументом добавляет компиляционные листы, которые будут образованы по списку файлов источников, заданных вторым аргументом - значением списка SRC.
target_link_libraries - задает библиотеки для линковки. Исполняемый файл указывается первым аргументом. Например, если в Linux требуется указать для линковки приложения my-project библиотеки с именем файла libm.so, то следует написать target_link_libraries(my-project m), что соответствует общим правилам задания имени библиотек в опциях для линковки. В одной команде можно указать несколько библиотек, разделив их пробелом.
Представленный вариант файла CMakeList.txt можно взять как шаблон для своих проектов. Чтобы собрать такой проект, надо в каталоге с файлом CMakeLists.txt выполнить команду "cmake ." (не забудьте про точку, обозначающую синоним для имени текущего каталога - в нем будет осуществлён поиск файла CMakeLists.txt). По этой команде будет создан Makefile, который потом следует обработать утилитой make. Для этого надо просто выполнить команду "make".
Полезные ссылки
- http://www.cmake.org - официальный сайт системы CMake
- http://symmetrica.net/cmake/ - интересные подробности по CMake. В том числе использование для проектов wxWidget и Qt.
- При работе в Linux, документацию по установленной системе CMake можно посмотреть в каталоге /usr/share/doc/cmake-data.
Мои статьи по CMake.
Комментариев нет:
Отправить комментарий