вівторок, 26 липня 2011 р.

Система CMake - частина 1

Ось мій варіант тесту для справжнього програміста: що найнеприємніше не знайти? Кредитку, корою щойно розплачувався в ресторані, телефон прекрасної дівчини, з якою вчора познайомився в метро або файл збірки проекту для тієї системи, в якій працюєш? Зрозуміло, жодна з цих проблем не варта того, щоб робити з неї трагедію. Навіть якщо хтось зуміє скористатися вашою кредиткою, гроші, швидше за все, вдасться повернути, над втратою випадкового телефонного номера теж горювати варто - хто знає, може воно й на краще, а відсутній файл збірки проекту можна відновити, за умови, що ви розумієте структуру проекту і у вас під рукою є відповідні інструменти.

Програмісти, що працюють в Linux (та й в інших Unix-системах) традиційно використовують для збірки програм інструментарій GNU build system (який складається з утиліт autoconf , automake, libtool, gnulib). Саме за допомогою GNU build system створюються знайомі всім нам файли configure, за допомогою яких ми генеруємо make-файли для збірки додатку. Система GNU build system настільки тісно пов'язана з історією Linux і інших відкритих проектів, що «мантра» configure - make - make install розглядається деякими Unix-програмістами як єдино вірний спосіб установки ПЗ. До недоліків GNU build system можна віднести її орієнтацію на інструментарій розробника GNU (GNU make, GCC і т.п.), який дуже популярний на відкритих Unix-платформах, але не популярний в інших середовищах. Прагнучи заповнити цю прогалину, розробники з компанії Kitware створили свій власний варіант крос-платформового генератора складальних файлів - CMake - (cross-platform make).

Система CMake обрана в якості стандартного засобу збирання KDE 4, і вже по одній цій причині заслуговує нашої уваги. Але у CMake є і власні переваги. Перш за все, CMake є по-справжньому крос-платформовим генератором проектів, що дозволяє створювати єдині описи проектів для Windows, Linux та інших Unix-систем (включаючи Mac OS X). Зупинимося на цьому детальніше. Важлива відмінність Windows від Linux (з точки зору розробника) полягає в тому, що на платформі Windows немає єдиного стандарту складальних файлів. MS Visual Studio використовує свої файли проектів, C++ Builder - свої, MinGW - свої. Перевага CMake в тому, що ця система здатна генерувати «рідні» складальні файли для всіх перерахованих засобів розробки (як і для багатьох інших). Крім того, CMake прагне максимально використовувати фірмові засоби генерації складальних файлів - наприклад, для генерації складальних файлів проекту Qt використовується qmake. Крім іншого CMake володіє інтелектуальною системою пошуку інструментів побудови та бібліотек на конкретній платформі (інтроспекція) і автоматичного конфігурування. Завдяки цьому система CMake сама встановлює багато параметрів складальних файлів, які в інших системах управління збіркою доводиться встановлювати вручну. Наприклад, в ОС Linux CMake сам знайде директорію, в якій ви встановили потрібний програмі набір віджетів, а під Windows вам не доведеться вказувати CMake, де встановлені Visual Studio або C++ Builder. Все це робить пакет CMake дуже простим і зручним у використанні.

Хоча в цих статтях ми будемо розглядати роботу CMake в основному на прикладі програм, написаних на C++, CMake може стати в нагоді і тим, хто пише на Java (а також на багатьох інших мовах).

Схематично роботу CMake можна описати таким чином: для складання програми створюється файл CMakeLists.txt, в якому описуються параметри збірки (розташування файлів вихідних текстів, необхідні зовнішні модулі, цілі збірки). Далі цей файл передається утиліті cmake. Результатом роботи cmake є файл, що містить інструкції складання програми для конкретної платформи (make-файл GNU make, файл проекту Visual Studio і т.д.). Суть ідеї полягає в тому, що опис процесу складання у файлі CMakeLists.txt абстраговано як від конкретних особливостей окремих систем (розташування файлів, можливості компіляторів), так і цілих платформ. Читаючи загальний опис процесу складання з файлу CMakeLists.txt, програма cmake створює файл інструкцій збірки, що враховує специфіку конкретної системи./*далі не відредаговано*/

