Me preguntaba si había algún código de muestra para Makefiles ( make) y CMakeLists.txt( cmake) que ambos hagan lo mismo (la única diferencia es que uno está escrito makey 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.

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.makeycmakeson 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
progde las fuentesprog1.c, prog2.c, prog3.c and main.c.progestá vinculado conlibmystatlib.aylibmydynlib.soque también se construyen desde la fuente. Además,progusa la bibliotecalibstuff.aenstuff/liby 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.txtque 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_TYPEen "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_CODEpropiedad) y muchos otros. Aún así, se pueden implementar configuraciones más oscuras a mano en CMake tan bien como en un Makefile (usandoCOMPILE_FLAGSpropiedades 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
makeen 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
CPPFLAGSlugar deINCDIRuno, 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é establecerCPPyCCexplícitamente? Ya están establecidos en buenos valores pormake, son variables predefinidas.maketambién reconoce qué compilador usar para qué tipo de fuente, las reglas integradas son muchas.:=lugar de=.cmakees más comparable a laautomakedemake.INCLUDESlugar 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
Makefilesalida de muestra delCMakeList.txtarchivo, 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
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í,Tenga en cuenta que se puede
CMakeocultarhowla compilación. Solo especificamoswhatla entrada y la salida.La
CMakeLists.txtlista de llamadas de función-que se definen por contienecmake.(Función CMake) Vs Make reglas
En
Makefileelrules and recipesse utilizan en lugar defunctions. Además de lafunctionfunción -like,rules and recipesproporciona encadenamiento. Mi minimalistaMakefilese verá así,Si bien
executable.mkse verá como el siguiente,Comenzando desde cero, comenzaré con algo
Makefilecomo 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
Makefileproporciona los detalles querecipemuestran quehowse puede realizar la compilación. Es posible escribirexecutable.mkpara mantener los detalles definidos en un archivo. De esa manera, el archivo MAKE se puede reducir como mostré anteriormente.Variables internas en
CMakeyMakeAhora avanzando un poco,
CMakepodemos establecer una bandera de compilador como la siguiente,Obtenga más información sobre las
CMakevariables predeterminadas en elCMakeCache.txtarchivo. ElCMakecódigo anterior será equivalente alMakecódigo siguiente,Tenga en cuenta que
CFLAGSes una variable interna enMake, de la misma manera,CMAKE_C_FLAGSes una variable interna enCMake.agregando incluir y ruta de biblioteca en CMake
Podemos hacerlo
cmakeusando 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.harchivos comoauto-configherramientas usandoconfigure_filefunction. 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
optionfunción.Makefile configurar / ajustar
Si de alguna manera necesitamos compilarlo con alguna bandera de depuración, podemos invocar algo
makesimilar,Creo que las variables internas,
Makefile-rulesyCMake-functionsson un buen comienzo para la comparación, buena suerte con más indagaciones.fuente