Si cette question concerne un exemple de Makefile
sortie du CMakeList.txt
fichier, 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 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,
cmake_minimum_required(VERSION 2.8)
project(example)
file(GLOB testapp_SOURCES *.cc)
add_executable(testapp ${testapp_SOURCES})
Notez que cela CMake
cache how
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 par cmake
.
(Fonction CMake) Vs Créer des règles
Dans Makefile
le rules and recipes
sont utilisés à la place de functions
. En plus de la function
fonction-like, rules and recipes
fournissez le chaînage. Mon minimaliste Makefile
ressemblera à ce qui suit,
-include "executable.mk"
TARGETS=testapp.bin
all:${TARGETS}
Alors que le executable.mk
ressemblera à 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 Makefile
comme 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 Makefile
fournit les détails recipe
montrant que how
la construction peut être effectuée. Il est possible d'écrire executable.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,
set(CMAKE_C_FLAGS "-Wall")
Veuillez en savoir plus sur les CMake
variables par défaut dans le CMakeCache.txt
fichier. Le CMake
code ci-dessus sera équivalent au Make
code ci-dessous,
CFLAGS = -Wall
Notez qu'il CFLAGS
s'agit d'une variable interne dans Make
, de la même manière, CMAKE_C_FLAGS
est une variable interne dans CMake
.
ajout d'un chemin d'inclusion et de bibliothèque dans CMake
Nous pouvons le faire en cmake
utilisant 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.h
fichiers comme des auto-config
outils en utilisant configure_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,
cmake --build . --config "Release"
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,
make CXXFLAGS=NDEBUG
Je pense que les variables internes, Makefile-rules
et CMake-functions
sont un bon début pour la comparaison, bonne chance avec plus de fouille.
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.