Як же програмі CMake вдається бути такою «розумною»? В основі CMake лежить потужна мова сценаріїв, який використовується як в файлах CMakeLists.txt, так і в спеціальних сценаріях - модулях. Саме в модулях реалізовані такі функції CMake, як пошук файлів і перевірка можливостей системи. Файли модулів розташовані в піддиректорії Modules директорії cmake. Файли модулів можна розділити на три категорії. Одні файли призначено для налаштування роботи системи на конкретній платформі (Linux, Winodws, Mac OS, BeOS і т.д.). Друга група модулів призначена для виконання інтелектуального пошуку засобів розробки і різних допоміжних утиліт, а також для перевірки можливостей цих коштів. Третя група модулів виконує пошук і перевіряє параметри різних бібліотек, необхідних окремим програмам. Важливу роль у роботі CMake грають так само файли шаблонів для генерації різних файлів збірки. Оскільки файли модулів і шаблонів відокремлені від самої утиліти cmake і написані тією ж мовою сценаріїв, що і файли опису збірки, розширити можливості CMake дуже просто. CMake 2.6 поставляється з трьома сотнями модулів, які адаптують CMake для роботи з безліччю різних інструментів, починаючи з компіляторів C++ та Fortran, інтерпретаторів Perl і Python і закінчуючи такими бібліотеками як OpenSceneGraph, SDL, Qt 4 і wxWidgets . Файли модулів поставляються не тільки з дистрибутивами CMake, а й разом з дистрибутивами деяких бібліотек, розробники яких вже зацікавлені в підтримці CMake.

Хоча основні переваги CMake пов'язані з крос-платформенностью, що і відображено в назві пакету, простота роботи з різними бібліотеками може сдлеать CMale корисним і для Linux-проектів, які не передбачають перенесення на інші платформи. Завдяки CMake ви отримуєте простий і стандартний спосіб складання додатків, що використовують Qt, KDE, GTK +, wxWidgets ...

Приступаючи до роботи

Всі приклади, розглянуті в цих статтях, орієнтовані на CMake 2.6 або більш пізніх версій. Якщо у вас встановлена ​​більш рання версія CMake, поновіть її - це нескладно (скачати останню версію CMake можна з сайту www.cmake.org). Хоча виклад у цих статтях орієнтоване, в основному, на Linux-програміста, ми не будемо нехтувати крос-платформеними можливостями CMake, так що якщо ви все ще користуєтеся ОС з Редмонда, рекомендується встановити CMake і на неї теж. Для вивчення крос-платформних можливостей CMake ми скористаємося крос-платформних набором віджетів wxWidgets (останню версію оного я теж рекомендую встановити на всі ваші платформи з сайту wxwidgets.org). Якщо ви ніколи не програмували в wzxWidgets і не мають наміру робити цього надалі, то я можу вас заспокоїти - ми не будемо займатися програмуванням wxWidgets. Ми зараз вивчаємо систему збірки програм, а не їх написання, тому в якості навчального матеріалу нам цілком підійдуть численні приклади готових програм, що входять до складу дистрибутива wxWidgets. Оскільки ми практично не будемо торкатися внутрішньої начинки цих програм, майже всі наші рекомендації та інструкції можна розглядати як універсальні, що застосовуються при роботі з будь-якою іншою бібліотекою віджетів. Нашим основним засобом розробки буде, природно GCC, а в огляді перенесення проектів під Windows ми розглянемо (дуже побіжно) збірку проектів за допомогою Visual Studio і C + + Builder.

Перший приклад

У директорії samples дистрибутива wxWidgets знайдіть піддиректорію minimal. Ця піддиректорії містить мінімальний приклад програми wxWidgets. У піддиректорії minimal містяться також файли збірки додатку на всі випадки життя, а от файлу CMakeLists.txt в ній немає. Ми виправимо це упущення. Нижче наводиться вихідний текст файлу CMakeLists.txt (який ви знайдете на диску) для програми minimal. Для спрощення роботи файл CMakeLists.txt розміщується в тій же директорії, що і вихідні тексти програми.

project (minimal) cmake_minimum_required (VERSION 2.6) set (wxWidgets_USE_LIBS base core) find_package (wxWidgets REQUIRED) include ($ {wxWidgets_USE_FILE}) set (minimal_SRCS minimal.cpp) if (WIN32) set (minimal_SRCS $ {minimal_SRCS} minimal.rc) endif (WIN32) add_executable (minimal WIN32 $ {minimal_SRCS}) target_link_libraries (minimal $ {wxWidgets_LIBRARIES})

Ті, кому відразу не терпиться спробувати, можуть скомандувати в директорії minimal

cmake. /

