Відповіді:
Make (а точніше Makefile) - це складова система - вона керує компілятором та іншими інструментами побудови для створення вашого коду.
CMake - це генератор будівельних систем. Він може створювати Makefiles, він може створювати файли збирання Ninja, він може створювати проекти KDEvelop або Xcode, він може створювати рішення Visual Studio. З тієї ж відправної точки, той самий файл CMakeLists.txt. Отже, якщо у вас є проект, незалежний від платформи, CMake - це спосіб зробити його незалежним від побудови системи.
Якщо у вас є розробники Windows, які використовували розробники Visual Studio та Unix, які клянуться GNU Make, CMake - це один із способів.
Я завжди рекомендую використовувати CMake (або інший генератор будівельних систем, але CMake - це моє особисте уподобання), якщо ви плануєте, щоб ваш проект був багатоплатформним або широко використовувався. Сам CMake також надає деякі приємні функції, такі як виявлення залежності, управління інтерфейсом бібліотеки або інтеграція з CTest, CDash та CPack.
Використання генератора будівельних систем робить ваш проект більш стійким до майбутнього. Навіть якщо ви зараз GNU-Make-only, що робити, якщо згодом ви вирішите розширитись на інші платформи (будь то Windows чи щось вбудоване) або просто хочете використовувати IDE?
find_package()
) або підтримка тестування / упаковки.
Заява про те, що CMake є "генератором побудови" є поширеною помилковою думкою.
Це технічно неправильно; він просто описує, як це працює, але не те, що робить.
У контексті запитання вони роблять те саме: беруть купу файлів C / C ++ і перетворюють їх у двійкові.
Отже, яка реальна різниця?
CMake набагато більш високого рівня. Він призначений для компіляції C ++, для якого ви пишете набагато менше коду збірки, але також може використовуватися для побудови загальних цілей. make
також є деякі вбудовані правила C / C ++, але вони здебільшого марні.
CMake
робить два етапи складання: він генерує сценарій збірки низкоуровневой в ninja
або make
або багатьох інших генераторах, а потім запустити його. Усі фрагменти сценарію оболонки, які зазвичай складаються, Makefile
виконуються лише на етапі генерації. Таким чином, CMake
нарощування може бути на порядок швидше.
Граматика CMake
набагато простіше підтримувати зовнішні інструменти, ніж виготовлення .
Одного разу make
будує артефакт, він забуває, як він був побудований. З яких джерел він був побудований, які прапори компілятора? CMake
відстежує його, make
залишає це вам. Якщо одне з джерел бібліотеки було видалено з попередньої версії Makefile
, make
не буде відновлено його.
Сучасний CMake
(починаючи з версії 3. щось) працює в залежності від залежності "цілей". Ціль все ще є одним вихідним файлом (на жаль), але може мати перехідні ("загальнодоступні" / "інтерфейси" в термінах CMake). Ці перехідні залежності можуть бути піддані впливу або заховані від залежних пакетів. CMake
буде керувати каталогами і для вас. З make
вами ви застрягли у файлі за файлом та керуйте каталогами вручну.
Ви можете щось закодувати, make
використовуючи файли прапорів, щоб прикрити останні два прогалини, але ви самостійно. make
містить повну мову Тьюрінга (навіть дві, іноді три рахунки Гійла ), і всі вони жахливі.
Якщо чесно, ось що CMake
і make
спільне - їхні мови досить жахливі:
щоб почати з.
Але CMake
ви пишете набагато менше рядків коду.