stringtranslate.com

CMake

En el desarrollo de software , CMake es un software libre y de código abierto multiplataforma para la automatización de la compilación , prueba , empaquetado e instalación de software mediante un método independiente del compilador . [4] CMake no es un sistema de compilación en sí mismo; genera los archivos de compilación de otro sistema. [5] Admite jerarquías de directorios y aplicaciones que dependen de múltiples bibliotecas. Puede invocar entornos de compilación nativos como Make , Qt Creator , Ninja , Android Studio , Xcode de Apple y Microsoft Visual Studio . [5] Tiene dependencias mínimas, requiriendo solo un compilador de C++ en su propio sistema de compilación. [5]

CMake se distribuye como software gratuito y de código abierto bajo una licencia BSD-3-Clause permisiva . [6]

Historia

El desarrollo de CMake comenzó en 1999, en respuesta a la necesidad de un entorno de compilación multiplataforma para el Insight Segmentation and Registration Toolkit (ITK). [7] [5] El proyecto está financiado por la Biblioteca Nacional de Medicina de los Estados Unidos como parte del Proyecto Visible Human . [5] Se inspiró parcialmente en pcmaker, un predecesor de CMake, que fue creado por Ken Martin y otros desarrolladores para respaldar la construcción del Visualization Toolkit (VTK) . pcmaker era un programa en C que convertía archivos Make en contrapartes NMake de MS Windows. [5] 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.

Históricamente, CMake fue concebido con las siguientes características principales en mente: [5]

Debido a estas restricciones, CMake no eligió utilizar el lenguaje de script Tcl (popular en ese momento) como su lenguaje predeterminado y, en su lugar, los desarrolladores decidieron crear un lenguaje de script más simple. [5]

El desarrollo y las mejoras continuas fueron impulsadas por la incorporación de CMake en los sistemas propios de los desarrolladores, incluido el Proyecto VXL , [ aclaración necesaria ] las características CABLE [8] agregadas por Brad King, [ aclaración necesaria ] y GE Corporate R&D para el soporte de DART. [ aclaración necesaria ] Se crearon características adicionales cuando VTK realizó la transición a CMake para su entorno de compilación y para soportar ParaView .

La versión 3.0 se lanzó en junio de 2014. [9] Se la ha descrito como el comienzo del "CMake moderno". [10] Los expertos ahora recomiendan evitar las variables en favor de los objetivos y las propiedades . [11] Los comandos add_compile_options, include_directories, link_directories, link_librariesque eran el núcleo de CMake 2 ahora deberían reemplazarse por comandos específicos del objetivo.

El desarrollador Brad King ha declarado que "la 'C' en CMake significa 'multiplataforma ' ". [12]

Características

Árbol de construcción independiente

Una de sus principales características es la capacidad de colocar las salidas del compilador (como los archivos de objetos) en un árbol de compilación que se encuentra fuera del árbol de código fuente. [5] Esto permite múltiples compilaciones desde el mismo árbol de código fuente y la compilación cruzada . Los archivos de código fuente y de compilación separados garantizan que la eliminación de un directorio de compilación no afectará a los archivos de código fuente y evita el desorden que podría confundir a los sistemas de control de versiones. [5]

Gestión de dependencias

CMake realiza un seguimiento y vuelve a compilar todas las dependencias ascendentes de un submódulo determinado si se modifican sus fuentes. [5] [a]

Estructura de proyecto flexible

CMake puede localizar ejecutables, archivos y bibliotecas de todo el sistema y especificados por el usuario. Estas ubicaciones se almacenan en una memoria caché , que luego se puede personalizar antes de generar los archivos de compilación de destino. La memoria caché se puede editar con un editor gráfico, que se incluye con CMake.

CMake es compatible con jerarquías de directorios complicadas y aplicaciones que dependen de varias bibliotecas. Por ejemplo, CMake puede adaptarse a un proyecto que tenga varios conjuntos de herramientas o bibliotecas que tengan varios directorios cada una. Además, CMake puede trabajar con proyectos que requieran la creación de ejecutables antes de generar el código que se compilará para la aplicación final. Su diseño extensible y de código abierto permite que CMake se adapte según sea necesario para proyectos específicos. [13]

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.

Detección de características del compilador

