¿Cómo funciona exactamente CMake?

158

No estoy pidiendo esto solo para mí. Espero que esta pregunta sea una referencia para los muchos novatos que, como yo, lo encontraron completamente desconcertante sobre qué era exactamente lo que estaba sucediendo detrás de escena cuando se trataba de un CMakeLists.txtarchivo tan pequeño .

cmake_minimum_required (VERSION 2.6)
project(Tutorial)
add_executable(Tutorial tutorial.cpp)

y tan pequeño tutorial.cpp

int main() { return 0; } 

hay tantos archivos generados

CMakeCache.txt  cmake_install.cmake  Makefile
CMakeLists.txt  tutorial.cpp

y una CMakeFilescarpeta con tantos archivos y carpetas

CMakeCCompiler.cmake               CMakeOutput.log    Makefile.cmake
cmake.check_cache                  CMakeSystem.cmake  progress.marks
CMakeCXXCompiler.cmake             CMakeTmp           TargetDirectories.txt
CMakeDetermineCompilerABI_C.bin    CompilerIdC        Tutorial.dir
CMakeDetermineCompilerABI_CXX.bin  CompilerIdCXX
CMakeDirectoryInformation.cmake    Makefile2

No entender lo que estaba sucediendo detrás de escena (es decir, por qué los archivos debían generarse y cuál era su propósito) fue el mayor obstáculo para poder aprender CMake.

Si alguien lo sabe, ¿podría explicarlo en aras de la posteridad? ¿Cuál es el propósito de estos archivos, y cuando cmake .escribo, qué es exactamente lo que cmake configura y genera antes de construir el proyecto?

Nav
fuente
1
Soy consciente de las compilaciones fuera de la fuente. En caso de que alguien no haya realizado una compilación fuera del código fuente y aún esté buscando una forma de limpiar los archivos generados, esta técnica funciona bien: stackoverflow.com/a/12055610/453673
Nav
3
Hay una descripción maravillosa en: aosabook.org/en/cmake.html y probablemente una respuesta en profundidad a la pregunta (que no se puede resumir en breve aquí).
parasire el
@SebTu Enlace roto. La página cmake.html no existe.
Nav
3
@Nav Yap, estropeó la sintaxis de marcado, lo siento. Por lo tanto, aquí está la versión corregida: para las personas nuevas en cmake, realmente recomiendo leer la arquitectura de cmake . Proporciona información suficiente para tener una idea de cómo funciona cmake sin perderse en detalles.
SebNag

Respuestas:

92

El secreto es que no tienes que entender lo que hacen los archivos generados.

CMake introduce mucha complejidad en el sistema de compilación, la mayoría de los cuales solo vale la pena si lo usa para construir proyectos de software complejos.

La buena noticia es que CMake hace un buen trabajo al mantener lejos de ti este desorden: utiliza compilaciones fuera de la fuente y ni siquiera tienes que mirar los archivos generados. Si no ha hecho esto hasta ahora (lo cual supongo que es el caso, desde que escribió cmake .), revíselos antes de continuar . Mezclar el directorio de compilación y el de origen es realmente doloroso con CMake y no es así como se supone que debe usarse el sistema.

En pocas palabras: en lugar de

cd <source_dir>
cmake .

siempre usa

cd <build_dir_different_from_source_dir>
cmake <source_dir>

en lugar. Usualmente uso una subcarpeta vacía builddentro de mi directorio fuente como directorio de compilación.

Para aliviar su dolor, permítame darle una descripción rápida de los archivos relevantes que genera CMake:

  • Archivos de proyecto / Makefiles : lo que realmente le interesa: los archivos necesarios para construir su proyecto con el generador seleccionado. Esto puede ser cualquier cosa, desde un Makefile de Unix hasta una solución de Visual Studio.
  • CMakeCache.txt : este es un almacenamiento de cadena de clave / valor persistente que se utiliza para almacenar en caché el valor entre ejecuciones. Los valores almacenados aquí pueden ser rutas a las dependencias de la biblioteca o si se debe construir un componente opcional. La lista de variables es casi idéntica a la que ve cuando ejecuta ccmakeo cmake-gui. Esto puede ser útil de vez en cuando, pero recomendaría usar las herramientas antes mencionadas para cambiar cualquiera de los valores si es posible.
  • Archivos generados : puede ser cualquier cosa, desde archivos fuente autogenerados hasta exportar macros que lo ayudan a reintegrar su proyecto construido con otros proyectos CMake. La mayoría de estos solo se generan a pedido y no aparecerán en un proyecto simple como el de su pregunta.
  • Cualquier otra cosa es bastante ruido para mantener feliz el sistema de construcción. En particular, nunca tuve que preocuparme por nada de lo que sucede dentro del CMakeFilessubdirectorio.

En general, no debe meterse con ninguno de los archivos que CMake genera para usted. Todos los problemas pueden resolverse desde adentro CMakeLists.txtde una forma u otra. Mientras el resultado construya su proyecto como se esperaba, probablemente esté bien. No se preocupe demasiado por los detalles sangrientos, ya que esto es lo que CMake estaba tratando de evitar en primer lugar.

