Si esta pregunta es sobre una Makefilesalida de muestra del CMakeList.txtarchivo, 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 Makees una herramienta flexible para reglas y recetas, CMakees una capa de abstracción que también agrega la función de configuración.
Mi llanura CMakeLists.txtse 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 CMakeocultar howla compilación. Solo especificamos whatla entrada y la salida.
La CMakeLists.txtlista de llamadas de función-que se definen por contiene cmake.
(Función CMake) Vs Make reglas
En Makefileel rules and recipesse utilizan en lugar de functions. Además de la functionfunción -like, rules and recipesproporciona encadenamiento. Mi minimalista Makefilese verá así,
-include "executable.mk"
TARGETS=testapp.bin
all:${TARGETS}
Si bien executable.mkse 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 Makefilecomo 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 Makefileproporciona los detalles que recipemuestran que howse puede realizar la compilación. Es posible escribir executable.mkpara mantener los detalles definidos en un archivo. De esa manera, el archivo MAKE se puede reducir como mostré anteriormente.
Variables internas en CMakeyMake
Ahora avanzando un poco, CMakepodemos establecer una bandera de compilador como la siguiente,
set(CMAKE_C_FLAGS "-Wall")
Obtenga más información sobre las CMakevariables predeterminadas en el CMakeCache.txtarchivo. El CMakecódigo anterior será equivalente al Makecódigo siguiente,
CFLAGS = -Wall
Tenga en cuenta que CFLAGSes una variable interna en Make, de la misma manera, CMAKE_C_FLAGSes una variable interna enCMake .
agregando incluir y ruta de biblioteca en CMake
Podemos hacerlo cmakeusando 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.harchivos como auto-configherramientas usando configure_filefunction. 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 optionfunción.
Makefile configurar / ajustar
Si de alguna manera necesitamos compilarlo con alguna bandera de depuración, podemos invocar algo makesimilar,
make CXXFLAGS=NDEBUG
Creo que las variables internas, Makefile-rulesy CMake-functionsson un buen comienzo para la comparación, buena suerte con más indagaciones.
cmakeyo también quería esto. Pero dudo que lo encuentre porque las capacidades simplemente no se asignan tan bien entre sí. Si intentascmakeactuar comomake, te volverás loco, en serio. Lo mejor es empezar de cero. Las cosas que son trivialesmakeestán bastante envueltascmakey viceversa.