після чого викликати make. Процес складання за допомогою make-файлу, згенерованого CMake, виглядає досить барвисто (рис. 1).

Малюнок 1. Make-файли CMake в консолі Linux.

Після закінчення збірки можна скомандувати

minimal

і подивитися на роботу програми, яку ми не написали, але зібрали (рис. 2).

Рисунок 2. Додаток wxWidgets під Linux.

Перш ніж розбирати цей приклад, розглянемо коротко структуру мови сценаріїв CMake. Протягом усіх наступних статей ми, в основному будемо займатися вивченням цієї мови. Елементи мови сценаріїв CMake можна розділити на три категорії: змінні, властивості і команди. Змінні грають у проектах CMake таку ж важливу роль, як і у файлах make. Налаштування параметрів збірки проекту виконується, в основному, шляхом присвоєння змінним різних значень. За допомогою властивостей проект CMake отримує різні відомості про стан системи, для якої генеруються складальні файли. Властивості можна розглядати як змінні, доступні лише для читання. Значення властивостей встановлюються середовищем CMake. Команди, як ви, звичайно, здогадалися, виконують різні дії із змінними і властивостями CMake і керують процесом генерації файлів збірки. Важливою особливістю мови CMake є його розширюваність. Модулі CMake, про які говорилося вище, дозволяють визначати нові змінні, властивості і команди. Саме завдяки розширюваності мови CMake цей пакет може використовуватися для складання таких різних проектів.

Де знайти документацію

Загальний опис синтаксису мови CMake можна знайти в інтернеті на сторінці cmake.org / HTML / Documentation.html . Там же є посилання на паперову книгу Bill Hoffman, Mastering CMake (наскільки я знаю, російською мовою не видавалася). Що стосується розширень CMake, описи багатьох з них входять в стандартну документацію. Опис інших розширень слід шукати на сайтах тих проектів, для яких вони призначені.

Не слід думати, що розширення мови CMake надмірно його ускладнюють. Базовий набір команд змінних і властивостей мови не дуже великий, а розширення, як правило, пов'язані з конкретними пакетами, середовищами та платформами розробки. Якщо ви не ставите перед собою мету стати ерудитом в області CMake, вам потрібно буде знати тільки ті розширення, які потрібні для використовуваних вами інструментів, а їх, як правило, теж не багато.

Перейдемо тепер до розгляду файлу CMakeLists.txt. Опис збірки починається з команди project ()

Команда project () задає ім'я проекту, а також дозволяє вказати (як необов'язкового параметра) мова програмування. Як ім'я проекту ми вибираємо ім'я модульна програми (це не обов'язкове правило CMake, але так зручніше). Мова програмування (С, CXX, Java) можна не вказувати. У цьому випадку CMake спробує «вгадати» мову по розширень файлів вихідних текстів. Команда project () - не просто елемент оформлення файлу CMakeLists.txt. Крім іншого, ця команда визначає змінні projectname_SOURCE_DIR і projectname_BINARY_DIR. Як неважко здогадатися, ці змінні містять імена директорії вихідних тестів (звичайно та ж директорія, в якій розташований файл CMakeLists.txt) і директорії в якій буде збережений результат збірки. Файли програм за замовчуванням збираються в тій же директорії, де розташований файл CMakeLists.txt, а файли бібліотек - в піддиректорії lib цієї директорії.

З великої літери чи з маленької?

Мова CMake має часткової регістрозалежному незалежністю. Імена команд не залежать від регістру (IF (), If (), if () і iF () - одна й та ж команда), у той час як імена властивостей і змінних - залежать. У зв'язку з регістру незалежністю імен команд виникає запитання, як правильніше писати - великої літери, з маленькою або повністю заголовними буквами. Різні автори пишуть по-різному (в документації CMake імена команд пишуться повністю малими буквами, а в багатьох файлах CMake, написаних самими розробниками - великими). Особисто я пишу імена команд з маленької літери, і буду дотримуватись цього принципу в статтях цієї серії.

Команда cmake_minimum_required () дозволяє встановити мінімальний номер версії CMake, необхідний для складання проекту. Ця команда не є обов'язковою, але вона дуже корисна, якщо файл CMakeLists.txt використовує можливості, що з'явилися в останній версії CMake, яка поки що встановлена ​​не у всіх. Якщо встановлена ​​в системі версія CMake не відповідає мінімальним вимогам файлу CMakeLists.txt, буде видано повідомлення про помилку.

Наступна команда, set (), є однією з найбільш часто використовуваних команд в файлах CMake. Команда set () дозволяє присвоювати значення змінним. Першим аргументом команди повинно бути ім'я змінної (якщо змінної з цим ім'ям раніше не існувало, вона буде створена), далі йде список значень, що присвоюються змінної (однієї змінної можна привласнити відразу кілька значень). Наприклад, в команді

