Je code en C / C ++ et utilise un Makefile (GNU) pour compiler le code. Je peux faire la même chose avec CMake et obtenir un MakeFile. Cependant, quelle est la différence entre l'utilisation de Makefile et CMake pour compiler le code?
288
Réponses:
Make (ou plutôt un Makefile) est un système de build - il pilote le compilateur et d'autres outils de build pour construire votre code.
CMake est un générateur de buildsystems. Il peut produire des Makefiles, il peut produire des fichiers de construction Ninja, il peut produire des projets KDEvelop ou Xcode, il peut produire des solutions Visual Studio. A partir du même point de départ, le même fichier CMakeLists.txt. Donc, si vous avez un projet indépendant de la plate-forme, CMake est également un moyen de le rendre indépendant du système.
Si vous avez des développeurs Windows habitués aux développeurs Visual Studio et Unix qui ne jurent que par GNU Make, CMake est (une des) voie (s) à suivre.
Je recommanderais toujours d'utiliser CMake (ou un autre générateur de buildsystem, mais CMake est ma préférence personnelle) si vous envisagez que votre projet soit multi-plateforme ou largement utilisable. CMake lui-même fournit également de belles fonctionnalités telles que la détection des dépendances, la gestion de l'interface de bibliothèque ou l'intégration avec CTest, CDash et CPack.
L'utilisation d'un générateur de buildsystem rend votre projet plus pérenne. Même si vous êtes GNU-Make-only maintenant, que se passe-t-il si vous décidez plus tard d'étendre à d'autres plates-formes (que ce soit Windows ou quelque chose d'incorporé), ou si vous voulez simplement utiliser un IDE?
la source
find_package()
) ou le support de test / packaging.La déclaration selon laquelle CMake est un «générateur de génération» est une idée fausse courante.
Ce n'est pas techniquement mauvais; il décrit simplement COMMENT cela fonctionne, mais pas CE QU'IL fait.
Dans le contexte de la question, ils font la même chose: prendre un tas de fichiers C / C ++ et les transformer en binaire.
Alors, quelle est la vraie différence?
CMake est beaucoup plus haut niveau. Il est conçu pour compiler C ++, pour lequel vous écrivez beaucoup moins de code de construction, mais peut également être utilisé pour une construction à usage général.
make
a également des règles C / C ++ intégrées, mais elles sont pour la plupart inutiles.CMake
fait une construction en deux étapes: il génère un script de construction à faible niveauninja
oumake
ou bien d' autres générateurs, puis l' exécuter. Tous les éléments de script shell qui sont normalement empilésMakefile
ne sont exécutés qu'au stade de la génération. Ainsi, laCMake
construction peut être plus rapide de plusieurs ordres de grandeur.La grammaire de
CMake
est beaucoup plus facile à prendre en charge pour les outils externes que pour make .Une fois
make
construit un artefact, il oublie comment il a été construit. À partir de quelles sources il a été construit, quels drapeaux de compilation?CMake
le suit, vous lemake
laisse. Si l'une des sources de bibliothèque a été supprimée depuis la version précédente deMakefile
,make
ne la reconstruira pas.Modern
CMake
(à partir de la version 3) fonctionne en termes de dépendances entre "cibles". Une cible est toujours un seul fichier de sortie (malheureusement), mais peut avoir des dépendances transitives ("public" / "interface" en termes de CMake). Ces dépendances transitives peuvent être exposées ou masquées aux packages dépendants.CMake
gérera également les répertoires pour vous. Avecmake
, vous êtes coincé au niveau fichier par fichier et gérer les répertoires à la main.Vous pouvez coder quelque chose en
make
utilisant des fichiers d'indicateur pour combler les deux dernières lacunes, mais vous êtes seul.make
contient un langage complet de Turing (même deux, parfois trois comptant Guile ), et tous sont horribles.Pour être honnête, c'est ce que
CMake
etmake
ont en commun - leurs langues sont assez horrible:commencer avec.
Mais
CMake
vous écrivez beaucoup moins de lignes de code.la source