CMake permite la especificación de características que el compilador debe soportar para compilar el programa o la biblioteca de destino. [14]

Compiladores

CMake admite una amplia lista de compiladores, incluidos: Apple Clang, Clang , GNU GCC , MSVC , Oracle Developer Studio y Intel C++ Compiler . [15]

Sistema de embalaje

Aunque CMake no es un gestor de paquetes , proporciona módulos básicos (consulte CPack), funciones para instalar binarios e información de paquetes declarada por el CMakeList.txtscript que se utilizará en proyectos de CMake de consumo. El paquete también se puede empaquetar en un archivo de almacenamiento para el gestor de paquetes o el instalador compatible con una plataforma de destino. Los paquetes de terceros también se pueden importar a través de archivos CMake configurados que son proporcionados por el mismo tercero o creados manualmente. [16] : 132, 142  [17] [18]

Interfaz gráfica de usuario

Cmake se puede ejecutar utilizando un programa ncursesccmake como el que se puede utilizar para configurar proyectos a través de la interfaz de línea de comandos.

Proceso de construcción

La creación de un programa o una biblioteca con CMake es un proceso de dos etapas. [5] En primer lugar, se crean (generan) los archivos de creación (normalmente scripts) a partir de los archivos de configuración (scripts CMakeLists.txt) escritos en lenguaje CMake. A continuación, se invocan las herramientas de creación nativas de la plataforma que pueden leer estos archivos de creación (cadena de herramientas nativas) de forma manual o externa cmake --buildpara la creación real de programas (objetivos de creación). [13] [19] El generador especificado por el usuario en la línea de comandos determina qué cadena de herramientas de creación se utilizará. [5]

Generadores

