Se questa domanda riguarda un Makefileoutput di esempio del CMakeList.txtfile, controlla i sorgenti di cmake-backend e generane uno di questi Makefile. Se non è poi aggiungendo alla risposta di @Roberto sto cercando di renderlo semplice nascondendo i dettagli.
Funzione CMake
Sebbene Makesia uno strumento flessibile per regole e ricette, CMakeè uno strato di astrazione che aggiunge anche la funzionalità di configurazione.
La mia pianura CMakeLists.txtsarà come la seguente,
cmake_minimum_required(VERSION 2.8)
project(example)
file(GLOB testapp_SOURCES *.cc)
add_executable(testapp ${testapp_SOURCES})
Nota, che CMakenasconde howla build può essere fatto. Abbiamo solo specificato whatè l'input e l'output.
L' CMakeLists.txtelenco contiene le chiamate di funzione definite da cmake.
(Funzione CMake) Vs Crea regole
MakefileNel rules and recipesvengono utilizzati invece functions. Oltre alla functionfunzionalità simile, rules and recipesfornire concatenamento. Il mio minimalista Makefilesarà simile al seguente,
-include "executable.mk"
TARGETS=testapp.bin
all:${TARGETS}
Mentre executable.mkapparirà come il seguente,
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)
Partendo da zero inizierò con un Makefilesimile al seguente,
all: testapp.bin
testapp.bin:sourcea.o sourcb.o
$(CC) $(CFLAGS) -o $@ $^ $(LFLAGS) $(LIBS)
.PHONY: all clean
clean:
$(RM) $(OBJECTS) testapp.bin
Ho preso questo snippet da qui e l'ho modificato. Nota che alcune regole implicite vengono aggiunte a questo file che può essere trovato nella documentazione del makefile. Alcune variabili implicite sono rilevanti anche qui.
Nota, questo Makefilefornisce i dettagli che recipemostrano che howla build può essere eseguita. È possibile scrivere executable.mkper mantenere i dettagli definiti in un file. In questo modo il makefile può essere ridotto come ho mostrato in precedenza.
Variabili interne in CMakeeMake
Ora diventando un po 'avanzato, CMakepossiamo impostare un flag del compilatore come il seguente,
set(CMAKE_C_FLAGS "-Wall")
Ulteriori informazioni sulle CMakevariabili predefinite nel CMakeCache.txtfile. Il CMakecodice sopra sarà equivalente al Makecodice sotto,
CFLAGS = -Wall
Nota che CFLAGSè una variabile interna in Make, allo stesso modo, CMAKE_C_FLAGSè una variabile interna in CMake.
aggiunta di inclusione e percorso della libreria in CMake
Possiamo farlo cmakeusando le funzioni.
target_include_directories(testapp PRIVATE "myincludes")
list(APPEND testapp_LIBRARIES
mytest mylibrarypath
)
target_link_libraries(testapp ${testapp_LIBRARIES})
Rispetto all'aggiunta di include e percorso della libreria in Make
Possiamo aggiungere include e librerie aggiungendo linee come le seguenti,
INCLUDES += -Imyincludes
LIBS += -Lmylibrarypath -lmytest
Nota che queste righe sopra possono essere generate da strumenti auto-gen o pkg-config. (sebbene Makefile non dipenda dagli strumenti di configurazione automatica)
CMake configure / tweek
Normalmente è possibile generare alcuni config.hfile proprio come gli auto-configstrumenti utilizzando la configure_filefunzione. È possibile fare più trucchi scrivendo funzioni personalizzate. E finalmente possiamo selezionare una configurazione come la seguente,
cmake --build . --config "Release"
È possibile aggiungere alcune opzioni configurabili utilizzando la optionfunzione.
Makefile configurare / modificare
Se in qualche modo abbiamo bisogno di compilarlo con qualche flag di debug, possiamo invocare il makesimile,
make CXXFLAGS=NDEBUG
Penso variabili interne Makefile-rulese CMake-functionssono un buon inizio per il confronto, buona fortuna con ulteriori scavi.
cmakevolevo anche questo. Ma dubito che lo troverai perché le capacità semplicemente non mappano bene l'una con l'altra. Se provi acmakecomportarti come semakefossi impazzito, sul serio. Meglio solo per iniziare da zero. Le cose in cui sono banalimakesono piuttosto coinvoltecmake, e viceversa.