Se questa domanda riguarda un Makefile
output di esempio del CMakeList.txt
file, 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 Make
sia uno strumento flessibile per regole e ricette, CMake
è uno strato di astrazione che aggiunge anche la funzionalità di configurazione.
La mia pianura CMakeLists.txt
sarà come la seguente,
cmake_minimum_required(VERSION 2.8)
project(example)
file(GLOB testapp_SOURCES *.cc)
add_executable(testapp ${testapp_SOURCES})
Nota, che CMake
nasconde how
la build può essere fatto. Abbiamo solo specificato what
è l'input e l'output.
L' CMakeLists.txt
elenco contiene le chiamate di funzione definite da cmake
.
(Funzione CMake) Vs Crea regole
Makefile
Nel rules and recipes
vengono utilizzati invece functions
. Oltre alla function
funzionalità simile, rules and recipes
fornire concatenamento. Il mio minimalista Makefile
sarà simile al seguente,
-include "executable.mk"
TARGETS=testapp.bin
all:${TARGETS}
Mentre executable.mk
apparirà 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 Makefile
simile 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 Makefile
fornisce i dettagli che recipe
mostrano che how
la build può essere eseguita. È possibile scrivere executable.mk
per mantenere i dettagli definiti in un file. In questo modo il makefile può essere ridotto come ho mostrato in precedenza.
Variabili interne in CMake
eMake
Ora diventando un po 'avanzato, CMake
possiamo impostare un flag del compilatore come il seguente,
set(CMAKE_C_FLAGS "-Wall")
Ulteriori informazioni sulle CMake
variabili predefinite nel CMakeCache.txt
file. Il CMake
codice sopra sarà equivalente al Make
codice 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 cmake
usando 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.h
file proprio come gli auto-config
strumenti utilizzando la configure_file
funzione. È 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 option
funzione.
Makefile configurare / modificare
Se in qualche modo abbiamo bisogno di compilarlo con qualche flag di debug, possiamo invocare il make
simile,
make CXXFLAGS=NDEBUG
Penso variabili interne Makefile-rules
e CMake-functions
sono un buon inizio per il confronto, buona fortuna con ulteriori scavi.
cmake
volevo anche questo. Ma dubito che lo troverai perché le capacità semplicemente non mappano bene l'una con l'altra. Se provi acmake
comportarti come semake
fossi impazzito, sul serio. Meglio solo per iniziare da zero. Le cose in cui sono banalimake
sono piuttosto coinvoltecmake
, e viceversa.