# CMake

CMake es una herramienta multiplataforma de generación o automatización de código. El nombre es una abreviatura para "cross platform make" (make multiplataforma); más allá del uso de "make" en el nombre, CMake es una suite separada y de más alto nivel que el sistema make común de Unix, siendo similar a las autotools.
CMake es un software libre y de código abierto multiplataforma para gestionar la automatización de la construcción del software utilizando un método independiente del compilador. Soporta jerarquías de directorios y aplicaciones que dependen de múltiples bibliotecas. Se utiliza en conjunción con entornos de construcción nativos como Make, Qt Creator, Ninja, Xcode de Apple, y Microsoft Visual Studio. Tiene dependencias mínimas, requiriendo sólo un compilador C++ en su propio sistema de construcción.

## Características

CMake es una familia de herramientas diseñada para construir, probar y empaquetar software. CMake se utiliza para controlar el proceso de compilación del software usando ficheros de configuración sencillos e independientes de la plataforma. Cmake genera makefiles nativos y espacios de trabajo que pueden usarse en el entorno de desarrollo deseado. Es comparable al GNU build system de Unix en que el proceso es controlado por ficheros de configuración, en el caso de CMake llamados CMakeLists.txt. Al contrario que el GNU build system, que está restringido a plataformas Unix, CMake soporta la generación de ficheros para varios sistemas operativos, lo que facilita el mantenimiento y elimina la necesidad de tener varios conjuntos de ficheros para cada plataforma.
CMake puede manejar construcciones en el lugar (in-source builds) y fuera del lugar (out-source builds), permitiendo varias construcciones del mismo árbol fuente, y compilación cruzada. La capacidad de construir un árbol de directorios fuera del árbol de código fuente es una característica clave, asegurando que si se elimina un directorio de construcción, los archivos de código fuente no se vean afectados.
CMake puede localizar ejecutables, archivos y bibliotecas. Estas ubicaciones se almacenan en un caché, que puede ser adaptado antes de generar los archivos de destino. La caché puede ser editada con un editor gráfico, que se incluye en el proyecto.
Las jerarquías de directorios complicadas y las aplicaciones que dependen de varias bibliotecas están bien soportadas por CMake. Por ejemplo, CMake es capaz de acomodar un proyecto que tiene varios kits de herramientas, o bibliotecas que tienen varios directorios cada una. Además, CMake puede trabajar con proyectos que requieren la creación de ejecutables antes de generar código para ser compilado para la aplicación final. Su diseño de código abierto y extensible permite que CMake se adapte según sea necesario para proyectos específicos.
CMake puede generar archivos de proyecto para varios IDEs destacados, como Microsoft Visual Studio, Xcode, y Eclipse CDT. También puede producir scripts de construcción para MSBuild o NMake en Windows; Unix Make en plataformas tipo Unix como Linux, macOS, y Cygwin; y Ninja tanto en Windows como en plataformas tipo Unix.

## Proceso de construcción

El proceso de construcción con CMake tiene lugar en dos etapas. En primer lugar, se crean los archivos de construcción estándar a partir de los archivos de configuración. Luego se utilizan las herramientas de construcción nativas de la plataforma para la construcción real.
El proceso de construcción se controla creando uno o más ficheros CMakeLists.txt en cada directorio (incluyendo subdirectorios). Cada CMakeLists.txt consiste en uno o más comandos. Cada comando tiene la forma COMANDO (argumentos...) donde COMANDO es el nombre del comando, y argumentos es una lista de argumentos separados por espacios. CMake provee comandos predefinidos y definidos por el usuario. Existen generadores makefile para Unix, Borland make, Watcom make, MinGW, MSYS y Microsoft NMake. También es posible generar ficheros de proyecto para Code::Blocks, Eclipse CDT, Microsoft Visual Studio de la 6 a la 10 incluyendo versiones de 64 bits y KDevelop.
Cada proyecto de construcción contiene un archivo CMakeLists.txt, en cada (sub)directorio, que controla el proceso de construcción. El archivo CMakeLists.txt tiene uno o más comandos en forma de COMANDO (argumentos...), donde COMANDO representa el nombre de cada comando y args la lista de argumentos, cada uno separado por un espacio en blanco. Aunque hay muchas reglas incorporadas para compilar las bibliotecas de software (estática y dinámica) y los ejecutables, también hay disposiciones para reglas de compilación personalizadas. Algunas dependencias de compilación se pueden determinar automáticamente. Los usuarios avanzados también pueden crear e incorporar generadores de makefiles adicionales para soportar sus necesidades específicas de compilación y de sistema operativo (SO).

## Internos

Los programas ejecutables CMake, CPack, CTest están escritos en el lenguaje de programación C++. Gran parte de la funcionalidad de CMake se implementa en módulos que están escritos en el lenguaje CMake. Desde la versión 3.0, la documentación de CMake utiliza el marcado reStructuredText. Las páginas HTML y las páginas de manual son generadas por el generador de documentación Sphinx.

## Historia

