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.txt
archivo 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 CMakeFiles
carpeta 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?
Respuestas:
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
siempre usa
en lugar. Usualmente uso una subcarpeta vacía
build
dentro 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:
ccmake
ocmake-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.CMakeFiles
subdirectorio.En general, no debe meterse con ninguno de los archivos que CMake genera para usted. Todos los problemas pueden resolverse desde adentro
CMakeLists.txt
de 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.fuente
CMakeFiles
directorio contieneCMakeError.log
eCMakeOutput.log
importante para solucionar problemas de compilaciones CMake.CMakeFiles/target_name.dir
directorio son los archivosflags.make
ylink.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.Como se indica en su sitio web:
En la mayoría de los casos, se utiliza para generar archivos de proyecto /
Makefile
creació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.txt
archivo, puede iniciardentro del directorio de su proyecto en la plataforma Windows, Cmake generará todos los archivos necesarios de proyecto / solución (
.sln
etc.).Si desea construir su software en la plataforma Linux / Unix, simplemente vaya al directorio de origen donde tiene su
CMakeLists.txt
archivo y lo activarácmake .
y generará todos los archivos necesarios para que pueda construir el software de manera simplemake
o simplemake 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.txt
archivoTambié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
filesystem
eregex
instaladas en su sistema. Para hacerlo, puede usar la siguiente sintaxis:Después de comprobar que generará los archivos MAKE para el sistema / IDE / compilador apropiado.
fuente
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)
fuente