Як саме працює CMake?


158

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

cmake_minimum_required (VERSION 2.6)
project(Tutorial)
add_executable(Tutorial tutorial.cpp)

і така маленька tutorial.cpp

int main() { return 0; } 

створено стільки файлів

CMakeCache.txt  cmake_install.cmake  Makefile
CMakeLists.txt  tutorial.cpp

і CMakeFilesпапку з такою кількістю файлів і папок

CMakeCCompiler.cmake               CMakeOutput.log    Makefile.cmake
cmake.check_cache                  CMakeSystem.cmake  progress.marks
CMakeCXXCompiler.cmake             CMakeTmp           TargetDirectories.txt
CMakeDetermineCompilerABI_C.bin    CompilerIdC        Tutorial.dir
CMakeDetermineCompilerABI_CXX.bin  CompilerIdCXX
CMakeDirectoryInformation.cmake    Makefile2

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

Якщо хтось знає, чи могли б ви пояснити це заради нащадків? Яке призначення цих файлів і коли я ввожу cmake ., що саме налаштовує і генерує cmake перед тим, як будувати проект?


1
Мені відомо про збірки без джерел. У випадку, якщо хтось не створив вихід з джерела і все ще шукає спосіб очищення згенерованих файлів, ця методика працює добре: stackoverflow.com/a/12055610/453673
Nav

3
Ось чудовий опис за адресою: aosabook.org/en/cmake.html і, ймовірно, глибока відповідь на питання (яке тут не можна коротко підсумувати).
парашувати

@SebTu Несправне посилання. Сторінки cmake.html не існує.
Nav

3
@Nav Yap, переплутав синтаксис розмітки, вибач. Таким чином, ось виправлена ​​версія: Людям, які знаходяться в режимі cmake, я дуже рекомендую читати архітектуру cmake . Він надає достатньо інформації, щоб відчути, як працює cmake, не втрачаючи себе в деталі.
SebNag

Відповіді:


92

Секрет у тому, що вам не доведеться розуміти, що роблять створені файли.

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

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

Коротше кажучи: Замість

cd <source_dir>
cmake .

завжди використовувати

cd <build_dir_different_from_source_dir>
cmake <source_dir>

замість цього. Зазвичай я використовую порожню підпапку buildу своєму вихідному каталозі як каталог збірки.

Щоб полегшити ваш біль, дозвольте мені коротко оглянути відповідні файли, які створює CMake:

  • Файли проекту / Makefiles - Що вас насправді цікавить: Файли, необхідні для складання проекту під обраним генератором. Це може бути все, від Unix Makefile до рішення Visual Studio.
  • CMakeCache.txt - це стійке сховище рядків ключ / значення, яке використовується для кешування значення між прогонами. Значення, що зберігаються тут, можуть бути шляхами до залежностей бібліотеки чи взагалі будувати необов'язковий компонент. Список змінних здебільшого ідентичний тому, який ви бачите під час запуску ccmakeабо cmake-gui. Це може бути корисним для перегляду час від часу, але я б рекомендував використовувати вищезгадані інструменти для зміни будь-яких значень, якщо це можливо.
  • Генеровані файли - це може бути що завгодно, від автогенерованих вихідних файлів до експорту макросів, які допоможуть вам повторно інтегрувати вбудований проект з іншими проектами CMake. Більшість із них генеруються лише на вимогу та не з’являться у простому проекті, такому, як у вашому питанні.
  • Все інше - це дуже багато шуму для задоволення системи збирання. Зокрема, мені ніколи не потрібно було піклуватися про те, що відбувається всередині CMakeFilesпідкаталогу.

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


Дякую. Відомий про вихідні версії, але, як бачите, метою цього питання було зрозуміти більше. Частина вашої відповіді CMakeCache.txt справді допомогла. Саме таке пояснення я шукав. Також останнє речення мого запитання: " що саме налаштовує та генерує cmake, перш ніж він будує проект "
Nav

1
CMakeFilesКаталог містить CMakeError.logі CMakeOutput.logважливий для усунення несправностей побудови CMake.
Серж Рогач

1
Дві речі, які іноді потрібно перевірити в CMakeFiles/target_name.dirкаталозі, - це файли flags.makeта link.txtфайли. Мені довелося перевірити їх у складному проекті, який успадкував прапори / пов'язані речі від проектів вище. Наприклад: у мене були деякі помилки, оскільки TPL A залежав від TPL B. Також мій проект мав залежність від B, який я встановив локально; але A використовував версію B з моєї системи (замість моєї локальної установки), яка мала різні включені параметри, і вона з’явилася першою, що спричинило помилки в моєму проекті. Лише переглядаючи link.txt, я зміг дізнатися, що це відбувається.
бартголь