Los archivos de compilación se configuran según el generador utilizado (por ejemplo, Makefiles de Unix para make ) y los archivos de la cadena de herramientas asociados. Los usuarios avanzados también pueden crear e incorporar generadores de makefiles adicionales para satisfacer sus necesidades específicas de compilador y sistema operativo. Los archivos generados generalmente se colocan (usando cmakeel indicador ' ) en una carpeta fuera de la de la fuente (compilación fuera de la fuente), por ejemplo, build/.

Cada proyecto de compilación a su vez contiene su propio CMakeCache.txtarchivo y CMakeFilesdirectorio en cada (sub)directorio de proyecto incluido por el add_subdirectory(...)comando, lo que ayuda a evitar o acelerar la regeneración cuando se ejecuta repetidamente.

El proceso de generación y la salida se pueden ajustar mediante propiedades de destino. Anteriormente, esto se hacía mediante CMAKE_...variables globales con prefijo - que también se utilizan para configurar CMake y para establecer valores predeterminados iniciales. [11] [20] Ahora se desaconseja el enfoque anterior.

Tipos de objetivos de compilación

Según la configuración de CMakeLists.txt, los archivos de compilación pueden ser ejecutables, bibliotecas (por ejemplo libxyz, , xyz.dlletc.), bibliotecas de archivos de objetos o pseudo-objetivos (incluidos alias). CMake puede producir archivos de objetos que se pueden vincular mediante bibliotecas/binarios ejecutables, evitando la vinculación dinámica (en tiempo de ejecución) y utilizando en su lugar la vinculación estática (en tiempo de compilación). Esto permite flexibilidad en la configuración de varias optimizaciones. [21]

Las dependencias de compilación se pueden determinar automáticamente.

Encabezados precompilados

Es posible generar encabezados precompilados utilizando CMake desde la versión 3.6. [22]

Idioma

CMakeLists.txt

CMake tiene un lenguaje de programación imperativo e interpretado relativamente simple . Admite variables, métodos de manipulación de cadenas, matrices, declaraciones de funciones/macro e inclusión de módulos (importación). Los comandos (o directivas) del lenguaje CMake se leen desde cmakeun 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, .cmakelos archivos con el sufijo - pueden contener scripts utilizados por CMake. [23]

Para generar los archivos de compilación de un proyecto, se invoca cmakeen la terminal y se especifica el directorio que contiene CMakeLists.txt. Este archivo contiene uno o más comandos en formato COMMAND(argument ...).

Sintaxis de comandos

Los argumentos de los comandos están separados por espacios en blanco y pueden incluir palabras clave para separar grupos de argumentos. Los comandos pueden aceptar palabras clave. Por ejemplo, en el comando la palabra clave es . Sirve como delimitador entre la lista de archivos fuente y algunas otras opciones. [24]SET_SOURCE_FILE_PROPERTIES(source_file ... COMPILE_FLAGS compiler_option ...)COMPILE_FLAGS

Ejemplos de comandos que CMake ofrece para especificar objetivos y sus dependencias y que sirven como punto de partida de CMakeLists.txt: [25] [26] [27]

Cadenas JSON

CMake admite la extracción de valores en variables desde cadenas de datos JSON (desde la versión 3.19). [28]

Internos

El lenguaje de scripting CMake se implementa mediante el uso de generadores Yacc y Lex . [b]

Los programas ejecutables CMake, CPack y CTest están escritos en el lenguaje de programación C++ . [b]

Gran parte de la funcionalidad de CMake se implementa en módulos escritos en el lenguaje CMake. [29]

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 se generan mediante el generador de documentación Sphinx .

Módulos y herramientas

CMake se entrega con numerosos .cmakemódulos y herramientas 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, la creación de paquetes de versiones ( CPackmódulo y cpackcomando) y la gestión de dependencias en proyectos externos ( ExternalProjectmódulo): [30] [31]

Paquete C

CPack es un sistema de empaquetado para distribuciones de software. Está estrechamente integrado con CMake pero puede funcionar sin él. [32] [33]

Se puede utilizar para generar:

Adopción

CMake ha sido ampliamente adoptado entre proyectos de software comerciales, de código abierto y académicos. Algunos usuarios notables incluyen Android NDK , Netflix , Inria , MySQL , Boost (bibliotecas C++) , KeePassXC , KDE , KiCAD , FreeCAD , Webkit , Blender , [34] Biicode, ReactOS , Apache Qpid , el experimento ATLAS , [35] y Second Life . [36]

Ejemplos

Hola Mundo

Los siguientes archivos de código fuente demuestran cómo crear un programa simple de hola mundo escrito en C++ utilizando CMake.

Ejemplo 1

// hola.cpp #include <iostream> int main () { std :: cout << "¡Hola, mundo!" << std :: endl ;       devuelve 0 ; } 
# CMakeLists.txt cmake_minimum_required ( VERSIÓN 3.5 ) proyecto ( HelloWorld CXX ) add_executable ( hola hola.cpp )   

Ejemplo 2

// hola.cpp #include "hola_encabezado.h" #include <iostream>  int main () { for ( int i = 0 ; i < Times ; i ++ ) { std :: cout << "¡Hola, mundo!" << std :: endl ; }                  devuelve 0 ; } 
// hola_encabezado.h #ifndef HOLA_ENCABEZADO_H_ #define HOLA_ENCABEZADO_H_ const int Times = 10 ; #endif    
# CMakeLists.txt cmake_minimum_required ( VERSIÓN 3.5 ) proyecto ( HelloWorld CXX ) incluir_directorios ( ${ PROJECT_SOURCE_DIR } ) agregar_ejecutable ( hola hola.cpp )   

Comandos de shell para ejecutar CMake en un sistema Linux (deben ingresarse en el directorio que contiene los dos archivos anteriores):

cmake  -B  build  . # Configurar el directorio de compilación.
cmake --build build # Construir el programa en el directorio de compilación.
./build/hello # Ejecutar el programa (genera "¡Hola, mundo!")     


Véase también

Notas

  1. ^ Dependencias ascendentes: fuentes dependientes que dependen de un archivo fuente modificado
  2. ^ ab Como es evidente en el repositorio de código fuente de CMake.

Referencias

  1. ^ "CMake 3.30.5 disponible para descargar". 9 de octubre de 2024. Consultado el 13 de octubre de 2024 .
  2. ^ "CMake 3.31.0-rc1 está listo para pruebas". 10 de octubre de 2024. Consultado el 13 de octubre de 2024 .
  3. ^ "El proyecto de código abierto CMake en OpenHub". OpenHub . Consultado el 9 de abril de 2016 .
  4. ^ "Hacer".
  5. ^ abcdefghijklm "La arquitectura de las aplicaciones de código abierto (volumen 1) CMake". aosabook.org . Consultado el 11 de junio de 2023 .
  6. ^ "Licencias · master · CMake / CMake". GitLab . Consultado el 13 de noviembre de 2020 .
  7. ^ "FLOSS Weekly 111: CMake". podcast . Red TWiT . Consultado el 27 de febrero de 2011 .
  8. ^ "EL CABLE". Archivado desde el original el 19 de junio de 2013. Consultado el 10 de noviembre de 2010 .
  9. ^ Maynard, Robert (10 de junio de 2014). "[CMake] [ANUNCIO] Lanzamiento de CMake 3.0.0".
  10. ^ "CMake moderno y eficaz". Gist .
  11. ^ ab Binna, Manuel (22 de julio de 2018). "CMake moderno y eficaz".
  12. ^ https://public.kitware.com/Bug/view.php?id=14012#c32631 [ URL básica ]
  13. ^ ab Neundorf, Alexander (21 de junio de 2006). "Por qué el proyecto KDE cambió a CMake y cómo". LWN.net .
  14. ^ "Detección de características del compilador CMake". www.scivision.dev . 15 de noviembre de 2020 . Consultado el 22 de enero de 2022 .
  15. ^ "Compiladores compatibles". Documentación de CMake . Consultado el 22 de enero de 2022 .
  16. ^ Berner, Dominik (2022). Mejores prácticas de CMake: descubra técnicas probadas para crear y mantener proyectos de programación con CMake. Mustafa Kemal Gilor. Birmingham: Packt Publishing, Limited. ISBN 978-1-80324-424-2. OCLC  1319218167.
  17. ^ "cmake-packages(7) — Documentación de CMake 3.24.1". cmake.org . Consultado el 11 de septiembre de 2022 .
  18. ^ "Exposición de la configuración de un módulo (avanzado) — Documentación del procedimiento de compilación de CMake 1.0". docs.salome-platform.org . Consultado el 11 de septiembre de 2022 .
  19. ^ "cmake-toolchains(7) — Documentación de CMake 3.19.0-rc2". cmake.org . Consultado el 29 de octubre de 2020 .
  20. ^ Pfeifer, Daniel (19 de mayo de 2017). Cmake efectivo (PDF) . CPPNow.
  21. ^ "cmake-buildsystem(7) — Documentación de CMake 3.19.0-rc3". cmake.org . Consultado el 14 de noviembre de 2020 .
  22. ^ "target_precompile_headers — Documentación de CMake 3.21.20210925-gb818e3c". cmake.org . Consultado el 25 de septiembre de 2021 .
  23. ^ "cmake-language(7) — Documentación de CMake 3.19.0-rc2". cmake.org . Consultado el 29 de octubre de 2020 .
  24. ^ Cedilnik, Andrej (30 de octubre de 2003). "Desarrollo de software multiplataforma con software CMake". Linux Journal . Consultado el 29 de enero de 2021 .
  25. ^ "add_executable — Documentación de CMake 3.19.0-rc1". cmake.org . Consultado el 25 de octubre de 2020 .
  26. ^ "add_library — Documentación de CMake 3.19.0-rc1". cmake.org . Consultado el 25 de octubre de 2020 .
  27. ^ "target_link_directories — Documentación de CMake 3.20.2". cmake.org . Consultado el 10 de mayo de 2021 .
  28. ^ "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 .
  29. ^ "cmake-language(7) — Documentación de CMake 3.19.0-rc1". cmake.org . Consultado el 25 de octubre de 2020 .
  30. ^ "cmake-modules(7) — Documentación de CMake 3.14.7". cmake.org . Consultado el 24 de octubre de 2020 .
  31. ^ "ExternalProject — Documentación de CMake 3.14.7". cmake.org . Consultado el 24 de octubre de 2020 .
  32. ^ "Empaquetado con CPack". Wiki de la comunidad CMake .
  33. ^ cpack(1)  –  Manual de comandos generales de Linux .
  34. ^ "Building Blender - Blender Developer Wiki" (Construcción de Blender - Wiki para desarrolladores de Blender) . wiki.blender.org . Consultado el 1 de julio de 2021 .
  35. ^ 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.
  36. ^ "Éxito de CMake". cmake.org . Kitware. 2011 . Consultado el 12 de marzo de 2022 .

Enlaces externos