Respuestas:
Make (o más bien un Makefile) es un sistema de compilación: controla el compilador y otras herramientas de compilación para compilar su código.
CMake es un generador de sistemas de construcción. Puede producir Makefiles, puede producir archivos de compilación Ninja, puede producir proyectos KDEvelop o Xcode, puede producir soluciones de Visual Studio. Desde el mismo punto de partida, el mismo archivo CMakeLists.txt. Entonces, si tiene un proyecto independiente de la plataforma, CMake es una forma de hacerlo también independiente del sistema de compilación.
Si tiene desarrolladores de Windows acostumbrados a los desarrolladores de Visual Studio y Unix que confían en GNU Make, CMake es (una) de las formas de hacerlo.
Siempre recomendaría usar CMake (u otro generador de sistema de compilación, pero CMake es mi preferencia personal) si pretende que su proyecto sea multiplataforma o ampliamente utilizable. CMake también proporciona algunas características interesantes como detección de dependencias, administración de interfaz de biblioteca o integración con CTest, CDash y CPack.
El uso de un generador de sistema de compilación hace que su proyecto esté más preparado para el futuro. Incluso si ahora es GNU-Make-only, ¿qué sucede si luego decide expandirse a otras plataformas (ya sea Windows o algo incrustado), o simplemente quiere usar un IDE?
find_package()
. Ej. ) O el soporte de pruebas / empaquetado.
La afirmación de que CMake es un "generador de compilación" es un error común.
No es técnicamente incorrecto; solo describe CÓMO funciona, pero NO LO que hace.
En el contexto de la pregunta, hacen lo mismo: toman un montón de archivos C / C ++ y los convierten en binarios.
Entonces, ¿cuál es la verdadera diferencia?
CMake es mucho más de alto nivel. Está diseñado para compilar C ++, para el cual escribe mucho menos código de compilación, pero también puede usarse para compilaciones de propósito general. make
también tiene algunas reglas C / C ++ incorporadas, pero en su mayoría son inútiles.
CMake
realiza una compilación de dos pasos: genera un script de compilación de bajo nivel en ninja
o en make
muchos otros generadores, y luego lo ejecuta. Todas las piezas de script de shell que normalmente se acumulan Makefile
solo se ejecutan en la etapa de generación. Por lo tanto, CMake
construir puede ser un orden de magnitud más rápido.
La gramática de CMake
es mucho más fácil de soportar para herramientas externas que las de make .
Una vez que make
construye un artefacto, olvida cómo se construyó. ¿De qué fuentes se creó, qué indicadores del compilador? CMake
lo rastrea, te lo make
deja a ti. Si una de las fuentes de la biblioteca se eliminó desde la versión anterior de Makefile
, make
no la reconstruirá.
Moderno CMake
(comenzando con la versión 3.algo) funciona en términos de dependencias entre "objetivos". Un objetivo sigue siendo un único archivo otput (lamentablemente), pero puede tener dependencias transitivas ("público" / "interfaz" en términos de CMake). Estas dependencias transitivas pueden exponerse u ocultarse de los paquetes dependientes. CMake
gestionará directorios para usted también. Con make
, estás atascado en un nivel de archivo por archivo y administrar directorios a mano.
Podrías codificar algo make
usando archivos de bandera para cubrir los dos últimos vacíos, pero estás solo. make
contiene un lenguaje completo de Turing (incluso dos, a veces tres contando Guile ), y todos ellos son horribles.
Para ser honesto, esto es lo que CMake
y make
tienen en común - sus lenguas son bastante horrible:
para empezar.
Pero en CMake
ti escribes muchas menos líneas de código.