Личный опыт разработки ПО

Сборник рецептов

Сборка проектов с CMake. Введение

комментарий 191

Для автоматизации сборки проектов традиционно используют системы сборки, такие как make на Unix подобных системах и nmake для компилятора Microsoft. Также традиционно написание файлов для сборки проекта под эти системы является задачей нетривиальной. Конечно в пользуясь только Mictosoft Visual Studio можно даже не подозревать о существовании этих файлов, так как интегрированная среда разработки достаточно удобно скрывает всю кухню, оставляя снаружи несколько диалоговых окон и кнопку Build. Но для сложных проектов использующих массу сторонних библиотек и кроссплатформенных проектов такой подход часто оказывается неприемлемым.

Кратко говоря make-файл представляет из себя описания последовательности действий необходимых для того чтобы достичь какой либо цели, например скомпилировать программу. На псевдокоде это может выглядеть примерно так:

Что нужно сделать?

Собрать программу hello_world.

Как ее делать?

Взять файлы hello_world.h и hello_world.cpp и запустить компилятор передав их в качестве параметров.

Что делать когда компилятор закончит работать?

Взять получившийся в результате работы компилятора объектный файлы hello_world.o и запустить линковщик передав ему этот файл.

Все.

Причем каждый подпроект может иметь свой файл сборки, а главный make-файл сможет пройти рекурсивно по подпроектам, выполнив его файл сборки, а потом собрать проект из этих компонентов.

Выглядит все просто, проблемы возникают дальше и проблем несколько:

  1. Разрешение зависимостей возникающих между частями проекта
  2. Синтаксическая сложность и неоднозначность классических make-файлов
  3. Привязка к конкретной утилите автоматической сборки и как следствие непереносимость на другие платформы

