Відповіді:
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ви пишете набагато менше рядків коду.