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. make
ma także pewne wbudowane reguły C / C ++, ale są one w większości bezużyteczne.
CMake
wykonuje kompilację dwuetapową: generuje skrypt kompilacji niskiego poziomu w ninja
lub w make
wielu innych generatorach, a następnie uruchamiasz go. Wszystkie elementy skryptu powłoki, które są zwykle ułożone w stos, Makefile
są wykonywane tylko na etapie generowania. W ten sposób CMake
kompilacja może być o rząd wielkości szybsza.
Gramatyka CMake
jest znacznie łatwiejsza do obsługi narzędzi zewnętrznych niż make .
Po make
zbudowaniu artefaktu zapomina, jak go zbudowano. Z jakich źródeł został zbudowany, z jakich flag kompilatora? CMake
śledzi to, make
pozostawia to tobie. Jeśli jedno ze źródeł biblioteki zostało usunięte od poprzedniej wersji Makefile
, make
nie 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. CMake
zarządza również katalogami dla Ciebie. Dzięki make
utkniesz na poziomie plik po pliku i zarządzasz katalogami ręcznie.
Możesz zakodować coś przy make
użyciu plików flag do pokrycia dwóch ostatnich luk, ale jesteś sam. make
zawiera kompletny język Turinga (nawet dwa, czasem trzy, podstępne ), a wszystkie z nich są okropne.
Szczerze mówiąc, to co CMake
i make
mają wspólną cechę - ich języki są dość straszne:
zacząć z.
Ale CMake
piszesz o wiele mniej wierszy kodu.