Lyx document

1 Приклад використання CМake

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

Є три каталогу. Каталог верхнього рівня має два підкаталогу з іменами ./Demo і ./Hello. В каталозі ./Hello, збирається бібліотека. В каталозі ./Demo, збирається виконуваний файл, що сполучається з бібліотекою. Всього створюється три файли CMakeList.txt: по одному на каталог.

Lyx document

По-перше, каталог верхнього рівня містить наступний файл CMakeLists.txt.

# Ім'я проекту - "HELLO". Файли CMakeLists в цьому проекті можуть посилатися

# На кореневої каталогу початкових кодів цього проекту на ім'я $ і

# На кореневий каталог з скомпілірованимі файлами цього проекту на ім'я

# З'єднуємо виконуваний файл з бібліотекою Hello.

target_link_libraries (helloDemo Hello)

Lyx document

При виконанні CMake в каталозі верхнього рівня він розбирає CMakeLists.txt, а потім занурюється в перераховані підкаталоги. Змінні, шляхи пошуку заголовків файлів, шляхи пошуку бібліотек, і т.д. успадковуються. Залежно від ОС створюються: для систем Unix make-файли або для MSVC файли проектів workspaces / projects. Створені файли потім можуть бути використані звичайним способом для компіляції коду.

2 Практичне заняття по CMake

Нижче наведено покроковий урок, який охоплює загальні питання системи збирання, які допомагає вирішувати CMake. Багато з цих тем представлені в Mastering CMake як окремі питання, але може бути дуже корисно побачити, як всі вони працюють разом в прикладі проекту. Це керівництво можна знайти в каталозі Tests / Tutorial дерева вихідного коду CMake. Кожен крок має свій власний підкаталог, що містить повну копію уроку для цього кроку.

2.1 Відправна точка (Крок 1)

Найпростіший проект побудований з виконуваних файлів вихідного коду. Для простих проектів два рядки в CMakeLists файлі це все що потрібно. Це буде відправною точкою для нашого уроку. CMakeLists файл виглядає так:

cmake_minimum_required (VERSION 2.6)

Зверніть увагу, що цей приклад використовує символи нижнього регістра для команд в файлі CMakeLists. CMake підтримує команди, набрані символами в верхнього, нижнього і змішаного регістра. Вихідний код для tutorial.cxx буде обчислювати квадратний корінь з числа та перший варіант, він дуже простий:

// Проста програма, яка обчислює квадратний корінь числа

int main (int argc, char * argv [])

Основними змінами є включення заголовки TutorialConfig.h і висновок на друк номера версії, як частини інформації по використанню.

2.2 Додавання бібліотеки (Крок 2)

Зараз ми додамо бібліотеку до нашого проекту. Ця бібліотека буде містити нашу реалізацію визначення значення квадратного кореня. Виконуваний файл потім зможе використовувати цю бібліотеку замість стандартної функції, що забезпечується компілятором. Для цього уроку ми розмістимо бібліотеку в підкаталозі з ім'ям MathFunctions. Цей каталог буде містити CMakeLists файл, який має в своєму складі один рядок:

Вихідний файл Mysqrt.cxx має одну функцію з ім'ям mysqrt, яка забезпечує ті ж функціональні можливості функції sqtr компілятора. Щоб скористатися новою бібліотекою ми додаємо виклик add_subdirectory в файл CMakeLists верхнього рівня, це забезпечить побудову бібліотеки. Ми також додаємо інший каталог для включення заголовки MathFunctions / mysqrt.h, щоб система збирання змогла знайти прототип нашої реалізації функції. Остання зміна полягає в додаванні нової бібліотеки в виконуваний файл. Останні кілька рядків верхнього рівня CMakeLists файлу тепер виглядає так:

# Add the executable

add_executable (Tutorial tutorial.cxx)

target_link_libraries (Tutorial MathFunctions)

Розглянемо тепер питання про створення бібліотеки MathFunctions як опціональною. У цьому уроці немає дійсно будь-яких причин робити це, але у великій бібліотеці або бібліотеках, які покладаються на сторонній код Ви могли б цього хотіти. Першим кроком є ​​додавання опції верхнього рівня файлів CMakeLists.

