Me preguntaba si había algún código de muestra para Makefile
s ( make
) y CMakeLists.txt
( cmake
) que ambos hagan lo mismo (la única diferencia es que uno está escrito make
y el otro cmake
).
Intenté buscar 'cmake vs make', pero nunca encontré ninguna comparación de código. Sería de gran ayuda comprender las diferencias, aunque solo sea por un caso sencillo.
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.make
ycmake
son tan distintos que deben ser vistos más como un complemento en lugar de herramientas de la competencia?cp *.x $(OUTDIR)
" lo que escribirías en un Makefile. Quizás la parte más molesta para mí es que los Makefiles generados son, por diseño, completamente no portátiles e inflexibles (continuación)Respuestas:
El siguiente Makefile crea un ejecutable con el nombre
prog
de las fuentesprog1.c, prog2.c, prog3.c and main.c
.prog
está vinculado conlibmystatlib.a
ylibmydynlib.so
que también se construyen desde la fuente. Además,prog
usa la bibliotecalibstuff.a
enstuff/lib
y su encabezado enstuff/include
. El Makefile por defecto crea un objetivo de lanzamiento, pero también ofrece un objetivo de depuración:Aquí hay un
CMakeLists.txt
que hace (casi) exactamente lo mismo, con algunos comentarios para subrayar las similitudes con el Makefile:En este sencillo ejemplo, las diferencias más importantes son:
CMake reconoce qué compiladores utilizar para qué tipo de fuente. Además, invoca la secuencia correcta de comandos para cada tipo de objetivo. Por lo tanto, no existe una especificación explícita de comandos como
$(CC) ...
,$(RANLIB) ...
etc.Todos los indicadores habituales del compilador / enlazador que se ocupan de la inclusión de archivos de encabezado, bibliotecas, etc. se reemplazan por comandos independientes de la plataforma / del sistema de compilación.
Los indicadores de depuración se incluyen configurando la variable
CMAKE_BUILD_TYPE
en "Debug" o pasándola a CMake al invocar el programa:cmake -DCMAKE_BUILD_TYPE:STRING=Debug
.CMake ofrece también la inclusión independiente de la plataforma del indicador '-fPIC' (a través de la
POSITION_INDEPENDENT_CODE
propiedad) y muchos otros. Aún así, se pueden implementar configuraciones más oscuras a mano en CMake tan bien como en un Makefile (usandoCOMPILE_FLAGS
propiedades similares). Por supuesto, CMake realmente comienza a brillar cuando se incluyen bibliotecas de terceros (como OpenGL) de manera portátil.El proceso de compilación tiene un paso si usa un Makefile, es decir, escribir
make
en la línea de comandos. Para CMake, hay dos pasos: Primero, necesita configurar su entorno de compilación (ya sea escribiendocmake <source_dir>
su directorio de compilación o ejecutando algún cliente GUI). Esto crea un Makefile o algo equivalente, dependiendo del sistema de compilación de su elección (por ejemplo, make en Unixes o VC ++ o MinGW + Msys en Windows). El sistema de compilación se puede pasar a CMake como parámetro; sin embargo, CMake hace elecciones predeterminadas razonables según la configuración de su sistema. En segundo lugar, realiza la compilación real en el sistema de compilación seleccionado.Las fuentes y las instrucciones de compilación están disponibles en https://github.com/rhoelzel/make_cmake .
fuente
CPPFLAGS
lugar deINCDIR
uno, podría haber usado las reglas integradas y la invocación explícita del compilador habría sido redundante. De manera similar, para el manejo de ar, las reglas integradas también pueden cubrir eso. Además, ¿por qué establecerCPP
yCC
explícitamente? Ya están establecidos en buenos valores pormake
, son variables predefinidas.make
también reconoce qué compilador usar para qué tipo de fuente, las reglas integradas son muchas.:=
lugar de=
.cmake
es más comparable a laautomake
demake
.INCLUDES
lugar deINCDIR
. No necesita las reglas% .o:%. C.Elija algún software que use CMake como su sistema de compilación (hay muchos proyectos de código abierto para elegir como ejemplo). Obtenga el código fuente y configúrelo usando CMake. Lea los archivos MAKE resultantes y disfrute.
Una cosa a tener en cuenta es que esas herramientas no se asignan uno a uno. La diferencia más obvia es que CMake busca dependencias entre diferentes archivos (por ejemplo, encabezado C y archivos fuente), mientras que make deja eso a los autores del archivo Make.
fuente
Si esta pregunta es sobre una
Makefile
salida de muestra delCMakeList.txt
archivo, verifique las fuentes de cmake-backend y genere unaMakefile
. 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í,Tenga en cuenta que se puede
CMake
ocultarhow
la compilación. Solo especificamoswhat
la entrada y la salida.La
CMakeLists.txt
lista de llamadas de función-que se definen por contienecmake
.(Función CMake) Vs Make reglas
En
Makefile
elrules and recipes
se utilizan en lugar defunctions
. Además de lafunction
función -like,rules and recipes
proporciona encadenamiento. Mi minimalistaMakefile
se verá así,Si bien
executable.mk
se verá como el siguiente,Comenzando desde cero, comenzaré con algo
Makefile
como el siguiente,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 querecipe
muestran quehow
se puede realizar la compilación. Es posible escribirexecutable.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,Obtenga más información sobre las
CMake
variables predeterminadas en elCMakeCache.txt
archivo. ElCMake
código anterior será equivalente alMake
código siguiente,Tenga en cuenta que
CFLAGS
es una variable interna enMake
, 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.Vs agregar inclusión y ruta de biblioteca en Make
Podemos agregar inclusión y bibliotecas agregando líneas como las siguientes,
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 comoauto-config
herramientas usandoconfigure_file
function. Es posible hacer más trucos escribiendo funciones personalizadas. Y finalmente podemos seleccionar una configuración como la siguiente,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,Creo que las variables internas,
Makefile-rules
yCMake-functions
son un buen comienzo para la comparación, buena suerte con más indagaciones.fuente