CMake es una herramienta de desarrollo de software gratuita y multiplataforma para crear aplicaciones mediante instrucciones independientes del compilador . También puede automatizar las pruebas , el empaquetado y la instalación . Se ejecuta en diversas plataformas y admite muchos lenguajes de programación . [ 3 ]
Como herramienta de meta-compilación, CMake configura las herramientas de compilación nativas , las cuales, a su vez, compilan el código fuente . CMake genera archivos de configuración para otras herramientas de compilación a partir de archivos de configuración específicos de CMake. Estas herramientas se encargan de la compilación directa, utilizando los archivos generados. Un único conjunto de archivos de configuración específicos de CMake puede utilizarse para compilar un código fuente con las herramientas de compilación nativas de múltiples plataformas. [ 4 ]
Entre las herramientas de compilación nativas destacadas compatibles con CMake se incluyen: Make , Qt Creator , Ninja , Android Studio , Xcode y Visual Studio . [ 4 ]
CMake se distribuye como software libre y de código abierto bajo una licencia permisiva BSD-3-Clause . [ 5 ]
Historia
El desarrollo inicial comenzó en 1999 en Kitware con financiación de la Biblioteca Nacional de Medicina de los Estados Unidos como parte del Proyecto Visible Human . [ 4 ] CMake se lanzó por primera vez en 2000.
CMake se desarrolló para dar soporte a la creación del Insight Segmentation and Registration Toolkit (ITK) para múltiples plataformas. Entre los objetivos declarados se incluían abordar las debilidades y, al mismo tiempo, mantener las fortalezas de herramientas contemporáneas como autoconf y libtool , y alinearse con la tecnología de compilación más avanzada de la época: scripts de configuración y archivos Make para plataformas Unix , y archivos de proyecto de Visual Studio para Windows . [ 6 ] [ 4 ]
CMake se inspiró en varias herramientas contemporáneas. pcmaker , desarrollado por Ken Martin y otros para dar soporte a la compilación del Visualization Toolkit (VTK) , convertía archivos Make de Unix en archivos NMake para compilar en Windows. [ 4 ] gmake era compatible con compiladores de Unix y Windows, pero su diseño generó problemas difíciles de resolver. Ambas herramientas eran ejemplos funcionales de una herramienta de compilación compatible con Unix y Windows, pero adolecían de un grave defecto: obligaban a los desarrolladores de Windows a usar la línea de comandos, a pesar de que muchos prefieren usar un entorno de desarrollo integrado (IDE) como Visual Studio.
El objetivo de CMake era proporcionar una compatibilidad multiplataforma similar, pero para satisfacer mejor las preferencias de los desarrolladores en cada plataforma.
Los objetivos de diseño de la primera versión incluían: [ 4 ]
- Depende únicamente del compilador C++ del sistema anfitrión; no se requieren otras herramientas ni bibliotecas de terceros.
- Generar archivos de proyecto de Visual Studio (así como archivos de Unix).
- Compatibilidad con los siguientes objetivos de compilación: programa , biblioteca estática , biblioteca compartida
- Ejecutar generadores de código en tiempo de compilación
- Admite estructuras de directorios separadas para archivos fuente y archivos de compilación.
- Soporte para la introspección de capacidades del ordenador anfitrión
- Admite el escaneo automático de dependencias de archivos de cabecera C/C++.
- Todas las funciones deben funcionar de forma consistente y con la misma eficacia en todas las plataformas compatibles.
Por diversas razones, los desarrolladores de CMake optaron por desarrollar un lenguaje de scripting para CMake en lugar de usar Tcl , un lenguaje popular para la compilación en aquel entonces. El uso de Tcl habría añadido una dependencia a la máquina anfitriona, lo cual contradice el objetivo de no tener más dependencias que el compilador. Además, Tcl no contaba con un buen soporte en Windows y algunos sistemas Unix en el momento de su desarrollo inicial. [ 4 ]
El desarrollo y las mejoras posteriores fueron impulsados por la incorporación de CMake en los propios sistemas de los desarrolladores, incluido el Proyecto VXL , las características de CABLE [ 7 ] añadidas por Brad King y el I+D corporativo de GE para el soporte de DART (que está obsoleto desde la versión 3.7.). [ 8 ] Se crearon características adicionales cuando VTK hizo la transición a CMake para su entorno de compilación y para dar soporte a ParaView .
La versión 3.0 se publicó en junio de 2014. [ 9 ] Se la ha descrito como el comienzo del "CMake moderno". [ 10 ] Los expertos ahora aconsejan evitar las variables en favor de los objetivos y las propiedades . [ 11 ] Los comandos add_compile_options, include_directories, link_directories, link_librariesque estaban en el núcleo de CMake 2 ahora deberían reemplazarse por comandos específicos del objetivo.
Nombre
El desarrollador de CMake, Brad King, afirmó que "la 'C' de CMake significa 'multiplataforma ' " .
Características
Generadores y soporte para IDE
CMake puede generar archivos de proyecto para IDE como Microsoft Visual Studio , Xcode , Eclipse CDT y scripts de compilació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, especificando el generador para una herramienta de compilación específica de la plataforma. Por defecto, CMake determina automáticamente el generador predeterminado para el entorno anfitrión en el que se ejecuta. -GSe puede usar una opción de línea de comandos para especificar un generador alternativo. Por ejemplo, -G Unix Makefilesfuerza a CMake a crear scripts de compilación para make . [ 4 ]
CMake no admite generadores personalizados sin modificar su implementación. Sin embargo, el código fuente de CMake podría modificarse para incluir un generador personalizado.
Objetivos de compilación
CMake admite la creación de ejecutables, bibliotecas (por ejemplo libxyz, , xyz.dlletc.), bibliotecas de archivos objeto y pseudoobjetivos (incluidos alias). CMake puede generar archivos objeto que pueden enlazarse con binarios/bibliotecas ejecutables, evitando el enlace dinámico (en tiempo de ejecución) y utilizando en su lugar el enlace estático (en tiempo de compilación). Esto permite flexibilidad en la configuración de diversas optimizaciones. [ 12 ]
La generación de objetivos se puede configurar mediante propiedades de objetivo. En versiones anteriores, esto se hacía mediante CMAKE_variables globales con prefijo, pero este enfoque está obsoleto. [ 11 ] [ 13 ]
Configuración jerárquica
Los archivos de configuración de CMake pueden estructurarse según la estructura jerárquica del código fuente; el árbol de código fuente. Un archivo CMakeLists.txten un directorio raíz del código fuente sirve como raíz de la configuración. Puede incluir subdirectorios que contienen cada uno un archivo CMakeLists.txt. Al repetir esto, se obtiene una estructura jerárquica de configuración que sigue la estructura del código fuente. [ 11 ] [ 13 ]
Árbol de construcción independiente
CMake puede almacenar los archivos generados (tanto por CMake como por las herramientas de compilación nativas) en un árbol de directorios separado del árbol de código fuente. [ 4 ]
Esto permite realizar múltiples compilaciones a partir del mismo árbol de código fuente, ya que cada una utiliza un espacio de sistema de archivos independiente . Esto puede aprovecharse para crear configuraciones diferentes o incluso incompatibles, por ejemplo, para distintas plataformas.
Esto también simplifica la gestión de archivos, ya que permite eliminar los archivos generados borrando un único árbol de directorios en lugar de eliminar varios archivos y directorios en todo el árbol de origen. Esto tiende a evitar la eliminación accidental de archivos de origen o la adición accidental de archivos generados al control de versiones .
Gestión de dependencias
CMake garantiza que los componentes dependientes se vuelvan a compilar cuando se modifiquen o compilen sus fuentes. [ 4 ]
Estructura de proyecto flexible
CMake puede localizar ejecutables, archivos y bibliotecas tanto del sistema como especificados por el usuario. Estas ubicaciones se almacenan en una caché , que se puede personalizar antes de generar los archivos de compilación. La caché se puede editar con un editor gráfico, que viene incluido con CMake.
CMake ofrece un buen soporte para jerarquías de directorios complejas y aplicaciones que dependen de varias bibliotecas. Por ejemplo, CMake puede gestionar proyectos con múltiples kits de herramientas o bibliotecas con varios directorios. Además, CMake puede trabajar con proyectos que requieren la creación de ejecutables antes de generar el código que se compilará para la aplicación final. Su diseño de código abierto y extensible permite adaptar CMake según las necesidades de cada proyecto. [ 14 ]
Detección de características del compilador
CMake permite especificar las características que el compilador debe admitir para compilar el programa o la biblioteca de destino. [ 15 ]
Soporte del compilador
CMake admite muchos compiladores, entre ellos: Apple Clang, Clang , GNU GCC , MSVC , Oracle Developer Studio e Intel C++ Compiler . [ 16 ]
Embalaje
CMake puede producir paquetes que pueden ser consumidos tanto por el usuario final como por proyectos de terceros basados en CMake. Mediante CPack, los archivos compilados pueden empaquetarse en un archivo comprimido para el gestor de paquetes del sistema de destino (por ejemplo, dpkg ) o el instalador compatible con la plataforma de destino. [ 17 ] : 132, 142 [ 18 ] [ 19 ] CMake proporciona funciones para obtener paquetes de un servidor remoto que pueden utilizarse como parte del proceso de compilación o para vincular paquetes CMake previamente instalados. [ 19 ]
Interfaz gráfica de usuario
CMake se puede ejecutar utilizando un programa ncursesccmake como el que se puede usar para configurar proyectos a través de la interfaz de línea de comandos .
Encabezados y módulos precompilados
Es posible generar encabezados precompilados mediante CMake desde la versión 3.6. [ 20 ] A partir de la versión 3.28, CMake también puede compilar módulos . También existe soporte experimental para unidades de encabezado. [ 21 ]
cadenas JSON
CMake admite la extracción de valores en variables a partir de cadenas de datos JSON (desde la versión 3.19). [ 22 ]
Idioma
CMake incluye un intérprete para un lenguaje de scripting imperativo, personalizado y relativamente sencillo que admite variables, manipulación de cadenas, matrices, declaración de funciones y macros, e inclusión (importación) de módulos.
El intérprete lee los comandos del lenguaje CMake desde archivos CMakeLists.txtque especifican los archivos fuente y las preferencias de compilación. CMake utiliza esta información para generar archivos de configuración de herramientas nativas. Además, los archivos con el sufijo .cmakese pueden usar para almacenar scripts adicionales. [ 23 ]
Sintaxis de comandos
Los comandos del lenguaje CMake tienen el siguiente formato:
nombre ( argumento ...)
Los argumentos están separados por espacios en blanco y pueden incluir palabras clave para separar grupos de argumentos. Por ejemplo, en el siguiente comando, la palabra clave COMPILE_FLAGSdelimita una lista de archivos fuente de las opciones del compilador. [ 24 ]
establecer_propiedades_archivo_origen( nombre_archivo ... INDICADORES_COMPILACIÓN indicador_compilación ...)
Implementación
El lenguaje de scripting CMake se implementa mediante los generadores Yacc y Lex .
Los programas ejecutables CMake, CPack y CTest están escritos en C++ .
Gran parte de la funcionalidad de CMake se implementa en módulos escritos en el lenguaje CMake . [ 25 ]
La documentación de CMake (desde la versión 3.0) utiliza el marcado reStructuredText . Las páginas HTML y las páginas man se generan mediante el generador de documentación Sphinx .
Herramientas adicionales
CMake incluye numerosos .cmakearchivos de script y herramientas de desarrollo que facilitan tareas como la búsqueda de dependencias (tanto integradas como externas, por ejemplo, FindXYZmódulos), la prueba del entorno de la cadena de herramientas y los ejecutables, el empaquetado de versiones (CPack) y la gestión de dependencias en proyectos externos ( ExternalProjectmódulo). Otras herramientas de desarrollo incluyen: [ 26 ] [ 27 ]
- ccmake y cmake-gui : para actualizar variables de configuración destinadas a una herramienta de compilación nativa.
- CPack : para empaquetar software como paquetes Linux RPM , deb y gzip , archivos NSIS (para Windows) y paquetes macOS [ 28 ] [ 29 ]
- CTest y CDash : para pruebas y generación de informes de software.
Adopción
CMake ha sido ampliamente adoptado en proyectos de software comerciales, de código abierto y académicos. Algunos usuarios destacados incluyen Android NDK , Netflix , Inria , MySQL , Boost (bibliotecas de C++) , KeePassXC , KDE , KiCAD , FreeCAD , Webkit , Blender , [ 30 ] Biicode, ReactOS , Apache Qpid , el experimento ATLAS , [ 31 ] y Second Life . [ 32 ]
Proceso de construcción
La compilación mediante CMake tiene dos etapas principales. [ 4 ] Primero, se generan archivos de configuración de herramientas de compilación nativas a partir de archivos de configuración de CMake , escritos en el lenguaje de scripting de CMake. La sintaxis de la línea de comandos es cmake <dir>donde <dir> es un directorio que contiene un CMakeLists.txtarchivo. Luego, las herramientas de compilación nativas se invocan ya sea a través de CMake ( cmake --build <dir>) o directamente a través de la interfaz de la herramienta nativa. Las herramientas de compilación nativas utilizan los archivos generados. [ 14 ] [ 33 ]
Ejemplos
Hola Mundo
A continuación se muestra cómo configurar CMake para compilar un programa "hola mundo" escrito en C++ y cómo usar CMake para compilar dicho programa.
hola.cpp :
#include <print>int main () { std :: println ( "¡Hola, mundo!" ); return 0 ; }CMakeLists.txt :
cmake_minimum_required ( VERSIÓN 3.22 ) proyecto ( HelloWorld CXX ) agregar_ejecutable ( hello hello.cpp )Para compilar mediante CMake, primero acceda al directorio que contiene los dos archivos anteriores. A continuación, genere los archivos de configuración de compilación nativos mediante el comando CMake multiplataforma:
cmake -B fuera . Todos los archivos generados estarán en el directorio out tal como se especifica mediante -B out.
Luego, compile mediante la herramienta de compilación nativa compatible con CMake:
cmake --build out El programa queda entonces disponible para su ejecución. Mediante Bash , el comando es similar a ./out/hello. En Windows, el archivo de salida termina con .exe.
Incluir
Este ejemplo muestra cómo configurar la ruta de inclusión del preprocesador.
hola.cpp :
#include <print>#incluir "hello.hpp"int main () { for ( int i = 0 ; i < TIMES ; ++ i ) { std :: println ( "¡Hola, mundo!" ); } return 0 ; }hola.hpp :
#pragma una vezconstexpr int TIMES = 10 ;CMakeLists.txt :
cmake_minimum_required ( VERSION 3.22 ) project ( HelloWorld CXX ) add_executable ( hello hello.cpp ) target_include_directories ( hello PRIVATE ${ PROJECT_SOURCE_DIR } )Véase también
Referencias
- ↑ "Versión v4.3.4" .
- ↑ "El proyecto de código abierto CMake en OpenHub" . OpenHub . Consultado el 9 de abril de 2016 .
- ↑ "CMake" .
- 1 2 3 4 5 6 7 8 9 10 11 "La arquitectura de las aplicaciones de código abierto (Volumen 1) CMake" . aosabook.org . Consultado el 11 de junio de 2023 .
- ↑ "Licencias · master · CMake / CMake" . GitLab . Consultado el 13 de noviembre de 2020 .
- ↑ "FLOSS Weekly 111: CMake" . Podcast . Red TWiT . Consultado el 27 de febrero de 2011 .
- ↑ "The CABLE" . Archivado del original el 19 de junio de 2013. Consultado el 10 de noviembre de 2010 .
- ↑ Dart — Documentación de CMake 4.3.3
- ↑ Maynard, Robert (10 de junio de 2014). " [ CMake ] [ ANUNCIO ] Lanzamiento de CMake 3.0.0" .
- ↑ "CMake moderno y eficaz" . Gist .
- ^ Binna , Manuel (22 de julio de 2018) . "CMake moderno y eficaz" .
- ↑ "cmake-buildsystem(7) — Documentación de CMake 3.19.0-rc3" . cmake.org . Consultado el 14 de noviembre de 2020 .
- 1 2 Pfeifer, Daniel (19 de mayo de 2017). CMake efectivo (PDF) . CPPNow.
- 1 2 Neundorf, Alexander (21 de junio de 2006). "Por qué el proyecto KDE cambió a CMake y cómo" . LWN.net .
- ↑ "Detección de características del compilador CMake" . www.scivision.dev . 15 de noviembre de 2020. Consultado el 22 de enero de 2022 .
- ↑ "Compiladores compatibles" . Documentación de CMake . Consultado el 22 de enero de 2022 .
- ↑ Berner, Dominik (2022). CMake Best Practices : Discover Proven Techniques for Creating and Maintaining Programming Projects with CMake . Mustafa Kemal Gilor. Birmingham: Packt Publishing, Limited. ISBN 978-1-80324-424-2OCLC 1319218167
- ↑ "cmake-packages(7) — Documentación de CMake 3.24.1" . cmake.org . Consultado el 11 de septiembre de 2022 .
- 1 2 "Exponer la configuración de un módulo (avanzado) — Documentación del procedimiento de compilación CMake 1.0" . docs.salome-platform.org . Consultado el 11 de septiembre de 2022 .
- ↑ "target_precompile_headers — Documentación de CMake 3.21.20210925-gb818e3c" . cmake.org . Consultado el 25 de septiembre de 2021 .
- ↑ "CXX_MODULE_HEADER_UNIT_SETS" . cmake.org . Kitware . Consultado el 31 de octubre de 2025 .
- ↑ "Notas de la versión de CMake 3.19 — Documentación de CMake 3.19.7" . cmake.org . Consultado el 15 de marzo de 2021 .
- ↑ "cmake-language(7) — Documentación de CMake 3.19.0-rc2" . cmake.org . Consultado el 29 de octubre de 2020 .
- ↑ Cedilnik, Andrej (30 de octubre de 2003). "Desarrollo de software multiplataforma utilizando software CMake" . Linux Journal . Consultado el 29 de enero de 2021 .
- ↑ "cmake-language(7) — Documentación de CMake 3.19.0-rc1" . cmake.org . Consultado el 25 de octubre de 2020 .
- ↑ "cmake-modules(7) — Documentación de CMake 3.14.7" . cmake.org . Consultado el 24 de octubre de 2020 .
- ↑ "ExternalProject — Documentación de CMake 3.14.7" . cmake.org . Consultado el 24 de octubre de 2020 .
- ↑ "Empaquetado con CPack" . Wiki de la comunidad CMake .
- ↑ – Manual de comandos generales de Linux de ManKier.com .
- ↑ "Building Blender - Blender Developer Wiki" . wiki.blender.org . Consultado el 1 de julio de 2021 .
- ↑ Elmsheuser, J; Krasznahorkay, A; Obreshkov, E; Undrus, A (2017). "Desarrollo de software a gran escala con CMake en ATLAS" (PDF) . CERN. Archivado (PDF) del original el 28 de julio de 2018.
- ↑ "Éxito con CMake" . cmake.org . Kitware. 2011. Consultado el 12 de marzo de 2022 .
- ↑ "cmake-toolchains(7) — Documentación de CMake 3.19.0-rc2" . cmake.org . Consultado el 29 de octubre de 2020 .
Enlaces externos
- Software 2000
- Automatización de compilaciones
- Herramientas de compilación
- Software que utiliza la licencia BSD.
- Software libre programado en C
- Software libre programado en C++