Odpowiedzi:
Make (a raczej Makefile) to system kompilacji - napędza kompilator i inne narzędzia do budowania kodu.
CMake jest generatorem systemów kompilacji. Może tworzyć pliki Makefile, może tworzyć pliki kompilacji Ninja, może tworzyć projekty KDEvelop lub Xcode, może tworzyć rozwiązania Visual Studio. Z tego samego punktu początkowego ten sam plik CMakeLists.txt. Więc jeśli masz projekt niezależny od platformy, CMake jest sposobem na uczynienie go również niezależnym od systemu.
Jeśli masz programistów Windows przyzwyczajonych do programistów Visual Studio i Unix, którzy przysięgają GNU Make, CMake jest (jest) jedną z wielu dróg.
Zawsze zalecałbym użycie CMake (lub innego generatora kompilacji systemu, ale CMake jest moją osobistą preferencją), jeśli chcesz, aby twój projekt był wieloplatformowy lub szeroko użyteczny. Sam CMake zapewnia także kilka ciekawych funkcji, takich jak wykrywanie zależności, zarządzanie interfejsem biblioteki lub integracja z CTest, CDash i CPack.
Korzystanie z generatora buildsystem sprawia, że projekt jest bardziej przyszłościowy. Nawet jeśli jesteś teraz GNU-Make-only, co jeśli później zdecydujesz się rozszerzyć na inne platformy (Windows lub coś wbudowanego), lub po prostu chcesz użyć IDE?
find_package()) Lub obsługa testowania / pakowania.
Stwierdzenie o tym, że CMake jest „generatorem kompilacji”, jest powszechnym nieporozumieniem.
To nie jest technicznie złe; po prostu opisuje JAK to działa, ale nie CO JEST.
W kontekście pytania robią to samo: weź kilka plików C / C ++ i zamień je w plik binarny.
Jaka jest prawdziwa różnica?
CMake ma znacznie wyższy poziom. Jest przystosowany do kompilacji C ++, dla której piszesz o wiele mniej kodu kompilacji, ale może być również używany do kompilacji ogólnego przeznaczenia. makema także pewne wbudowane reguły C / C ++, ale są one w większości bezużyteczne.
CMakewykonuje kompilację dwuetapową: generuje skrypt kompilacji niskiego poziomu w ninjalub w makewielu innych generatorach, a następnie uruchamiasz go. Wszystkie elementy skryptu powłoki, które są zwykle ułożone w stos, Makefilesą wykonywane tylko na etapie generowania. W ten sposób CMakekompilacja może być o rząd wielkości szybsza.
Gramatyka CMakejest znacznie łatwiejsza do obsługi narzędzi zewnętrznych niż make .
Po makezbudowaniu artefaktu zapomina, jak go zbudowano. Z jakich źródeł został zbudowany, z jakich flag kompilatora? CMakeśledzi to, makepozostawia to tobie. Jeśli jedno ze źródeł biblioteki zostało usunięte od poprzedniej wersji Makefile, makenie odbuduje go.
Nowoczesne CMake(począwszy od wersji 3. coś) działa w kategoriach zależności między „celami”. Cel jest nadal pojedynczym plikiem otput (niestety), ale może mieć zależności przechodnie („publiczny” / „interfejs” w kategoriach CMake). Te zależności przechodnie można ujawnić lub ukryć przed pakietami zależnymi. CMakezarządza również katalogami dla Ciebie. Dzięki makeutkniesz na poziomie plik po pliku i zarządzasz katalogami ręcznie.
Możesz zakodować coś przy makeużyciu plików flag do pokrycia dwóch ostatnich luk, ale jesteś sam. makezawiera kompletny język Turinga (nawet dwa, czasem trzy, podstępne ), a wszystkie z nich są okropne.
Szczerze mówiąc, to co CMakei makemają wspólną cechę - ich języki są dość straszne:
zacząć z.
Ale CMakepiszesz o wiele mniej wierszy kodu.