set (wxWidgets_USE_LIBS base core)

Ми присвоюємо змінної wxWidgets_USE_LIBS (яка повинна містити список необхідних програмі модулів wxWidgets) значення base і core. Змінні CMake можна використовувати рекурсивно, тобто додавати нові значення до списку вже наявних, як наприклад, у рядку

set (minimal_SRCS $ {minimal_SRCS} minimal.rc)

де до значень змінної minimal_SRCS додається ще одне значення. Зверніть увагу на конструкцію $ {ім'я_змінної}. Отак конструкція дозволяє отримати значення змінної з вказаним ім'ям (без символу $ і фігурних дужок CMake «не зрозумів» б, що тут мається на увазі ім'я змінної). Правила використання імен і значень змінних в CMake схожі на правила для змінних оточення в сценаріях оболонки.

Команда find_package () - одна з найважливіших команд CMake. У наступній статті ми зупинимося на цій команді докладніше, зараз скажемо тільки, що find_package () завантажує розширення CMake. У нашому прикладі завантажується розширення wxWidgets, призначене для генерації файлів збірки програм, що використовують wxWidgets. Важливо підкреслити, що команда find_package () не шукає самі бібліотеки, вона тільки завантажує розширення CMake. Пошук бібліотек, визначення їх версій та інші дії, пов'язані з бібліотеками, виконує завантажене розширення. Природно, що оскільки система CMake сама не виконує складання додатків, бібліотеками вона «цікавиться» лише з точки зору генерації інструкцій для складальних файлів. У нашому прикладі команда find_package () викликається з опцією REQUIRED. тим самим ми вказуємо CMake, що якщо розширення для роботи з wxWidgets не знайдено, генерація файлів, необхідних для складання програми, виконуватися не може.

Команда add_executable () відноситься до числа команд, які встановлюють цілі збірки. Дана команда вказує, що метою складання є здійснимий файл програми. Якби ми збирали бібліотеку, слід було б використовувати команду add_library (). Команда add_executable () дозволяє вказати ім'я зібраного файлу і пов'язати з ним вихідні тексти. Зверніть увагу на опцію WIN32, передану команді add_executable (). Цю опцію потрібно згадати для того, щоб при генерації файлів збірки на платформі Windows були створені файли збірки графічного програми (а не консольного, як це буде за замовчуванням). В Linux немає принципової різниці між структурою исполнимого файлу графічної і консольної програми (в Widows - є, цікавляться читачів відсилаю до відповідної літератури). Як же відреагує CMake для Linux на присутність опції WIN32? правильна відповідь - ніяк, пакет її просто проігнорує. Крім файлів програм і бібліотек у проектах CMake можна вказувати і інші цілі, наприклад, встановлення та упаковку додатків.

Остання команда файлу target_link_libraries () вказує CMake, які інструкції слід додати в складальний файл для підключення до проекту сторонніх бібліотек. Перший аргумент команди - мета, визначена вище командою add_executable () (взагалі кажучи, цілей складання може бути декілька), далі йде список зовнішніх бібліотек, яких потребує ця мета. У нашому прикладі цей список зберігається у змінній wxWidgets_LIBRARIES, визначеної в розширенні wxWidgets. На вміст змінної wxWidgets_LIBRARIES впливає мінлива wxWidgets_USE_LIBS, ось чому значення цієї змінної слід присвоїти до звернення до команди find_package ().

Збірка c допомогою CMake на платформі Windows

Наш файл CMakeLists.txt вже містить деякі елементи, які повинні стати в нагоді при генерації складальних файлів під Windows. Проте, на цій платформі нас чекають деякі складності. Викликані ці складності тим, що файлова система Windows набагато більш хаотична, ніж файлова система Linux. В Unix-системах існують стійкі традиції щодо того, де повинні бути розташовані ті чи інші файли. Наприклад, файли поділюваних бібліотек слід шукати (і встановлювати) в директоріях / lib, / usr / lib, / usr / local / lib. У Windows плутанини набагато більше. Файли тих же поділюваних бібліотек можуть розташовуватися або в системних каталогах Windows, або у власних каталогах програм. На додаток до цього файлова система Windows не має спільного кореня, як це прийнято в Unix-систм. Всі ці особливості призводять до того, що під Windows пакету CMake набагато важче знайти місця розташування необхідних бібліотек. Беручи до уваги цей факт, а також те, що консоль в Windows набагато менш популярна, в середовищі Windows рекомендується використовувати спеціальну утиліту з графічним інтерфейсом (рис. 3). Така ж програма є і в пакеті CMake для Linux, але в нашій улюбленій ОС зручніше користуватися консоллю.

Малюнок 3. CMake GUI для Windows.

Головне завдання CMake GUI - генерація файлів збірки додатку на основі файлів CMakeLists.txt для різних засобів збирання, використовуваних на платформі Windows. Попутно ця утиліта дозволяє присвоїти значення деяким змінним CMake, для яких сам пакет CMake не зміг знайти відповідні значення (або «не впевнений» в їх правильності). Зазначимо, що ці додаткові настройки впливають на одержувані в результаті генерації файли збірки, але не впливають на вміст самого файлу CMakeLists.txt.

Генерація файлів збірки з допомогою CMake GUI складається з двох етапів: настройки і власне генерації. Перша операція виконується за командою Configure, друга - за командою Generate. У процесі конфігурації утиліта дозволяє вам вибрати середовище розробки з досить значного списку і налаштувати значення «сумнівних» змінних. В процесі генерації утиліта може виявити синтаксичні помилки у файлі CMakeLists.txt. Якщо в якості цільової середовища збірки обрано середовище Visual Studio, CMake для Windows генерує файл ALL_BUILD.vcproj. Якщо метою є компілятор Borland C + +, в результаті створюється make-файл для консольної версії компілятора (рис. 4).

Малюнок 4. Консольна збірка під Windows виглядає майже так само, як і під Linux. Ось вона, крос-платформенность! ;)

Виконаємо збірку, ми отримуємо той же додаток, що і під Linux (рис. 5)

Малюнок 5. Програма minimal, Windows-версія.

У цій статті ми лише побіжно ознайомилися з мовою CMake. У следующнй статті нас чекає більш детальне знайомство зі змінними і командами мови CMake, а так само з ключами, що дозволяють управляти консольним варіантом програми.

Приклад проекту CMake для цієї статті

10 коментарів:

  1. That is the benefit of owning a bowflex, it can be the ease of having
    all those people exercise out there to you personally in just one device, within a compact minimal room like your basement alternatively of a public health and fitness center.


    Have a look at my weblog Wholesale Fitness Equipment

    ВідповістиВидалити
  2. It is a specified reality that people nowadays tend to be more
    mindful with their excess weight or how they look and so that they vacation resort to training.


    My blog - alternating dumbbell Curls

    ВідповістиВидалити
  3. It truly is just as if they sense all other exercising and food plan
    systems undoubtedly are a waste of your respective time when it really is specified that committed usage of
    the Treadclimber, Revolution or other Bowflex products will assure weight
    loss and long lasting advancements for your wellness.


    Take a look at my homepage: Report abuse

    ВідповістиВидалити
  4. The goal of cardio exercise routines is to have the coronary heart level up to a certain amount.


    Here is my site: related resource site

    ВідповістиВидалити
  5. Cheaply created dumbbells are significantly less highly-priced that significant brand
    names, nevertheless they may well also be dangerous.


    Feel free to surf to my website :: http://www.getfitnstrong.com/

    ВідповістиВидалити
  6. Exercising is one of the real key distinctions containing aided
    me stay with this life style.

    Also visit my homepage - SITEMAP

    ВідповістиВидалити
  7. Examples from the excellent and meticulous manufacturing process that StairMaster
    religiously employs could be viewed by their impressive line of stair steppers.


    My blog: dumbbell sets

    ВідповістиВидалити
  8. Apart from this, furthermore, it enables you to instantly improve your resistance as
    reported by your personal tastes.

    Feel free to surf to my weblog - bowflex selecttech dumbbells

    ВідповістиВидалити
  9. Applying the tread climber your toes are no cost so the
    sensation of remaining strapped in is simply not there and you also experience as though you're really climbing a hill when you drop fat.

    Review my blog - Continue Reading

    ВідповістиВидалити
  10. This is certainly the best option for people who lives in compact houses and apartments and nonetheless
    wish to opt for energy physical exercise.

    Feel free to surf to my site - dumbbells for sale

    ВідповістиВидалити