Для решения части этих проблем или всех сразу были созданы следующие инструменты: Automake (http://sourceware.org/automake/) , CMake (http://www.cmake.org/), SCons (http://www.scons.org/). Список далеко не полный.

Я предлагаю рассмотреть CMake, как простой для изучения, понятный, мощный и кроссплатформенный инструмент, который решает сразу все три проблемы. Подробности ниже.

Сам CMake не осуществляет сборку проекта, он лишь генерирует из своего файла сборки make-файл для конкретной платформы. Это может быть проект Microsoft Visual Studio, NMake makefile, проект XCode для MacOS, Unix makefile, Watcom makefile, проект Eclipse или CodeBlocks. Более того файлы CMake открывает как проект набирающая популярность среда разработки QtCreator.

Данный файл обычно называется CMakeLists.txt и содержит команды понятные CMake. Выполнив

cmake CMakeLists.txt

Мы получим либо проект который можно открыть в вашей среде разработки, либо makefile по которому можно собрать проект запустив соответствующую систему сборки (make, nmake, wmake). Всегда можно явно указать, что должна генерировать программа, указав ключ –G с нужным параметром (просто запустите cmake, чтобы увидеть доступные варианты).

Где взять CMake?

Дистрибутив CMake можно скачать с официального сайта (http://cmake.org/cmake/resources/software.html) где есть версии для всех популярных платформ или установить из репозитория вашего дистрибутива Linux, скорее всего он там уже есть.

Hello, World!

Предлагаю рассмотреть простой CMake-файл:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
cmake_minimum_required (VERSION 2.6) 
 
set (PROJECT hello_world) 
 
project (${PROJECT}) 
 
set (HEADERS 
	hello.h)
 
set (SOURCES 
	hello.cpp
	main.cpp) 
 
add_executable (${PROJECT} ${HEADERS} ${SOURCES})

Что здесь происходит?

  1. В первой строке просто указана минимальная версия CMake необходимая для успешной интерпретации файла.
  2. В третьей строке определяется переменная PROJECT и ей задается значение hello_world — так будет называться наша программа.
  3. О чем и говорится в пятой строке. Конструкция ${ИМЯ_ПЕРЕМЕННОЙ} возвращает значение переменной, таким образом проект будет называться hello_world.
  4. В седьмой и десятой строках вводятся переменные содержащие список файлов необходимых для сборки проекта.
  5. И в последней строке идет команда собрать исполняемый файл с именем указанном в переменной PROJECT и из файлов имена которых находятся в переменных HEADERS и SOURCES.

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

Как собрать библиотеку с CMake?

Точно также как и исполняемый файл, но в последней строке вместо команды add_executable, укажите команду add_library. В этом случае будет собрана статическая библиотека, для сборки динамической библиотеки надо указать параметр SHARED после имени библиотеки:

add_library (${PROJECT} SHARED ${HEADERS} ${SOURCES})

Немного о стиле

Не буду усложнять, просто расскажу о том стиле форматирования которым пользуюсь я для написания CMake-файлов. Правила достаточно лояльны:

  • Имена переменных пишутся английскими буквами в верхнем регистре
  • Команды CMake записываются английскими буквами в нижнем регистре
  • Параметры команд CMake пишутся английскими буквами в верхнем регистре
  • Команды CMake отделены пробелом от открывающей скобки

Где должен находится CMakeLists.txt?

Очень удобно в корне каждого проекта иметь директорию build с файлами сборки проекта, причем имя файла во всех директориях должно называться одинаково (название по умолчанию CMakeLists.txt отлично подойдет). Это позволит собирать сложные проекты рекурсивно подключая директории с подпроектами (о подключении подпроектов к проекту можно прочесть в моей заметке).

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

Сборка сложного проекта

Усложним задачу и соберем проект зависящий от библиотеки. Для этого надо сделать следующие вещи:

  1. Собрать библиотеку
  2. Подключить библиотеку к проекту

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

Теперь о том как эту библиотеку подключить. Сделать это можно добавив в CMakeLists.txt проекта три строки:

1
2
3
include_directories (../)
add_subdirectory (../ИМЯ_БИБЛИОТЕКИ/build bin/ИМЯ_БИБЛИОТЕКИ)
target_link_libraries (${PROJECT} ИМЯ_БИБЛИОТЕКИ)

Первая строка нужна для того, чтобы указать путь (в данном случае это корень проекта) по которому компилятор будет искать подключаемые заголовочные файлы.

Во второй строке идет указание CMake взять файл из директории build подпроекта, выполнить его и результат работы положить в директорию ./bin/ИМЯ_БИБЛИОТЕКИ.

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

Можно добавлять эти команды вручную, но я предлагаю изменить шаблон, чтобы было можно изменять только одну строку, указывая имя библиотеки:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
cmake_minimum_required (VERSION 2.6)
 
set (PROJECT ИМЯ_ПРОЕКТА)
 
project (${PROJECT})
 
include_directories (../)
 
set (LIBRARIES
		ИМЯ_БИБЛИОТЕКИ_1
		ИМЯ_БИБЛИОТЕКИ_2)
 
foreach (LIBRARY ${LIBRARIES})
	add_subdirectory (../${LIBRARY}/build bin/${LIBRARY})
endforeach ()
 
set (HEADERS
		../ЗАГОЛОВОЧНЫЕ_ФАЙЛЫ)
set (SOURCES 
		../ФАЙЛЫ_С_РЕАЛИЗАЦИЕЙ)
 
add_executable (${PROJECT} ${HEADERS} ${SOURCES})
 
target_link_libraries (${PROJECT} ${LIBRARIES})

Остальные вопросы

Все хорошо, но почему в проекте Microsoft Visual Studio не показаны заголовочные файлы?

Это можно исправить добавив в файл две строки:

1
2
source_group ("Header Files" FILES ${HEADERS})
source_group ("Source Files" FILES ${SOURCES})

На работу CMake при генерации файлы для других систем это никак не повлияет.

Почему я не вижу предупреждений компилятора (warnings)?

Предупреждения можно включить следующим образом (пример для MS VS и GCC):

1
2
3
4
5
6
7
if (MSVC)
	add_definitions (/W4)
elseif (CMAKE_COMPILER_IS_GNUCXX)
	add_definitions (-Wall -pedantic)
else ()
	message ("Unknown compiler")
endif ()

На этом беглый обзор считаю можно закончить. Подробнее о CMake читайте в следующих заметках, в частности о подключении библиотек Qt и Boost.

Файл с примером

Вы можете скачать архив с примером простого проекта, собрать его и убедиться в том как действительно просто и приятно пользоваться CMake.

Скачать пример

7th Январь 2010
20:52

Рубрика: Разработка,Сборка

Метки:

191 комментарий к 'Сборка проектов с CMake. Введение'

Подписаться на комментарии по RSS или TrackBack.

  1. schein abbigliamento

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

    schein abbigliamento

    2 января 22 16:26

  2. john deere zero turn lawn mowers

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

  3. oral nail fungus treatment

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

    oral nail fungus treatment

    3 января 22 18:56

  4. home depot chainsaws for sale

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

  5. zippered travel tote bags

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

    zippered travel tote bags

    6 января 22 2:18

  6. Read More Here

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

    Read More Here

    6 января 22 3:29

  7. short scale bass kit

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

    short scale bass kit

    6 января 22 15:16

  8. video camera accessories

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

    video camera accessories

    6 января 22 17:40

  9. doo gro before and after

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

    doo gro before and after

    7 января 22 23:27

  10. page

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

    page

    8 января 22 13:54

  11. womens Best reviews

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

    womens Best reviews

    8 января 22 23:39

  12. alarm clock online

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

    alarm clock online

    10 января 22 18:29

  13. piante finte da interno ikea

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

    piante finte da interno ikea

    11 января 22 10:34

  14. best woodworking tools for beginners

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

  15. laundry bag with handle

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

    laundry bag with handle

    12 января 22 22:22

  16. top handle crossbody bag

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

    top handle crossbody bag

    12 января 22 22:24

  17. davina resistance bands

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

    davina resistance bands

    13 января 22 0:32

  18. ego power string trimmer reviews

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

  19. head to the Jenniferjessesmith site

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

  20. vasagle Scaffale

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

    vasagle Scaffale

    16 января 22 0:54

  21. handle bag

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

    handle bag

    16 января 22 1:21

  22. leather passport wallet for women

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

  23. luggage sets on sale canada

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

    luggage sets on sale canada

    16 января 22 2:28

  24. husqvarna chainsaw 550xp

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

    husqvarna chainsaw 550xp

    17 января 22 6:34

  25. gucci fabric top handle shoulder bag

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

  26. Top handle chanel bag

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

    Top handle chanel bag

    17 января 22 13:05

  27. aldo women’s jerilini top handle bag

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

  28. husqvarna 450 chainsaw

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

    husqvarna 450 chainsaw

    18 января 22 0:37

  29. who sells hatsan air rifles in springfield Mo

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

  30. davina mccall 30 minute workout review

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

  31. michael kors Handbags Macys

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

    michael kors Handbags Macys

    18 января 22 12:34

  32. large travel tote

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

    large travel tote

    18 января 22 20:48

  33. hope large saffiano leather satchel

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

  34. wallpaper folding table

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

    wallpaper folding table

    19 января 22 12:30

  35. michael michael kors rayne medium saffiano leather satchel

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

  36. Electriq Tv Remote App

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

    Electriq Tv Remote App

    22 января 22 1:18

  37. Liverwurst Walmart

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

    Liverwurst Walmart

    22 января 22 3:06

  38. enco benchtop milling machine

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

  39. visit our website

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

    visit our website

    24 января 22 0:59

  40. official site

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

    official site

    24 января 22 23:13

  41. benchtop metal milling machine

    Сборка проектов с CMake. Введение в блоге Личный опыт разработки ПО

Оставить комментарий