13

Як зазначено на його веб-сайті:

Cmake - це крос-платформа, система з відкритим вихідним кодом для управління процесом збирання програмного забезпечення за допомогою незалежного від компілятора методу

У більшості випадків він використовується для генерування проектів / створення файлів - у вашому прикладі створено, Makefileякі використовуються для створення вашого програмного забезпечення (в основному на платформі Linux / Unix).

Cmake дозволяє надати файли для побудови крос-платформ, які б генерували конкретний проект / створювали файли для певної компіляції / платформи.

Наприклад, ви можете спробувати скомпілювати програмне забезпечення в Windows з Visual Studio, а потім з належним синтаксисом у вашому CMakeLists.txtфайлі можна запустити

cmake .

всередині каталогу вашого проекту на платформі Windows Cmake генерує всі необхідні файли проекту / рішення ( .slnтощо).

Якщо ви хочете створити своє програмне забезпечення на платформі Linux / Unix, ви просто перейдете до вихідного каталогу, де у вас є ваш CMakeLists.txtфайл, і запустити такий самий файл, cmake .і він створить усі необхідні файли, необхідні для створення програмного забезпечення за допомогою простого makeабо make all.

Тут ви маєте дуже гарну презентацію про основні функціональні можливості Cmake http://www.elpauer.org/stuff/learning_cmake.pdf

EDIT

Якщо ви хочете зробити залежну від платформи бібліотеку, включає / змінні визначення тощо, ви можете використовувати цей синтаксис у CMakeLists.txtфайлі

IF(WIN32)
   ...do something...
 ELSE(WIN32)
   ...do something else...
 ENDIF(WIN32)

Існує також багато команд, за допомогою яких ви можете запобігти виходу з ладу збірки, і на місці Cmake сповістить вас, що, наприклад, у вас немає збільшених бібліотек filesystemта regexвстановлених у вашій системі. Для цього можна використовувати наступний синтаксис:

find_package(Boost 1.45.0 COMPONENTS filesystem regex)

Перевіривши, що він буде генерувати файли для відповідної системи / IDE / компілятора.


1
Дякую Патрику. Корисна відповідь, але pdf, з яким ви посилаєтесь, пояснює здебільшого другий етап навчання CMake, який в основному є реалізацією CMake. Я запитую про пояснення першого етапу, де людина має зрозуміти, що на Землі відбувається в CMake!
Nav

@Nav Я трохи розширив свою відповідь. Ви можете шукати в Інтернеті додаткову інформацію.
Патрик

Це далеко не відповіді на поставлене запитання.
SenhorLucas

1

Як саме працює CMake, це питання для розробників, тому на це запитання тут не можна відповісти.

Однак ми можемо дати нам корисні рекомендації щодо того, коли ви повинні використовувати CMake і коли вам потрібно турбуватися про те, як він працює. Я не прихильник відповідей "о, це просто працює" - тому що, особливо в програмному забезпеченні, НІКОЛИ ніколи "просто не працює", і вам ВЖЕ завжди доводиться потрапляти в деталі, що містять гострий смак.

CMake - це промислово міцний інструмент. Він автоматизує декілька ДУЖЕ складних процесів і враховує багато змінних, про які ви можете не знати, особливо як досить новий розробник, ймовірно, працюючи з обмеженими знаннями всіх операційних систем та інструментів побудови, якими може працювати CMake. Причина, що створюється так багато файлів, і чому речі здаються настільки складними, це тому, що всі ці інші системи є складними і їх потрібно враховувати та автоматизувати. Крім того, існують проблеми "кешування" та інші функції економії часу, щоб зрозуміти все в CMake означало б розуміння всього цього інструментів побудови та ОС та всіх можливих комбінацій цих змінних, що, як ви можете уявити, неможливо.

Важливо зауважити, що якщо ви не відповідаєте за керування великою системою збірки між платформами, а ваша база коду - кілька KLOC, можливо, до 100KLOG, використання CMake здається трохи схожим на використання 100 000 доларів видалення лісового дерева машина для видалення бур’янів з 2-х футового квітника. (До речі, якщо ви ніколи не бачили такої машини, вам слід шукати її на YouTube, вони дивовижні)

Якщо ваша система збирання невелика і проста, то, швидше за все, буде краще просто написати власні файли вручну або скласти сценарій самостійно. Коли ваші файли стануть непростими або вам потрібно створити версію вашої системи на іншій платформі, ви можете перейти на CMake. У цей момент у вас виникне багато проблем, щоб вирішити, і ви можете задати більш цілеспрямовані питання щодо цього. Тим часом перегляньте кілька чудових книг, які були написані про CMake, а ще краще - напишіть самі! 8)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.