Risposte:
Make (o piuttosto un Makefile) è un sistema di compilazione - guida il compilatore e altri strumenti di compilazione per costruire il tuo codice.
CMake è un generatore di buildsystems. Può produrre Makefile, può produrre file di build Ninja, può produrre progetti KDEvelop o Xcode, può produrre soluzioni di Visual Studio. Dallo stesso punto di partenza, lo stesso file CMakeLists.txt. Quindi, se hai un progetto indipendente dalla piattaforma, CMake è anche un modo per renderlo indipendente dal sistema.
Se hai sviluppatori Windows abituati a sviluppatori Visual Studio e Unix che giurano su GNU Make, CMake è (una delle) strade da percorrere.
Consiglierei sempre di usare CMake (o un altro generatore di buildsystem, ma CMake è la mia preferenza personale) se intendi che il tuo progetto sia multipiattaforma o ampiamente utilizzabile. CMake stesso offre anche alcune funzioni interessanti come il rilevamento delle dipendenze, la gestione dell'interfaccia della libreria o l'integrazione con CTest, CDash e CPack.
L'uso di un generatore di buildsystem rende il progetto più a prova di futuro. Anche se sei GNU-Make-only ora, cosa succederebbe se in seguito decidessi di espanderti su altre piattaforme (sia Windows o qualcosa di incorporato) o desideri semplicemente utilizzare un IDE?
find_package()
) O il supporto di test / packaging.
L'affermazione che CMake sia un "generatore di build" è un malinteso comune.
Non è tecnicamente sbagliato; descrive semplicemente COME funziona, ma non COSA funziona.
Nel contesto della domanda, fanno la stessa cosa: prendono un sacco di file C / C ++ e li trasformano in un file binario.
Quindi, qual è la vera differenza?
CMake è molto più di alto livello. È su misura per compilare C ++, per il quale si scrive molto meno codice di compilazione, ma può essere utilizzato anche per la compilazione generica. make
ha anche alcune regole C / C ++ integrate, ma sono per lo più inutili.
CMake
fa un accumulo in due fasi: genera uno script di build di basso livello in ninja
o make
o molti altri generatori, e poi lo si esegue. Tutti i pezzi di script shell che sono normalmente ammucchiati Makefile
vengono eseguiti solo nella fase di generazione. Pertanto, CMake
build può essere più veloce di ordini di grandezza.
La grammatica di CMake
è molto più facile da supportare per strumenti esterni rispetto a quelli di make .
Una volta make
costruito un artefatto, si dimentica come è stato costruito. Da quali fonti è stato costruito, quali flag del compilatore? CMake
lo segue, lo make
lascia a te. Se una delle fonti della libreria è stata rimossa dalla versione precedente di Makefile
, make
non la ricostruirà.
Moderno CMake
(a partire dalla versione 3.qualcosa) funziona in termini di dipendenze tra "obiettivi". Un target è ancora un singolo file otput (purtroppo), ma può avere dipendenze transitive ("pubblico" / "interfaccia" in termini di CMake). Queste dipendenze transitive possono essere esposte o nascoste dai pacchetti dipendenti. CMake
gestirà le directory anche per te. Con make
, sei bloccato a livello di file per file e gestisci le directory per mano.
Puoi codificare qualcosa make
usando i file flag per coprire gli ultimi due spazi vuoti, ma sei da solo. make
contiene un linguaggio completo di Turing (anche due, a volte tre contando Guile ), e sono tutti orribili.
Ad essere sinceri, questo è ciò CMake
che make
hanno in comune: le loro lingue sono piuttosto orribili:
iniziare con.
Ma in CMake
te scrivi molte meno righe di codice.