Si cette question concerne un exemple de Makefilesortie du CMakeList.txtfichier, veuillez vérifier les sources cmake-backend et en générer une Makefile. 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 Makec'est un outil flexible pour les règles et les recettes, CMakec'est une couche d'abstraction qui ajoute également la fonction de configuration.
Ma plaine CMakeLists.txtressemblera à ce qui suit,
cmake_minimum_required(VERSION 2.8)
project(example)
file(GLOB testapp_SOURCES *.cc)
add_executable(testapp ${testapp_SOURCES})
Notez que cela CMakecache howla construction peut être fait. Nous avons seulement spécifié whatest l'entrée et la sortie.
Le CMakeLists.txtcontient la liste des appels de fonction définis par cmake.
(Fonction CMake) Vs Créer des règles
Dans Makefilele rules and recipessont utilisés à la place de functions. En plus de la functionfonction-like, rules and recipesfournissez le chaînage. Mon minimaliste Makefileressemblera à ce qui suit,
-include "executable.mk"
TARGETS=testapp.bin
all:${TARGETS}
Alors que le executable.mkressemblera à ce qui suit,
SOURCES=$(wildcard *.cpp)
OBJECTS=$(SOURCES:.cpp=.o)
DEPS=$(SOURCES:.cpp=.d)
%.bin:$(OBJECTS)
$(CC) $(CFLAGS) -o $@ $^ $(LFLAGS) $(LIBS)
.PHONY: all clean
clean:
$(RM) $(OBJECTS) $(DEPS) $(TARGETS)
-include $(DEPS)
En partant de zéro, je commencerai par un Makefilecomme ce qui suit,
all: testapp.bin
testapp.bin:sourcea.o sourcb.o
$(CC) $(CFLAGS) -o $@ $^ $(LFLAGS) $(LIBS)
.PHONY: all clean
clean:
$(RM) $(OBJECTS) testapp.bin
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 Makefilefournit les détails recipemontrant que howla construction peut être effectuée. Il est possible d'écrire executable.mkpour 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 CMakeetMake
Maintenant peu avancé, CMakenous pouvons définir un indicateur de compilateur comme le suivant,
set(CMAKE_C_FLAGS "-Wall")
Veuillez en savoir plus sur les CMakevariables par défaut dans le CMakeCache.txtfichier. Le CMakecode ci-dessus sera équivalent au Makecode ci-dessous,
CFLAGS = -Wall
Notez qu'il CFLAGSs'agit d'une variable interne dans Make, de la même manière, CMAKE_C_FLAGSest une variable interne dans CMake.
ajout d'un chemin d'inclusion et de bibliothèque dans CMake
Nous pouvons le faire en cmakeutilisant des fonctions.
target_include_directories(testapp PRIVATE "myincludes")
list(APPEND testapp_LIBRARIES
mytest mylibrarypath
)
target_link_libraries(testapp ${testapp_LIBRARIES})
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,
INCLUDES += -Imyincludes
LIBS += -Lmylibrarypath -lmytest
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.hfichiers comme des auto-configoutils en utilisant configure_filefunction. 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,
cmake --build . --config "Release"
Il est possible d'ajouter une option configurable en utilisant la optionfonction.
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 makesimilaire,
make CXXFLAGS=NDEBUG
Je pense que les variables internes, Makefile-ruleset CMake-functionssont un bon début pour la comparaison, bonne chance avec plus de fouille.
cmakeje 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 fairecmakecommemakeça, vous vous rendrez fou, sérieusement. Il vaut mieux partir de zéro. Les choses qui sont insignifiantes enmakesont assez impliquéescmake, et vice-versa.