CMake se creó en respuesta a la necesidad de disponer de un entorno multiplataforma apropiado de construcción para el Insight Segmentation and Registration Toolkit (ITK) creado por la United States National Library of Medicine como parte del Visible Human Project. Fue influenciado por un sistema anterior llamado pcmaker creado por Ken Martin y otros desarrolladores para soportar el Visualization Toolkit (VTK), un sistema para gráficos 3D y visualización libres.
El desarrollo de CMake comenzó en 1999 en respuesta a la necesidad de un entorno de construcción multiplataforma para el Insight Segmentation and Registration Toolkit (ITK). El proyecto está financiado por la Biblioteca Nacional de Medicina de Estados Unidos como parte del Proyecto Humano Visible. Fue inspirado parcialmente por pcmaker, que fue hecho por Ken Martin y otros desarrolladores para apoyar el Visualization Toolkit (VTK). En Kitware, Bill Hoffman mezcló componentes de pcmaker con sus propias ideas, esforzándose por imitar la funcionalidad de configurar scriptsUnix. CMake se implementó por primera vez en 2000 y se desarrolló en 2001.
Para crear CMake, Bill Hoffman en Kitware incorporó algunas ideas de pcmaker, y añadió más cosas propias, con el pensamiento de adoptar algunas de las funcionalidades del GNU build system. La implementación inicial de CMake tuvo lugar a mediados del 2000, con un desarrollo acelerado a comienzos del 2001. Muchas mejoras se debieron a influencias de otros desarrolladores a la hora de incorporar CMake a sus propios sistemas. Por ejemplo, la comunidad de VXL adoptó CMake, contribuyendo con muchas características esenciales. Brad King añadió varias características para dar soporte a CABLE y GCC-XML, un juego de herramientas de envoltura automáticas; GE Corporate R&D necesitaba soporte para su infraestructura de pruebas (DART). Otras funcionalidades se añadieron para soportar la transición de VTK's a CMake, y soportar ParaView, un sistema de visualización paralela para el Advanced Computing Lab en el Laboratorio Nacional de Los Álamos.
El desarrollo y las mejoras continuas fueron impulsadas por la incorporación de CMake en los propios sistemas de los desarrolladores, incluyendo el Proyecto VXL, las características de CABLE agregadas por Brad King, y GE Corporate R&D para el apoyo de DART. Se crearon características adicionales cuando VTK hizo la transición a CMake para su entorno de construcción y para el soporte de ParaView.
La versión 3.0 fue lanzada en junio de 2014. It has been described as the beginning of "Modern CMake". Los expertos ahora aconsejan evitar las variables a favor de targets y properties. Los comandos add_compile_options, include_directories, link_directories, link_libraries que estaban en el núcleo de CMake 2 ahora deben ser reemplazados por comandos específicos de destino.

## Documentación y tutoriales

Aparte de la documentación oficial de CMake, existe un libro titulado Mastering CMake, publicado por Kitware.

## Principales funcionalidades

* Ficheros de configuración escritos en un lenguaje de scripting específico para CMake.
* Análisis automático de dependencias para C, C++, Fortran, y Java.
* Soporte para SWIG, Qt, FLTK, a través del lenguaje de scripting de CMake.
* Soporte para varias versiones de Microsoft Visual Studio, incluyendo la 6, 7, 7.1, 8.0, 9.0 y 10.0
* Genera ficheros para Eclipse CDT (C/C++ Development Tools).
* Detección de cambios en ficheros usando timestamps tradicionales.
* Soporte para builds paralelos.
* Compilador cruzado
* Vista global de todas las dependencias, usando CMake para generar un diagrama graphviz.
* Soporte para builds multiplataforma:
** Linux y otros sistemas POSIX (incluyendo QNX, AIX, *BSD, HP-UX, IRIX/SGI, y Solaris).
** Mac OS X
** Windows 95/98/NT/2000/XP, Windows Vista, Windows 7 y MinGW/MSYS
* Integrado con DART (software), CDash, CTest y CPack, una colección de herramientas para prueba y empaquetado de software.

## CTest, CPack, CDash

Kitware desarrolló estas herramientas en colaboración con muchos otros. Incluyen CMake, CTest, CPack y CDash. CPack es una utilidad de empaquetamiento y despliegue. CTest es un cliente de pruebas libre.

### CPack

CPack es un sistema de empaquetamiento para distribuciones de software que está estrechamente integrado en CMake, pero que puede funcionar sin él. Puede ser usado para generar:
* Linux RPM, deb y gzip distribuciones tanto de binarios como de código fuente.
* NSIS archivos (para Microsoft Windows)
* Paquetes Mac OS X

## Aplicaciones que utilizan CMake

* Avidemux
* Compiz
* Kicad
* KVIrc
* LMMS
* MiKTeX
* MuseScore
* MySQL
* OpenCV
* Poppler
* PvPGN
* Quantum GIS
* Scribus
* Second Life
* SuperTux
* OGRE 3D
* Ryzom
* SUMO