Введення в cmake, savepearlharbor

CMake - кроcсплатформенная утиліта для автоматичного складання програми з вихідного коду. При цьому сама CMake безпосередньо складанням не займається, а представляє з себе front-end. Як back-end`a можуть виступати різні версії make і Ninja. Так само CMake дозволяє створювати проекти для CodeBlocks, Eclipse, KDevelop3, MS VC ++ та Xcode. Варто відзначити, що більшість проектів створюються не нативних, а все з тими ж back-end`амі.

Для того що б зібрати проект засобами CMake, необхідно в корені дерева початкових кодів розмістити файл CMakeLists.txt, який зберігає правила і цілі збірки, і зробити кілька простих кроків.
Розберемося на прикладах.

Приклад 1. Hello, World:

Для початку напишемо найпростіший хеловорлд:

і файл для збирання:

Створимо порожню директорію для тимчасових файлів і перейдемо туди.

$ Mkdir tmp
fshp @ panica-desktop:

$ Cd tmp /
fshp @ panica-desktop:

Тепер запустимо команду cmake, передавши їй як параметр шлях до папки з вихідними кодами:

/ Cmake / example_1 /
...
- Build files have been written to: / home / fshp / tmp
fshp @ panica-desktop:

/ Tmp $ ls
CMakeCache.txt CMakeFiles cmake_install.cmake Makefile
fshp @ panica-desktop:

Бачимо, що в папці з'явилося кілька тимчасових файлів, необхідних для складання проекту.
Тепер можна запустити безпосередньо make:

/ Tmp $ make
Scanning dependencies of target main
[100%] Building CXX object CMakeFiles / main.dir / main.cpp.o
Linking CXX executable main
[100%] Built target main
fshp @ panica-desktop:

/ Tmp $ ./main
Hello, World!
fshp @ panica-desktop:

Отже, наша програма зібралася.
Папку tmp можна очищати \ видаляти без ризику поламати вихідні. Якщо CMakeLists.txt був змінений, то виклик make автоматично запустить cmake. Якщо вихідні були переміщені, то потрібно очистити тимчасову директорію і запустити cmake вручну.

Приклад 2. Бібліотеки:

Змінні можуть зберігати списки значень, розділених пробілами \ табуляціями \ переносами:

Обидва варіанти правильні
Що б отримати значення змінної іпользуем конструкцію:

Отже, ця версія нашого проекту включає в себе одну статичну бібліотеку, яка збирається з початкових кодів. Якщо замінити «STATIC» на «SHARED», то отримаємо бібліотеку динамічну. Якщо тип бібліотеки й вказати, за замовчуванням вона збереться як статична.
При лінковке вказуються всі необхідні бібліотеки:

Як і при ручному компіляції, імена бібліотек вказуються без стандартного префікса «lib».

Приклад 3. Підпроекти:

Підпроекти дуже зручні, якщо ваша програма розбита на кілька бібліотек або ж проект складається з декількох програм.
Кожен підпроект є по суті повноцінним проектом і може використовуватися самостійно.
Тепер у нас «foo» знаходиться в субдірректоріі і там же знаходиться CMakeLists.txt підпроекту.

У файлі підпроекту нічого нового для вас немає. А ось в основному файлі нові команди:

main.cpp ми не змінювали, а foo.h перенесли. Команда вказує компілятору, де шукати заголовки. Може бути викликана кілька разів. Хідер будуть шукатися у всіх вказаних директоріях.

Вказуємо директорію з підпроектом, який буде зібраний як самостійний.

Приклад 4. Пошук бібліотек:

CMake володіє досить розвиненими засобами пошуку встановлених бібліотек, правда вони не вбудовані, а реалізовані у вигляді окремих модулів. У стандартному постачанні досить багато модулів, але деякі проекти (наприклад Ogre) постачають свої.
На debian модулі розташовуються в /usr/share/cmake-2.8/Modules/ (у вас версія може відрізнятися).

Думаю, сенс повинен бути зрозумілий. Перший і другий блок - пошук бібліотеки. Якщо в системі її немає, виведеться повідомлення про помилку і завершується виконання cmake. Третій блок схожий, тільки він шукає не цілий пакет бібліотек, а лише необхідний компонент. Кожен такий автоматизований пошук визначає після виконання як мінімум 3 змінні:
SDL_FOUND, LIBXML2_FOUND, Boost_FOUND - ознака присутності бібіліотека;
SDL_LIBRARY, LIBXML2_LIBRARIES, Boost_LIBRARIES - імена бібліотек для лінковки;
SDL_INCLUDE_DIR, LIBXML2_INCLUDE_DIR, Boost_INCLUDE_DIRS - шляхи до заголовним файлів.
Якщо з першими більш-менш зрозуміло, то другі і треті мені доставили багато клопоту - половина має імена в однині, половина - у множині. Але виявилося, це легко відстежити. У кожному модулі спочатку є коментарі, там описані визначаються змінні. Подивіться, наприклад, /usr/share/cmake-2.8/Modules/FindLibXml2.cmake

Приклад 5. Зовнішні статичні бібліотеки та об'єктні файли:

Зовнішні мається на увазі несистемні, що поставляються в бінарному вигляді.
Об'єктні файли в CMake стоять на ряду з кодами - досить включити об'ектнік в список файлів для компіляції.
З бібліотеками тугіше. Як відомо, статична бібліотека це не що інше, як ar-архів, у якому лежать звичайні об'ектнікі, неможливо пов'язані між собою. Ви, напевно, вже здогадалися, як я поступав спочатку. Так, просто патрав бібліотеку. Але потім був знайдений спосіб поелегантнее:

Слово «IMPORTED», вказує, що бібліотека береться ззовні.
У CMake кожна мета має має параметри, set_property дозволяє їх змінювати.
Лінкуются така бібліотека стандартно:

Генератори:

Як було сказано на початку, CMake вміє генерувати безліч різних видів проектів.
Якщо запустити cmake без параметрів, в кінці будуть описані доступні генератори. Користуватися так:

/ Cmake / example_3 / -G «KDevelop3 - Unix Makefiles»

висновок:

Чим сподобався CMake особисто мені:

  • один проект - один файл. Не потрібно зберігати купу скриптів настройки, збірки та іншого мотлоху;
  • Швидкість роботи в порівнянні з autotools;
  • простий і зрозумілий синтаксис;
  • є front-end`ом для безлічі IDE;
  • відображення прогресу - досить зручно;
  • кольоровий висновок - в сірі будні трохи фарби не завадить;

Для Sublime Text є плагін, який додає підсвічування синтаксису CMake, він так і називається - «CMake».
приклади

Схожі статті