Si esta pregunta es sobre una Makefile
salida de muestra del CMakeList.txt
archivo, verifique las fuentes de cmake-backend y genere una Makefile
. Si no es así, agregando a la respuesta de @Roberto, estoy tratando de simplificarlo ocultando los detalles.
Función CMake
Si bien Make
es una herramienta flexible para reglas y recetas, CMake
es una capa de abstracción que también agrega la función de configuración.
Mi llanura CMakeLists.txt
se verá así,
cmake_minimum_required(VERSION 2.8)
project(example)
file(GLOB testapp_SOURCES *.cc)
add_executable(testapp ${testapp_SOURCES})
Tenga en cuenta que se puede CMake
ocultar how
la compilación. Solo especificamos what
la entrada y la salida.
La CMakeLists.txt
lista de llamadas de función-que se definen por contiene cmake
.
(Función CMake) Vs Make reglas
En Makefile
el rules and recipes
se utilizan en lugar de functions
. Además de la function
función -like, rules and recipes
proporciona encadenamiento. Mi minimalista Makefile
se verá así,
-include "executable.mk"
TARGETS=testapp.bin
all:${TARGETS}
Si bien executable.mk
se verá como el siguiente,
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)
Comenzando desde cero, comenzaré con algo Makefile
como el siguiente,
all: testapp.bin
testapp.bin:sourcea.o sourcb.o
$(CC) $(CFLAGS) -o $@ $^ $(LFLAGS) $(LIBS)
.PHONY: all clean
clean:
$(RM) $(OBJECTS) testapp.bin
Tengo este fragmento de aquí y lo modifiqué. Tenga en cuenta que se agregan algunas reglas implícitas a este archivo que se pueden encontrar en la documentación de makefile. Algunas variables implícitas también son relevantes aquí.
Tenga en cuenta que Makefile
proporciona los detalles que recipe
muestran que how
se puede realizar la compilación. Es posible escribir executable.mk
para mantener los detalles definidos en un archivo. De esa manera, el archivo MAKE se puede reducir como mostré anteriormente.
Variables internas en CMake
yMake
Ahora avanzando un poco, CMake
podemos establecer una bandera de compilador como la siguiente,
set(CMAKE_C_FLAGS "-Wall")
Obtenga más información sobre las CMake
variables predeterminadas en el CMakeCache.txt
archivo. El CMake
código anterior será equivalente al Make
código siguiente,
CFLAGS = -Wall
Tenga en cuenta que CFLAGS
es una variable interna en Make
, de la misma manera, CMAKE_C_FLAGS
es una variable interna enCMake
.
agregando incluir y ruta de biblioteca en CMake
Podemos hacerlo cmake
usando funciones.
target_include_directories(testapp PRIVATE "myincludes")
list(APPEND testapp_LIBRARIES
mytest mylibrarypath
)
target_link_libraries(testapp ${testapp_LIBRARIES})
Vs agregar inclusión y ruta de biblioteca en Make
Podemos agregar inclusión y bibliotecas agregando líneas como las siguientes,
INCLUDES += -Imyincludes
LIBS += -Lmylibrarypath -lmytest
Tenga en cuenta que estas líneas anteriores se pueden generar a partir de herramientas de generación automática o pkg-config. (aunque Makefile no depende de las herramientas de configuración automática)
CMake configure / tweek
Normalmente, es posible generar algunos config.h
archivos como auto-config
herramientas usando configure_file
function. Es posible hacer más trucos escribiendo funciones personalizadas. Y finalmente podemos seleccionar una configuración como la siguiente,
cmake --build . --config "Release"
Es posible agregar alguna opción configurable usando la option
función.
Makefile configurar / ajustar
Si de alguna manera necesitamos compilarlo con alguna bandera de depuración, podemos invocar algo make
similar,
make CXXFLAGS=NDEBUG
Creo que las variables internas, Makefile-rules
y CMake-functions
son un buen comienzo para la comparación, buena suerte con más indagaciones.
cmake
yo también quería esto. Pero dudo que lo encuentre porque las capacidades simplemente no se asignan tan bien entre sí. Si intentascmake
actuar comomake
, te volverás loco, en serio. Lo mejor es empezar de cero. Las cosas que son trivialesmake
están bastante envueltascmake
y viceversa.