ComicSansMS
fuente
Gracias. Era consciente de las compilaciones fuera de la fuente, pero como vería, el objetivo de hacer esta pregunta era comprender más. La parte CMakeCache.txt de su respuesta realmente ayudó. Es este tipo de explicación lo que estaba buscando. Además, la última oración de mi pregunta: " ¿qué es exactamente cmake configurando y generando antes de construir el proyecto "
Nav
1
CMakeFilesdirectorio contiene CMakeError.loge CMakeOutput.logimportante para solucionar problemas de compilaciones CMake.
Serge Rogatch
1
Dos cosas que a veces necesita verificar en el CMakeFiles/target_name.dirdirectorio son los archivos flags.makey link.txt. Tuve que verificar esto en proyectos complejos, que heredaron banderas / cosas vinculadas de proyectos ascendentes. Por ejemplo: tuve algunos errores porque TPL A tenía una dependencia de TPL B. También mi proyecto tenía una dependencia de B, que instalé localmente; pero A utilizó una versión de B de mi sistema (en lugar de mi instalación local) que tenía diferentes opciones habilitadas, y llegó primero, causando errores en mi proyecto. Solo mirando link.txt pude descubrir que esto estaba sucediendo.
bartgol
13

Como se indica en su sitio web:

Cmake es un sistema de compilación de código abierto y multiplataforma para administrar el proceso de compilación de software utilizando un método independiente del compilador

En la mayoría de los casos, se utiliza para generar archivos de proyecto / Makefilecreación ; en su ejemplo, ha producido los que se utilizan para construir su software (principalmente en la plataforma Linux / Unix).

Cmake permite proporcionar archivos de compilación multiplataforma que generarían proyectos específicos de plataforma / crear archivos para una compilación / plataforma particular.

Por ejemplo, puede intentar compilar su software en Windows con Visual Studio y luego, con la sintaxis adecuada en su CMakeLists.txtarchivo, puede iniciar

cmake .

dentro del directorio de su proyecto en la plataforma Windows, Cmake generará todos los archivos necesarios de proyecto / solución ( .slnetc.).

Si desea construir su software en la plataforma Linux / Unix, simplemente vaya al directorio de origen donde tiene su CMakeLists.txtarchivo y lo activará cmake .y generará todos los archivos necesarios para que pueda construir el software de manera simple makeo simple make all.

Aquí tiene una muy buena presentación sobre las funcionalidades clave de Cmake http://www.elpauer.org/stuff/learning_cmake.pdf

EDITAR

Si desea hacer que la biblioteca dependiente de la plataforma incluya / definiciones de variables, etc., puede usar esta sintaxis en el CMakeLists.txtarchivo

IF(WIN32)
   ...do something...
 ELSE(WIN32)
   ...do something else...
 ENDIF(WIN32)

También hay muchos comandos con los que puede evitar que la compilación falle y, en su lugar, Cmake le notificará que, por ejemplo, no tiene bibliotecas de impulso filesysteme regexinstaladas en su sistema. Para hacerlo, puede usar la siguiente sintaxis:

find_package(Boost 1.45.0 COMPONENTS filesystem regex)

Después de comprobar que generará los archivos MAKE para el sistema / IDE / compilador apropiado.

Patryk
fuente
1
Gracias Patryk Respuesta útil, pero el pdf al que se vinculó explica principalmente la segunda etapa de aprendizaje de CMake, que es básicamente la implementación de CMake. ¡Estoy preguntando por la explicación de la primera etapa, donde una persona tiene que entender lo que está pasando en CMake!
Nav
@Nav He ampliado un poco mi respuesta. Todavía puede buscar en la web para obtener más información.
Patryk
Esto está bastante lejos de responder la pregunta que se hace.
SenhorLucas
1

Exactamente cómo funciona CMake es una pregunta para los desarrolladores, por lo que esta pregunta no se puede responder aquí.

Sin embargo, podemos darle un toque de orientación útil en cuanto a cuándo debe usar CMake y cuándo, por lo tanto, debe preocuparse por cómo funciona. Tampoco soy fanático de las respuestas "oh, simplemente funciona", porque, especialmente en el software, NADA "simplemente funciona" y SIEMPRE tienes que entrar en detalles esenciales en algún momento.

CMake es una herramienta de resistencia industrial. Automatiza varios procesos MUY complejos y tiene en cuenta muchas variables de las que puede no ser consciente, especialmente como un desarrollador bastante nuevo, probablemente trabajando con un conocimiento limitado de todos los sistemas operativos y herramientas de compilación que CMake puede manejar. La razón por la que se generan tantos archivos y por qué las cosas parecen tan complejas es porque todos esos otros sistemas son complejos y deben tenerse en cuenta y automatizarse. Además, existen los problemas de "almacenamiento en caché" y otras características que ahorran tiempo de la herramienta. Comprender todo en CMake significaría comprender todo en estas herramientas de compilación y sistemas operativos y todas las combinaciones posibles de estas variables, lo cual, como puede imaginar, es imposible.

Es importante tener en cuenta que si no está a cargo de administrar un gran sistema de construcción multiplataforma, y ​​su código base es de unos pocos KLOC, tal vez hasta 100KLOG, usar CMake parece un poco como usar una eliminación de árboles forestales de 100,000 dólares máquina para eliminar las malas hierbas de su jardín de flores de 2 pies por 2 pies. (Por cierto, si nunca has visto una máquina así, deberías buscar una en YouTube, son increíbles)

Si su sistema de compilación es pequeño y simple, es probable que sea mejor escribir sus propios archivos MAKE a mano o escribirlos usted mismo. Cuando sus archivos MAKE se vuelven difíciles de manejar o necesita construir una versión de su sistema en otra plataforma, puede cambiar a CMake. En ese momento, tendrá muchos problemas que resolver y puede hacer preguntas más específicas al respecto. Mientras tanto, mira algunos de los grandes libros que se han escrito sobre CMake, o incluso mejor, ¡escribe uno tú mismo! 8)

Señor jeps
fuente