Знакомство с CMake. Часть 1. Установка, CMakeLists.txt, сборка.

Введение.

Многие, кто начинал создавать собственные программы, пользовался какой-либо системой сборки. В общем, система сборки – это набор инструментов, облегчающий работу с компилятором. Это включает в себя компиляцию, линковку, установку, а также сбор исходных файлов для передачи их компилятору и слежение за зависимостями. Также современные системы сборки облегчают работу с библиотеками, позволяют создавать переносимые проекты и выполняют ещё массу других вкусностей. Эта статья посвящена популярной системе сборки CMake и расскажет, как правильно её установить и настроить, а также будет рассмотрен простой пример её использования. Она рассчитана на тех, что хоть немного знаком с понятиями make, Makefile, компиляция, линковка.

Установка в Linux.

Для популярных дистрибутивов Linux типа Debian, Gentoo, Fedora и т.д. CMake давно лежит в официальных репозиториях. Нам нужно всего лишь установить пакет cmake с помощью менеджера пакетов. Как правило, он устанавливается в системные директории, и необходимости править переменные окружения нету. Можете проверить её работоспособность, выполнив

1
cmake --version

Если же в репозитории нет такого пакета, то можно его собрать вручную. Скачиваем Unix/Linux Source, например, cmake-3.5.0-rc3.tar.gz, распаковываем и собираем:

1
2
3
4
5
tar -xzf cmake-3.5.0-rc3.tar.gz
cd cmake-3.5.0-rc3/
./configure --prefix=/usr
make -j<cpu_count>
sudo make install

Если нет необходимости устанавливать в системную /usr директорию, можно в аргументе —prefix прописать нужный корень установки. По умолчанию, без явного указания —prefix, установка будет произведена в /usr/local. -j<cpu_count> используется для ускорения сборки, например, на 4-х ядерном процессоре можно указать -j4, и сборка будет вестись параллельно в 4 потока.

Установка в Windows.

Для Windows на сайте CMake лежит установочный файл msi. Рекомендую при установке отметить галочку добавления пути в переменные окружения PATH для всех пользователей. Тогда, после перелогинивания, CMake будет доступен из любого места. Проверить можно, открыв cmd и выполнив тот же

1
cmake --version

Принцип работы.

Основная цель работы CMake – создание Makefile или проекта для конкретной среды программирования по файлу проекта CMakeLists.txt. За тип создаваемых файлов отвечает аргумент -G. Можно посмотреть поддерживаемые генераторы, выполнив

1
 	cmake -G

Т.е. любой проект с использованием этой системы сборки начинается с создания CMakeLists.txt, в котором описывается проект.

CMakeLists.txt

Основную документацию можно посмотреть на сайте CMake, а здесь я расскажу коротко об основных правилах написания этого файла. В этом файле описываются исходные файлы, подключаемые библиотеки, параметры компиляции, подпроекты и правила установки. В одном файле разрешается создавать несколько исполняемых файлов или библиотек и подключать несколько подпроектов. Под подпроектом я подразумеваю просто другую папку с CMakeLists.txt. В этом и состоит основная прелесть CMake – он не накладывает никаких ограничений на состав и сложность проекта. Один файл может описывать как самостоятельное приложение, так и быть корневым файлом сложного программного комплекса. Или, например, в одном файле можно описать сборку библиотеки и исполняемого файла, использующего эту библиотеку, а также тут же подключить ещё парочку подпроектов.

Итак, пример простейшего CMakeLists.txt:

1
2
3
4
5
6
7
8
9
project(hello_cmake)
cmake_minimum_required(VERSION 2.6)
set(CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_SOURCE_DIR}/../)
include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
file(GLOB CPPS "*.cpp")
add_definitions(-Wall -O2)
add_executable(${PROJECT_NAME} ${CPPS})
target_link_libraries(${PROJECT_NAME})
install(TARGETS ${PROJECT_NAME} DESTINATION bin)

Рассмотрим подробнее:

1
project(hello_cmake)

задать имя проекта. Его можно потом использовать, как ${PROJECT_NAME}.

1
set(CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_SOURCE_DIR}/../)

задать путь для установки собранных файлов. Здесь установка будет производиться в папку, содержащую папку с исходниками.

1
include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})

добавить пути с хидерами, -I для gcc. Здесь добавляются папка сборки и папка с исходниками.

1
file(GLOB CPPS "*.cpp")

собрать в один список все файлы по регулярному выражению. Здесь в переменную CPPS добавляются все файлы по шаблону *.cpp, т.е. все исходные файлы. *.h файлы добавлять не надо, т.к. из них не создается объектных файлов.

1
add_definitions(-Wall -O2)

добавить директивы компилятора. Здесь мы включаем оптимизацию O2 и разрешаем все предупреждающие сообщения.

1
add_executable(${PROJECT_NAME} ${CPPS})

собрать исполняемый файл. Здесь собирается исполняемый файл hello_cmake из исходников CPPS.

1
target_link_libraries(${PROJECT_NAME})

слинковать файл с библиотеками. Здесь библиотек нет, но если они есть, то они пишутся через пробел после имени файла.

1
install(TARGETS ${PROJECT_NAME} DESTINATION bin)

установить собранный файл. Здесь наш исполняемый файл устанавливается в папку bin папки установки. Она ранее была задана как ${CMAKE_CURRENT_SOURCE_DIR}/../, т.е. рядом с папкой исходников появится папка bin, куда будет установлен собранный файл.

Сборка.

Чтобы сгенерировать Makefile или файл проекта среды, нужно выполнить cmake с указанием директории, где лежит CMakeLists.txt, или просто cmake, если CMakeLists.txt лежит тут же. Хотя признаком хорошего тона считается разделение директорий с исходниками и сборочной. Например, в папке src лежат исходники и CMakeLists.txt, и рядом с src есть папка build. В этом случае для сборки проекта следует перейти в build и выполнить там cmake ../src. Тогда папка с исходниками останется нетронутой, а все служебные файлы cmake и объектные файлы будут создаваться в build.


Смотрите также

comments powered by Disqus