Je me demandais s'il y avait un exemple de code pour Makefile
s ( make
) et CMakeLists.txt
( cmake
) qui font tous les deux la même chose (la seule différence étant que l'un est écrit make
et l'autre cmake
).
J'ai essayé de chercher «cmake vs make», mais je n'ai jamais trouvé de comparaison de code. Il serait vraiment utile de comprendre les différences, ne serait-ce que pour un cas simple.
cmake
je le voulais aussi. Mais je doute que vous le trouviez parce que les capacités ne correspondent tout simplement pas si bien l'une à l'autre. Si vous essayez de fairecmake
commemake
ça, vous vous rendrez fou, sérieusement. Il vaut mieux partir de zéro. Les choses qui sont insignifiantes enmake
sont assez impliquéescmake
, et vice-versa.make
etcmake
sont-ils si distincts qu'ils devraient être davantage considérés comme complémentaires que comme des outils concurrents?cp *.x $(OUTDIR)
" que vous écririez dans un Makefile. Peut-être la partie la plus ennuyeuse pour moi est que les Makefiles générés sont par conception complètement non portables et rigides (suite)Réponses:
Le Makefile suivant construit un exécutable nommé à
prog
partir des sourcesprog1.c, prog2.c, prog3.c and main.c
.prog
est liélibmystatlib.a
etlibmydynlib.so
qui sont tous deux également construits à partir des sources. En outre,prog
utilise la bibliothèquelibstuff.a
dansstuff/lib
et son en-tête dansstuff/include
. Le Makefile construit par défaut une cible de publication, mais offre également une cible de débogage:Voici un
CMakeLists.txt
qui fait (presque) exactement la même chose, avec quelques commentaires pour souligner les similitudes avec le Makefile:Dans cet exemple simple, les différences les plus importantes sont:
CMake reconnaît quels compilateurs utiliser pour quel type de source. En outre, il appelle la bonne séquence de commandes pour chaque type de cible. Par conséquent, il n'y a pas de spécification explicite de commandes comme
$(CC) ...
,$(RANLIB) ...
et ainsi de suite.Tous les indicateurs habituels du compilateur / éditeur de liens traitant de l'inclusion de fichiers d'en-tête, de bibliothèques, etc. sont remplacés par des commandes indépendantes de la plate-forme / du système de construction.
Drapeaux de débogage sont inclus en réglant soit la variable
CMAKE_BUILD_TYPE
à « Debug », ou en le passant à CMake lors de l' appel du programme:cmake -DCMAKE_BUILD_TYPE:STRING=Debug
.CMake propose également l'inclusion indépendante de la plate-forme du drapeau '-fPIC' (via la
POSITION_INDEPENDENT_CODE
propriété) et bien d'autres. Pourtant, des paramètres plus obscurs peuvent être implémentés à la main dans CMake aussi bien que dans un Makefile (en utilisantCOMPILE_FLAGS
et des propriétés similaires). Bien sûr, CMake commence vraiment à briller lorsque des bibliothèques tierces (comme OpenGL) sont incluses de manière portable.Le processus de construction comporte une étape si vous utilisez un Makefile, à savoir la saisie
make
sur la ligne de commande. Pour CMake, il y a deux étapes: Tout d'abord, vous devez configurer votre environnement de construction (soit en tapantcmake <source_dir>
dans votre répertoire de construction, soit en exécutant un client GUI). Cela crée un Makefile ou quelque chose d'équivalent, selon le système de construction de votre choix (par exemple make sur Unixes ou VC ++ ou MinGW + Msys sous Windows). Le système de construction peut être passé à CMake en tant que paramètre; cependant, CMake fait des choix par défaut raisonnables en fonction de la configuration de votre système. Deuxièmement, vous effectuez la construction réelle dans le système de construction sélectionné.Les sources et les instructions de construction sont disponibles sur https://github.com/rhoelzel/make_cmake .
la source
CPPFLAGS
au lieu d'INCDIR
une seule, on aurait pu utiliser les règles intégrées et l'appel explicite du compilateur aurait été redondant. De même pour la gestion de ar, les règles intégrées peuvent également couvrir cela. Aussi, pourquoi définirCPP
etCC
explicitement? Ils sont déjà définis sur de bonnes valeurs parmake
, ce sont des variables prédéfinies.make
reconnaît également quel compilateur utiliser pour quel type de source, les règles intégrées sont nombreuses.:=
au lieu de=
.cmake
est plus comparable àautomake
quemake
.INCLUDES
au lieu deINCDIR
. Vous n'avez pas besoin des règles% .o:%. C.Prenez un logiciel qui utilise CMake comme système de construction (il y a beaucoup de projets open source parmi lesquels choisir comme exemple). Obtenez le code source et configurez-le à l'aide de CMake. Lisez les makefiles résultants et profitez-en.
Une chose à garder à l'esprit que ces outils ne mappent pas un à un. La différence la plus évidente est que CMake recherche les dépendances entre les différents fichiers (par exemple l'en-tête C et les fichiers source), alors que make laisse cela aux auteurs du makefile.
la source
Si cette question concerne un exemple de
Makefile
sortie duCMakeList.txt
fichier, veuillez vérifier les sources cmake-backend et en générer uneMakefile
. Si ce n'est pas le cas, j'ajoute à la réponse de @Roberto, j'essaie de simplifier les choses en cachant les détails.Fonction CMake
Alors que
Make
c'est un outil flexible pour les règles et les recettes,CMake
c'est une couche d'abstraction qui ajoute également la fonction de configuration.Ma plaine
CMakeLists.txt
ressemblera à ce qui suit,Notez que cela
CMake
cachehow
la construction peut être fait. Nous avons seulement spécifiéwhat
est l'entrée et la sortie.Le
CMakeLists.txt
contient la liste des appels de fonction définis parcmake
.(Fonction CMake) Vs Créer des règles
Dans
Makefile
lerules and recipes
sont utilisés à la place defunctions
. En plus de lafunction
fonction-like,rules and recipes
fournissez le chaînage. Mon minimalisteMakefile
ressemblera à ce qui suit,Alors que le
executable.mk
ressemblera à ce qui suit,En partant de zéro, je commencerai par un
Makefile
comme ce qui suit,J'ai récupéré cet extrait d' ici et l' ai modifié. Notez que certaines règles implicites sont ajoutées à ce fichier qui peut être trouvé dans la documentation makefile. Certaines variables implicites sont également pertinentes ici.
Notez que cela
Makefile
fournit les détailsrecipe
montrant quehow
la construction peut être effectuée. Il est possible d'écrireexecutable.mk
pour conserver les détails définis dans un seul fichier. De cette façon, le makefile peut être réduit comme je l'ai montré plus tôt.Variables internes dans
CMake
etMake
Maintenant peu avancé,
CMake
nous pouvons définir un indicateur de compilateur comme le suivant,Veuillez en savoir plus sur les
CMake
variables par défaut dans leCMakeCache.txt
fichier. LeCMake
code ci-dessus sera équivalent auMake
code ci-dessous,Notez qu'il
CFLAGS
s'agit d'une variable interne dansMake
, de la même manière,CMAKE_C_FLAGS
est une variable interne dansCMake
.ajout d'un chemin d'inclusion et de bibliothèque dans CMake
Nous pouvons le faire en
cmake
utilisant des fonctions.Vs ajouter un chemin d'inclusion et de bibliothèque dans Make
Nous pouvons ajouter des include et des bibliothèques en ajoutant des lignes comme celle-ci,
Notez que les lignes ci-dessus peuvent être générées à partir d'outils de génération automatique ou de pkg-config. (bien que Makefile ne dépende pas des outils de configuration automatique)
CMake configurer / tweek
Normalement, il est possible de générer des
config.h
fichiers comme desauto-config
outils en utilisantconfigure_file
function. Il est possible de faire plus de trucs en écrivant des fonctions personnalisées. Et enfin on peut sélectionner une config comme la suivante,Il est possible d'ajouter une option configurable en utilisant la
option
fonction.Makefile configurer / modifier
Si d'une manière ou d'une autre nous devons le compiler avec un indicateur de débogage, nous pouvons invoquer la méthode
make
similaire,Je pense que les variables internes,
Makefile-rules
etCMake-functions
sont un bon début pour la comparaison, bonne chance avec plus de fouille.la source