Wenn es sich bei dieser Frage um ein Beispiel handelt Makefile
der CMakeList.txt
Datei 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, CMake
ist 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 CMake
versteckthow
der Build getan werden kann. Wir haben nur what
die Ein- und Ausgabe angegeben.
Das CMakeLists.txt
enthält eine Liste von Funktionsaufrufen, die durch definiert sind cmake
.
(CMake-Funktion) Vs Regeln erstellen
In Makefile
der rules and recipes
werden statt verwendet functions
. function
Stellen Sie zusätzlich zu einer ähnlichen Funktion rules and recipes
eine Verkettung bereit. Mein Minimalist Makefile
sieht wie folgt aus:
-include "executable.mk"
TARGETS=testapp.bin
all:${TARGETS}
Während das executable.mk
wie 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 Makefile
wie 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 Makefile
das Detail recipe
zeigt , dass how
der 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 CMake
undMake
Jetzt, da CMake
wir ein wenig fortgeschritten sind, können wir ein Compiler-Flag wie das folgende setzen:
set(CMAKE_C_FLAGS "-Wall")
Weitere Informationen zu CMake
Standardvariablen finden Sie in der CMakeCache.txt
Datei. Der CMake
obige Code entspricht dem folgenden Make
Code.
CFLAGS = -Wall
Beachten Sie, dass CFLAGS
eine interne Variable Make
, die gleiche Art und Weise, CMAKE_C_FLAGS
ist die interne Variable CMake
.
Hinzufügen von Include- und Bibliothekspfad in CMake
Wir können es cmake
mit 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.h
Dateien wie auto-config
Werkzeuge mithilfe der configure_file
Funktion 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 option
Funktion 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-rules
und CMake-functions
sind ein guter Anfang für den Vergleich, viel Glück mit mehr Graben.
cmake
wollte 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 zucmake
verhaltenmake
, werden Sie sich ernsthaft verrückt machen. Am besten einfach von vorne anfangen. Dinge, die trivialmake
sind, sind ziemlich involviertcmake
und umgekehrt.