La différence entre l'utilisation de Makefile et CMake pour compiler le code
Je code en C/C++ et utiliser une (GNU) Makefile pour compiler le code. Je peux faire la même chose avec CMake et d'obtenir un MakeFile. Cependant, quelle est la différence entre l'utilisation de Makefile et CMake pour compiler le code?
- cmake peut aussi produire des fichiers à utiliser ninja
Vous devez vous connecter pour publier un commentaire.
Faire (ou plutôt un Makefile) est un buildsystem - il conduit le compilateur et d'autres outils de construction pour construire votre code.
CMake est un générateur de buildsystems. Il peut produire des fichiers Makefile, il peut produire des Ninja les fichiers de compilation, elle peut produire des KDEvelop ou des projets XCode, il peut produire des solutions Visual Studio. À partir du même point de départ, la même CMakeLists.txt fichier. Donc, si vous avez une plate-forme indépendante de projet, CMake est un moyen de faire buildsystem indépendante ainsi.
Si vous avez des développeurs Windows utilisé pour Visual Studio et développeurs Unix qui ne jurent que par GNU Make, CMake est (l'une des) façon(s) à l'aller.
Je vous recommandons de toujours utiliser CMake (ou un autre buildsystem générateur, mais CMake est ma préférence personnelle) si vous avez l'intention de votre projet pour être multi-plateforme ou largement utilisable. CMake lui-même fournit également quelques fonctionnalités intéressantes comme la dépendance de la détection, de la bibliothèque de gestion de l'interface, ou l'intégration avec CTest, CDash et CPack.
À l'aide d'un buildsystem générateur permet à votre projet de plus à l'avenir. Même si vous êtes GNU-Faire-seulement maintenant, que si vous décidez plus tard de l'étendre à d'autres plates-formes (que ce soit Windows ou quelque chose embedded), ou voulez juste utiliser un IDE?
find_package()
) ou d'essais/d'emballage de soutien.configure
etmake
.La déclaration sur CMake être un "build générateur" est une idée fausse commune.
C'est techniquement pas mauvais, il a juste décrit COMMENT il fonctionne, mais pas CE qu'il fait.
Dans le contexte de la question, ils font la même chose: prendre un tas de C/C++ fichiers et de les transformer en binaire.
Alors, quelle est la réelle différence?
CMake est beaucoup plus haut niveau. Il est adapté pour compiler en C++, pour qui vous écrivez beaucoup moins de bâtir code, mais peut également être utilisé pour des fins générales de construction.
make
a quelques intégré C/C++ règles, mais ils sont la plupart du temps inutile.CMake
fait en deux étapes de construire: elle génère un faible niveau script de génération enninja
oumake
ou de nombreux autres producteurs, et puis de l'exécuter. Tous les script shell pièces qui sont normalement entassés dansMakefile
ne sont exécutées au moment de la génération. Ainsi,CMake
construire peut être des ordres de grandeur plus rapide.La grammaire de
CMake
est beaucoup plus facile de soutenir des outils externes que faire de l'.Une fois
make
construit un artefact, il oublie comment il a été construit. Quelles sources il a été construit à partir d', ce que les drapeaux de compilation?CMake
les pistes,make
feuilles jusqu'à vous. Si l'une des ressources de la bibliothèque a été supprimé depuis la version précédente deMakefile
,make
de ne pas la reconstruire.Moderne
CMake
(à partir de la version 3.quelque chose) fonctionne en termes de dépendances entre les "cibles". Une cible est toujours un seul otput fichier (malheureusement), mais peut avoir transitif ("public"/"interface" dans CMake termes) dépendances.Ces dépendances transitives peut être exposé, ou cachés de la paquetages dépendants.
CMake
sera de gérer les répertoires pour vous aussi. Avecmake
, vous êtes coincé sur un fichier par fichier et de gérer des-annuaires-par-niveau de la main.Vous pouvez coder quelque chose dans
make
à l'aide de drapeaux pour couvrir les deux dernières lacunes, mais vous êtes sur votre propre.make
contient un Turing langue (même deux, parfois trois comptage Guile), et elles sont toutes horribles.Pour être honnête, c'est ce que
CMake
etmake
ont en commun, leurs langues sont assez horrible:pour commencer.
Mais dans
CMake
vous écrivez beaucoup moins de lignes de code.