# Should we use our own math functions?

option (USE_MYMATH "Use tutorial provided math implementation" ON)

Опція буде відображатися в CMake GUI і мати за замовчуванням значення ON, так що користувач зможе змінювати її за своїм бажанням. Ця настройка буде збережена в кеші, так що користувачеві не потрібно кожного разу міняти налаштування при запуску CMake цього проекту. Наступна зміна, дозволить виконувати зв'язування з бібліотекою MathFunctions опціонально. Для цього ми змінюємо конц файлу CMakeLists верхнього рівня, щоб від виглядав наступним чином:

# Add the MathFunctions library?

set (EXTRA_LIBS $ MathFunctions)

# Add the executable

add_executable (Tutorial tutorial.cxx)

При цьому використовується змінна USE_MYMATH для визначення того, повинна-ли бібліотека MathFunctions компілюватиметься і використовуватися. Зверніть увагу на використання змінної (EXTRA_LIBS в даному випадку), вона використовується тут щоб зібрати будь-які додаткові бібліотеки, які пізніше будуть пов'язані в виконуваному файлі. Це загальний підхід використовується для підтримки великих проектів з великою кількістю додаткових компонентів. Відповідні зміни в вихідному коді досить прості:

// A simple program that computes the square root of a number

int main (int argc, char * argv [])

fprintf (stdout, "% s Version ... \ n", argv [0], Tutorial_VERSION_MAJOR, Tutorial_VERSION_MINOR);

fprintf (stdout, "Usage:% s number \ n", argv [0]);

double inputValue = atof (argv [1]);

double outputValue = mysqrt (inputValue);

double outputValue = sqrt (inputValue);

fprintf (stdout, "The square root of% g is% g \ n", inputValue, outputValue);

У вихідному коді ми також використовуємо USE_MYMATH. Це забезпечується при передачі даних з CMake в вихідний код через конфігураційний файл TutorialConfig.h.in шляхом додавання в нього наступного рядка:

2.3 Установка і тестування (Крок 3)

Для наступного кроку ми додамо правила установки і підтримку тестування в наш проект. Правила установки є досить простими. Щоб для бібліотеки MathFunctions встановити власне бібліотеку та заголовки, необхідно додати такі два рядки в файл MathFunctions 'CMakeLists:

install (TARGETS MathFunctions DESTINATION bin)

install (FILES MathFunctions.h DESTINATION include)

Для програми необхідно додати в файл CMakeLists верхнього рівня наступні рядки коду для установки виконуваного файлу і настройки заголовки:

# Add the install targets

install (TARGETS Tutorial DESTINATION bin)

# Додамо головну бібліотеку

add_library (MathFunctions mysqrt.cxx $ / Table.h)

По-перше, додаємо виконуваний файл для MakeTable, він додається як і будь-який інший виконуваний файл. По-друге, ми додаємо призначену для користувача команду, яка визначає, як виробляти Table.h, запустивши на виконання MakeTable. По-третє, ми повинні дати знати CMake, що mysqrt.cxx залежить від генерованого файлу Table.h. Це робиться шляхом додавання згенерованого файлу Table.h в список джерел для бібліотеки MathFunctions. Ми також повинні додати поточний двійковий каталог в список включаються каталогів, так що файл Table.h зможе бути знайдений і включений mysqrt.cxx.

Якщо запустити проект на побудову він спочатку буде будувати виконуваний файл MakeTable. Потім він запустить MakeTable для генерації файлу Table.h. Нарешті, він скомпілює файл mysqrt.cxx, що включає в себе Table.h для генерації бібліотеки MathFunctions.

У цьому місці файл CMakeLists верхнього рівня буде виглядати так:

cmake_minimum_required (VERSION 2.6)

set (Tutorial_VERSION_MAJOR 1)

set (Tutorial_VERSION_MINOR 0)

# Має-ли ця система обидві функції log і exp?

