stringtranslate.com

Chacer

En el desarrollo de software , CMake es un software multiplataforma , gratuito y de código abierto para la automatización de la compilación , las pruebas , el empaquetado y la instalación de software mediante el uso de 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 , Apple's Xcode y Microsoft Visual Studio . [5] Tiene dependencias mínimas y solo requiere 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 permisiva de cláusula BSD-3 . [6]

Historia

El desarrollo de CMake comenzó en 1999, en respuesta a la necesidad de un entorno de compilación multiplataforma para 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 Humano Visible . [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 sus homólogos 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 se concibió teniendo en cuenta las siguientes características principales: [5]

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

El desarrollo y las mejoras continuos fueron impulsados ​​por la incorporación de CMake en los propios sistemas de los desarrolladores, incluido el Proyecto VXL , [ se necesita aclaración ] las características de CABLE [8] agregadas por Brad King, [ se necesita aclaración ] y GE Corporate R&D para respaldar a DART. [ se necesita aclaración ] Se crearon funciones adicionales cuando VTK hizo la transición a CMake para su entorno de compilación y para admitir ParaView .

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

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

Características

Árbol de construcción separado

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

Gestión de dependencia

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

Estructura de proyecto flexible

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

CMake admite jerarquías de directorios complicadas y aplicaciones que dependen de varias bibliotecas. Por ejemplo, CMake puede acomodar un proyecto que tiene múltiples kits de herramientas o bibliotecas, cada una de las cuales tiene múltiples 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 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 Unix.

Detección de características del compilador

CMake permite especificar las características que el compilador debe admitir para poder compilar el programa o biblioteca de destino. [14]

Compiladores

CMake admite una lista extensa de compiladores, que incluyen: Apple Clang, Clang , GNU GCC , MSVC , Oracle Developer Studio e Intel C++ Compiler . [15]

Sistema de embalaje

Aunque CMake no es un administrador de paquetes , proporciona funciones de módulos básicos (consulte CPack) para instalar archivos binarios e información de paquetes declarada por el CMakeList.txtscript para ser utilizada por proyectos de consumidores de CMake. El paquete también se puede empaquetar en un archivo para el administrador 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]

GUI

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

Proceso de construcción

La construcción de un programa o biblioteca con CMake es un proceso de dos etapas. [5] Primero, los archivos de compilación (generalmente scripts) se crean (generan) a partir de archivos de configuración (scripts CMakeLists.txt) escritos en lenguaje CMake. Luego, las herramientas de compilación nativas de la plataforma que pueden leer estos archivos de compilación (cadena de herramientas nativa) se invocan manualmente de forma externa o mediante cmake --buildla compilación real de programas (objetivos de compilación). [13] [19] El generador especificado por el usuario en la línea de comando determina qué cadena de herramientas de compilación usar. [5]

Generadores

Los archivos de compilación se configuran según el generador utilizado (por ejemplo, Unix Makefiles para make ) y los archivos de cadena de herramientas asociados. Los usuarios avanzados también pueden crear e incorporar generadores de archivos MAKE adicionales para satisfacer sus necesidades específicas de compilador y sistema operativo. Los archivos generados normalmente se colocan (usando cmakeel indicador ') en una carpeta fuera de la fuente (fuera de la compilación 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 las propiedades de destino. Anteriormente, se hacía mediante CMAKE_...variables globales con prefijo que también se utilizan para configurar CMake y establecer los valores predeterminados iniciales. [11] [20] Actualmente se desaconseja el enfoque anterior.

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.dlletc.), bibliotecas de archivos de objetos o pseudoobjetivos (incluidos los alias). CMake puede producir archivos objeto que se pueden vincular mediante binarios/bibliotecas ejecutables, evitando vínculos dinámicos (en tiempo de ejecución) y utilizando en su lugar vínculos estáticos (en tiempo de compilación). Esto permite flexibilidad en la configuración de varias optimizaciones. [21]

Las dependencias de compilación pueden determinarse automáticamente.

Encabezados precompilados

Es posible generar encabezados precompilados usando 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 cmakedesde un archivo llamado CMakeLists.txt. Este archivo especifica los archivos fuente 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 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 comando

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 tomar 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 ofrece CMake 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 de cadenas de datos JSON (desde la versión 3.19). [28]

Internos

El lenguaje de programación 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 son generadas por el generador de documentación Sphinx .

Módulos y herramientas

CMake se entrega con numerosos .cmakemódulos y herramientas. Estos facilitan trabajos como encontrar dependencias (tanto integradas como externas, por ejemplo, FindXYZmódulos), probar el entorno de la cadena de herramientas y los ejecutables, empaquetar versiones ( CPackmódulo y cpackcomando) y gestionar 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 Segunda vida . [36]

Ejemplos

Hola Mundo

Los siguientes archivos de código fuente demuestran cómo crear un programa simple de Hola Mundo escrito en C++ mediante CMake.

Ejemplo 1

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

Ejemplo 2

// hola.cpp #include <iostream> #incluye "hola_heading.h"  int main () { for ( int i = 0 ; i < Times ; i ++ ) { std :: cout << "¡Hola mundo!" << std :: endl ; } devolver 0 ; }                   
// hola_heading.h #ifndef HOLA_HEADING_H_ #define HOLA_HEADING_H_ const int Veces = 10 ; #terminara si    
# CMakeLists.txt cmake_minimum_required ( VERSIÓN 3.5 ) proyecto ( HelloWorld CXX ) include_directories ( ${ PROJECT_SOURCE_DIR } ) add_executable ( hola hola.cpp )   

Comandos de Shell para ejecutar CMake en un sistema Linux (que se ingresarán en el directorio que contiene los dos archivos anteriores):

cmake  -B  construir  . # Configurar el directorio de compilación. cmake --build build # Construye el programa en el directorio de compilación. ./build/hello # Ejecuta el programa (muestra "¡Hola, mundo!")     


Ver también

Notas

  1. ^ Dependencias ascendentes: fuentes dependientes que dependen de un archivo fuente modificado
  2. ^ ab Como se desprende del repositorio de código fuente de CMake.

Referencias

  1. ^ "CMake 3.28.3 disponible para descargar". 5 de febrero de 2024 . Consultado el 6 de febrero de 2024 .
  2. ^ "CMake 3.29.0-rc2 está listo para ser probado". 22 de febrero de 2024.
  3. ^ "El proyecto de código abierto CMake en OpenHub". OpenHub . Consultado el 9 de abril de 2016 .
  4. ^ "CHacer".
  5. ^ abcdefghijklm "La arquitectura de 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 semanal 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". Esencia .
  11. ^ ab Binna, Manuel (22 de julio de 2018). "CMake moderno y eficaz".
  12. ^ https://public.kitware.com/Bug/view.php?id=14012#c32631
  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 funciones 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 comprobadas 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. ^ "Exponer la configuración de un módulo (avanzado): documentación del procedimiento de compilación 1.0 de CMake". 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) . CPPAhora.
  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 utilizando software CMake". Diario de Linux . 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. ^ "Proyecto externo: documentación de CMake 3.14.7". cmake.org . Consultado el 24 de octubre de 2020 .
  32. ^ "Embalaje con CPack". Wiki de la comunidad CMake .
  33. ^ cpack(1)  –  Manual de comandos generales de Linux .
  34. ^ "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). "Creación de software a gran escala con CMake en ATLAS" (PDF) . CERN. Archivado (PDF) desde el original el 28 de julio de 2018.
  36. ^ "CMake éxito". cmake.org . Equipo. 2011 . Consultado el 12 de marzo de 2022 .

enlaces externos