En el desarrollo de software , CMake es un software multiplataforma gratuito y de código abierto para la automatización de compilaciones , pruebas , empaquetado e instalación de software mediante el uso de un método independiente del compilador . [3] CMake no es un sistema de compilación, sino que genera los archivos de compilación de otro sistema. Admite jerarquías de directorios y aplicaciones que dependen de varias bibliotecas. Se utiliza junto con entornos de compilación nativos como Make , Qt Creator , Ninja , Android Studio , Xcode de Appley Microsoft Visual Studio . Tiene dependencias mínimas, y solo requiere un compilador C ++ en su propio sistema de compilación.
Desarrollador (es) | Andy Cedilnik, Bill Hoffman, Brad King, Ken Martin, Alexander Neundorf |
---|---|
Versión inicial | 2000 |
Lanzamiento estable | 3.20.3 [1] / 27 de mayo de 2021 |
Repositorio | |
Escrito en | C , C ++ [2] |
Sistema operativo | Multiplataforma |
Tipo | Herramientas de desarrollo de software |
Licencia | Nuevo BSD |
Sitio web | cmake |
CMake se distribuye como software de código abierto bajo una licencia New BSD permisiva. [4]
Historia
El desarrollo de CMake comenzó en 1999 en respuesta a la necesidad de un entorno de construcción multiplataforma para Insight Segmentation and Registration Toolkit . [5] El proyecto está financiado por la Biblioteca Nacional de Medicina de los Estados Unidos como parte del Proyecto Humano Visible . Fue parcialmente inspirado por pcmaker, que fue creado por Ken Martin y otros desarrolladores para admitir Visualization Toolkit (VTK) . En Kitware , Bill Hoffman combinó componentes de pcmaker con sus propias ideas, esforzándose por imitar la funcionalidad de los scripts de configuración de Unix . CMake se implementó por primera vez en 2000 y se desarrolló aún más en 2001.
El desarrollo y las mejoras continuas fueron impulsados por la incorporación de CMake en los propios sistemas de los desarrolladores, incluido el Proyecto VXL , [ aclaración necesaria ] las características CABLE [6] agregadas por Brad King, [ aclaración necesaria ] y GE Corporate R&D para soporte de DART. [ aclaración necesaria ] Se crearon características adicionales cuando VTK hizo la transición a CMake para su entorno de compilación y para admitir ParaView .
La versión 3.0 fue lanzada en junio de 2014. [7] Se ha descrito como el comienzo de "Modern CMake". [8] Los expertos ahora aconsejan evitar variables a favor de objetivos y propiedades . [9] Los comandos add_compile_options
, include_directories
, link_directories
, link_libraries
que estaban en el núcleo de CMake 2 deben ahora ser sustituidos por los comandos específicos de la diana.
Características
Una característica clave es la capacidad de colocar (opcionalmente) las salidas del compilador (como archivos de objeto) fuera del árbol de origen. Esto permite compilaciones múltiples desde el mismo árbol de fuentes y compilación cruzada . También mantiene limpio el árbol de origen y garantiza que la eliminación de un directorio de compilación no eliminará los archivos de origen.
Estructura de proyecto flexible
CMake puede localizar ejecutables, archivos y bibliotecas especificados por el usuario y en todo el sistema. Estas ubicaciones se almacenan en una caché , que luego se puede personalizar antes de generar los archivos de compilación de destino. La caché se puede editar con un editor gráfico, que se envía con CMake.
CMake soporta bien las jerarquías de directorios complicadas y las aplicaciones que dependen de varias bibliotecas. Por ejemplo, CMake puede acomodar un proyecto que tiene varios juegos de herramientas o bibliotecas que tienen 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 extensible de código abierto permite que CMake se adapte según sea necesario para proyectos específicos. [10]
Soporte de configuración IDE
CMake puede generar archivos de proyecto para varios IDE populares , como Microsoft Visual Studio , Xcode y Eclipse CDT . También puede producir scripts de compilación para MSBuild o NMake en Windows; Unix Make en plataformas similares a Unix como Linux , macOS y Cygwin ; y Ninja en plataformas Windows y similares a Unix.
Proceso de construcción
La construcción de un programa o biblioteca con CMake es un proceso de dos etapas. Primero, se crean (generan) archivos de compilación estándar a partir de archivos de configuración (CMakeLists.txt) que están escritos en lenguaje CMake . Luego, las herramientas de construcción nativas de la plataforma (cadena de herramientas nativa) se utilizan para la construcción real de programas. [10] [11]
Los archivos de compilación se configuran en función del generador utilizado (por ejemplo, Makefiles de Unix para make ). Los usuarios avanzados también pueden crear e incorporar generadores de archivos MAKE adicionales para respaldar sus necesidades específicas de compilador y sistema operativo. Los archivos generados se colocan normalmente (mediante el uso de cmake
la bandera 's) en una carpeta fuera de las fuentes de uno (de acumulación de origen), por ejemplo, build/
.
Cada proyecto de compilación, a su vez, contiene un CMakeCache.txt
archivo y un CMakeFiles
directorio en cada (sub) directorio de los proyectos (que se incluyeron add_subdirectory(...)
anteriormente mediante el comando), lo que ayuda a evitar o acelerar la etapa de regeneración una vez que se ejecuta nuevamente.
Una vez que se ha generado el Makefile (o la alternativa), el comportamiento de la compilación se puede ajustar mediante las propiedades de destino (desde la versión 3.1) o mediante CMAKE_...
variables globales con prefijo. Se desaconseja este último para configuraciones de solo destino porque las variables también se utilizan para configurar CMake en sí y para establecer valores predeterminados iniciales. [9]
Tipos de objetivos de construcción
Dependiendo de la configuración de CMakeLists.txt, los archivos de compilación pueden ser ejecutables, bibliotecas (por ejemplo libxyz
, xyz.dll
etc.), bibliotecas de archivos de objetos o pseudo-destinos (incluidos los alias). Cmake puede producir archivos de objetos que se pueden vincular mediante binarios / bibliotecas ejecutables, evitando la vinculación dinámica (en tiempo de ejecución) y usando una estática (en tiempo de compilación) en su lugar. Esto permite flexibilidad en la configuración de varias optimizaciones. [12]
Las dependencias de construcción se pueden determinar automáticamente.
Idioma
CMake tiene una relativamente simple interpretado , imprescindible , lenguaje de script. Admite variables, manipulación de cadenas, matrices, declaraciones de funciones / macros e inclusión de módulos (importación). Los comandos (o directivas) de CMake Language se leen cmake
desde un archivo llamado CMakeLists.txt
. Este archivo especifica los archivos de origen y los parámetros de compilación, que cmake colocará en la especificación de compilación del proyecto (como un Makefile). Además, los .cmake
archivos con sufijo pueden contener scripts utilizados por cmake. [13]
Para generar los archivos de construcción de un proyecto, se invoca cmake
en la terminal y se especifica el directorio que contiene CMakeLists.txt
. Este archivo contiene uno o más comandos en forma de COMMAND(argument ...)
.
Sintaxis del comando
Los argumentos de los comandos están separados por espacios en blanco y pueden incluir palabras clave para grupos separados de argumentos. Los comandos pueden tomar palabras clave, por ejemplo, en el comando es la palabra clave . Puede servir como delimitador entre la lista de archivos de origen y algunas otras opciones. [14]SET_SOURCE_FILE_PROPERTIES(source_file ... COMPILE_FLAGS compiler_option ...)
COMPILE_FLAGS
Ejemplos de comandos que cmake incluye para especificar objetivos y sus dependencias (que serán construidos por la cadena de herramientas nativa) y que sirven como punto de partida de CMakeLists.txt: [15] [16] [17]
add_executable(...)
- declara un destino binario ejecutable con fuentes (dependiendo del idioma elegido) para ser construido
add_library(...)
- lo mismo pero para una bibliotecatarget_link_libraries(...)
- agrega dependencias, etc.
Cadenas JSON
Cmake admite la extracción de valores en variables de las cadenas de datos JSON (desde la versión 3.19). [18]
Internos
Los programas ejecutables CMake, CPack y CTest están escritos en el lenguaje de programación C ++ .
Gran parte de la funcionalidad de CMake se implementa en módulos escritos en el lenguaje CMake . [19]
Desde la versión 3.0, la documentación de CMake utiliza el marcado reStructuredText . Las páginas HTML y las páginas man son generadas por el generador de documentación Sphinx .
Módulos y herramientas
CMake se envía con numerosos .cmake
módulos y herramientas. Estos facilitan el trabajo como encontrar dependencias ( FindXYZ
módulos), probar el entorno de la cadena de herramientas y los ejecutables, empaquetar versiones ( CPack
módulo y cpack
comando) y administrar dependencias en proyectos externos ( ExternalProject
módulo): [20] [21]
- ctest : se utiliza para los comandos de prueba de destino especificados por CMakeLists.txt
- ccmake y cmake-gui : modifica y actualiza las variables de configuración destinadas al sistema de compilación nativo
- cpack : ayuda a empaquetar el software
CPack
CPack es un sistema de empaquetado para distribuciones de software. Está estrechamente integrado con CMake pero puede funcionar sin él. [22] [23]
Se puede utilizar para generar:
- Paquetes Linux RPM , deb y gzip (tanto para binarios como para código fuente ).
- Archivos NSIS (para Microsoft Windows ).
- paquetes macOS .
Software construido por CMake
Fuente abierta
La lista de los ejemplos más notables de software creado con CMake incluye:
- MySQL
- Boost (bibliotecas de C ++)
- KDE / KDE Plasma 5 : entorno de escritorio para sistemas basados en Linux
- KiCAD
- FreeCAD
- Webkit
Herramientas científicas
En particular, el software utilizado por el experimento ATLAS también se construye utilizando CMake. El software en sí está escrito en C / C ++ y Python. [24]
Ejemplos de
Hola Mundo
Los siguientes archivos de código fuente demuestran cómo construir un programa simple de hola mundo escrito en C ++ usando CMake. Los archivos de origen se colocan en un src/
directorio.
// src / Hello_world.cc #include int main () { std :: cout << "¡Hola, mundo! \ n " ; }
# src / CMakeLists.txt cmake_minimum_required ( VERSIÓN 3.10 )# establece el nombre del proyecto project ( "Hello World" )# especificar el ejecutable y el archivo fuente correspondiente add_executable ( hola "Hello_world.cc" )
script bash para ejecutar CMake en un sistema Linux . Este ejemplo asume que la secuencia de comandos se mantendrá junto a la src/
carpeta:
#! / usr / bin / env bash # Coloque este archivo junto a la carpeta src /cmake -S src / -B build / # Solicita que los resultados de la compilación se coloquen en la carpeta build /
cmake --build build / # Inicia la compilación
./build/hello # Ejecuta el programa compilado. Salidas "¡Hola, mundo!"
Ver también
- Lista de software de automatización de compilación § Generación de scripts de compilación
- configurar script
- Monorepo
Referencias
- ^ "CMake 3.20.3 disponible para descargar" .
- ^ "El proyecto de código abierto de CMake en OpenHub" . OpenHub . Consultado el 9 de abril de 2016 .
- ^ "CMake" .
- ^ "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 .
- ^ "El CABLE" . Archivado desde el original el 19 de junio de 2013 . Consultado el 10 de noviembre de 2010 .
- ^ Maynard, Robert (10 de junio de 2014). "[CMake] [ANUNCIO] CMake 3.0.0 lanzado" .
- ^ "CMake moderno eficaz" . Gist .
- ^ a b https://github.com/boostcon/cppnow_presentations_2017/blob/master/05-19-2017_friday/effective_cmake__daniel_pfeifer__cppnow_05-19-2017.pdf , https://gist.github.com/mbinna/c61dbb39bca0e4fb7d1af73b0d1
- ^ a b Neundorf, Alexander (21 de junio de 2006). "Por qué el proyecto KDE cambió a CMake y cómo" . LWN.net .
- ^ "cmake-toolchains (7) - documentación de CMake 3.19.0-rc2" . cmake.org . Consultado el 29 de octubre de 2020 .
- ^ "cmake-buildsystem (7) - Documentación de CMake 3.19.0-rc3" . cmake.org . Consultado el 14 de noviembre de 2020 .
- ^ "cmake-language (7) - Documentación de CMake 3.19.0-rc2" . cmake.org . Consultado el 29 de octubre de 2020 .
- ^ Andrej Cedilnik (30 de octubre de 2003). "Desarrollo de software multiplataforma utilizando software CMake" . Diario de Linux . Consultado el 29 de enero de 2021 .
- ^ "add_executable - Documentación de CMake 3.19.0-rc1" . cmake.org . Consultado el 25 de octubre de 2020 .
- ^ "add_library - Documentación de CMake 3.19.0-rc1" . cmake.org . Consultado el 25 de octubre de 2020 .
- ^ "target_link_directories - CMake 3.20.2 Documentación" . cmake.org . Consultado el 10 de mayo de 2021 .
- ^ "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-rc1" . cmake.org . Consultado el 25 de octubre de 2020 .
- ^ "cmake-modules (7) - CMake 3.14.7 Documentación" . cmake.org . Consultado el 24 de octubre de 2020 .
- ^ "ExternalProject - CMake 3.14.7 Documentación" . cmake.org . Consultado el 24 de octubre de 2020 .
- ^ "Embalaje con CPack" . Wiki de la comunidad CMake .
- ^ - Manual de comandos generales de Linux
- ^ Elmsheuser, J; Krasznahorkay, A; Obreshkov, E; Undrus, A (2017). "Construcción de software a gran escala con CMake en ATLAS" (PDF) . CERN.
enlaces externos
- Página web oficial
- CMake en GitHub
- C ++ Now 2017: Daniel Pfeifer "Effective CMake" en YouTube