check_function_exists (log HAVE_LOG)

check_function_exists (exp HAVE_EXP)

# Should we use our own math functions

option (USE_MYMATH "Use tutorial provided math implementation" ON)

# Configure a header file to pass some of the CMake settings

# To the source code

# Add the binary tree to the search path for include files

# So that we will find TutorialConfig.h

# Add the MathFunctions library?

set (EXTRA_LIBS $ MathFunctions)

# Add the executable

add_executable (Tutorial tutorial.cxx)

# Add the install targets

install (TARGETS Tutorial DESTINATION bin)

# Does the application run

add_test (TutorialRuns Tutorial 25)

# Does the usage message work?

add_test (TutorialUsage Tutorial)

#define a macro to simplify adding tests

macro (do_test arg result)

add_test (TutorialComp $ Tutorial $)

# Do a bunch of result based tests

do_test (4 "4 is 2")

do_test (9 "9 is 3")

do_test (5 "5 is 2.236")

do_test (7 "7 is 2.645")

do_test (25 "25 is 5")

do_test (-25 "-25 is 0")

do_test (0.0001 "0.0001 is 0.01")

файл TutorialConfig.h.in виглядає наступним чином:

// the configured options and settings for Tutorial

#define Tutorial_VERSION_MAJOR @ Tutorial_VERSION_MAJOR @

#define Tutorial_VERSION_MINOR @ Tutorial_VERSION_MINOR @

install (TARGETS MathFunctions DESTINATION bin)

install (FILES MathFunctions.h DESTINATION include)

2.6 Складання і Установник (Крок 6)

Припустимо далі, що ми хочемо поширити наш проект іншим людям, щоб вони могли використовувати його. Ми хочемо надати розповсюджувати вихідний код і скомпільований код для різних платформ. Це злегка відрізняється від того, що ми робили раніше в розділі Установка і тестування (Крок 3) 2.3. де ми виконували установку бінарних файлів, які у нас були побудовані з вихідного коду. У цьому прикладі ми будемо будувати установочні пакети, які підтримують бінарний пакет установки і функції управління, які містяться в Cygwin, Debian, RPM і т.д. Для досягнення цього ми будемо використовувати CPack, який створює платформу конкретних установників, як описано в главі Упаковка з CPack. Зокрема, нам потрібно додати кілька рядків в нижній частині нашого файлу CMakeLists.txt верхнього рівня.

# Build a CPack driven installer package

set (CPACK_RESOURCE_FILE_LICENSE "$ / License.txt")

Ось і все, що потрібно зробити. Ми починаємо з включення InstallRequiredSystemLibraries. Цей модуль буде включати в себе будь-які динамічні бібліотеки, які необхідні в рамках проекту для поточної платформи. Потім ми встановлюємо деякі змінні CPack, де ми зберегли ліцензію і інформацію про версію для даного проекту. Інформація про версію використовує змінні, які ми визначили раніше в цьому уроці. Нарешті ми включаємо CPack модуль, який буде використовувати ці змінні і деякі інші властивості системи, на яку ви налаштували програму встановлення.

Наступним кроком є ​​створення проекту в звичайному порядку, а потім запуск CPack на ньому. Для створення бінарного дистрибутива треба виконати:

cpack -C CPackConfig.cmake

Для створення дистрибутива ви повинні ввести

cpack -C CPackSourceConfig.cmake

2.7 Додавання підтримки для панелі управління (Крок 7)

Додавання підтримки для подання наших результатів тесту на приладовій панелі виконується досить просто. Ми вже визначили ряд випробувань для нашого проекту в попередніх кроках цього уроку. Ми просто повинні запустити ці тести і представити їх на приладовій панелі. Щоб включити підтримку панелей ми включаємо CTest модуль верхнього рівня в нашому файлі CMakeLists.

# Включити панель сценаріїв

Ми також створюємо CTestConfig.cmake файл, в якому можна вказати назву цього проекту для приладової панелі.

set (CTEST_PROJECT_NAME "Tutorial")

Схожі статті