Wenn es sich bei dieser Frage um ein Beispiel handelt Makefile der CMakeList.txtDatei handelt, überprüfen Sie bitte die cmake-Backend-Quellen und generieren Sie eine solche Makefile. Wenn dies nicht der Fall ist, versuche ich, die Antwort von @Roberto zu vereinfachen, indem ich die Details verstecke.
CMake-Funktion
Während Make es ein flexibles Werkzeug für Regeln und Rezepte ist, CMakeist es eine Abstraktionsebene, die auch die Konfigurationsfunktion hinzufügt.
Meine Ebene CMakeLists.txt wird wie folgt aussehen:
cmake_minimum_required(VERSION 2.8)
project(example)
file(GLOB testapp_SOURCES *.cc)
add_executable(testapp ${testapp_SOURCES})
Beachten Sie, dass sich CMakeversteckthow der Build getan werden kann. Wir haben nur whatdie Ein- und Ausgabe angegeben.
Das CMakeLists.txt enthält eine Liste von Funktionsaufrufen, die durch definiert sind cmake.
(CMake-Funktion) Vs Regeln erstellen
In Makefileder rules and recipeswerden statt verwendet functions. functionStellen Sie zusätzlich zu einer ähnlichen Funktion rules and recipeseine Verkettung bereit. Mein Minimalist Makefilesieht wie folgt aus:
-include "executable.mk"
TARGETS=testapp.bin
all:${TARGETS}
Während das executable.mkwie folgt aussehen wird,
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)
Ausgehend von Grund auf beginne ich mit einem Makefilewie folgt:
all: testapp.bin
testapp.bin:sourcea.o sourcb.o
$(CC) $(CFLAGS) -o $@ $^ $(LFLAGS) $(LIBS)
.PHONY: all clean
clean:
$(RM) $(OBJECTS) testapp.bin
Ich habe diesen Ausschnitt von hier bekommen und es modifiziert. Beachten Sie, dass dieser Datei einige implizite Regeln hinzugefügt werden, die in der Makefile-Dokumentation zu finden sind. Einige implizite Variablen sind auch hier relevant.
Beachten Sie, dass Makefiledas Detail recipezeigt , dass howder Build ausgeführt werden kann. Es ist möglich zu schreiben executable.mk, um die Details in einer Datei zu behalten. Auf diese Weise kann das Makefile reduziert werden, wie ich zuvor gezeigt habe.
Interne Variablen in CMakeundMake
Jetzt, da CMakewir ein wenig fortgeschritten sind, können wir ein Compiler-Flag wie das folgende setzen:
set(CMAKE_C_FLAGS "-Wall")
Weitere Informationen zu CMakeStandardvariablen finden Sie in der CMakeCache.txtDatei. Der CMakeobige Code entspricht dem folgenden MakeCode.
CFLAGS = -Wall
Beachten Sie, dass CFLAGSeine interne Variable Make, die gleiche Art und Weise, CMAKE_C_FLAGSist die interne Variable CMake.
Hinzufügen von Include- und Bibliothekspfad in CMake
Wir können es cmakemit Funktionen tun .
target_include_directories(testapp PRIVATE "myincludes")
list(APPEND testapp_LIBRARIES
mytest mylibrarypath
)
target_link_libraries(testapp ${testapp_LIBRARIES})
Vs Hinzufügen von Include- und Bibliothekspfad in Make
Wir können Include- und Bibliotheken hinzufügen, indem wir Zeilen wie die folgenden hinzufügen:
INCLUDES += -Imyincludes
LIBS += -Lmylibrarypath -lmytest
Beachten Sie, dass diese obigen Zeilen mit Auto-Gen-Tools oder pkg-config generiert werden können. (obwohl Makefile nicht von Auto-Config-Tools abhängig ist)
CMake configure / tweek
Normalerweise ist es möglich, einige config.hDateien wie auto-configWerkzeuge mithilfe der configure_fileFunktion zu generieren . Es ist möglich, benutzerdefinierte Funktionen mit mehr Tricks zu schreiben. Und schließlich können wir eine Konfiguration wie die folgende auswählen:
cmake --build . --config "Release"
Mit der optionFunktion können einige konfigurierbare Optionen hinzugefügt werden.
Makefile konfigurieren / optimieren
Wenn wir es irgendwie mit einem Debug-Flag kompilieren müssen, können wir das Gleiche aufrufen make,
make CXXFLAGS=NDEBUG
Ich denke, interne Variablen, Makefile-rulesund CMake-functionssind ein guter Anfang für den Vergleich, viel Glück mit mehr Graben.
cmakewollte ich das auch. Aber ich bezweifle, dass Sie es finden werden, weil die Funktionen einfach nicht so gut aufeinander abgestimmt sind. Wenn Sie versuchen, sich so zucmakeverhaltenmake, werden Sie sich ernsthaft verrückt machen. Am besten einfach von vorne anfangen. Dinge, die trivialmakesind, sind ziemlich involviertcmakeund umgekehrt.