descarga - ¿Cómo funciona exactamente CMake?
cmake tutorial (2)
No estoy preguntando esto solo. Espero que esta pregunta sea una referencia para los muchos novatos que me quieran, me pareció completamente desconcertante sobre qué es exactamente lo que estaba sucediendo detrás de las escenas cuando para un archivo CMakeLists.txt
tan pequeño CMakeLists.txt
cmake_minimum_required (VERSION 2.6)
project(Tutorial)
add_executable(Tutorial tutorial.cpp)
y un pequeño tutorial.cpp
int main() { return 0; }
hay tantos archivos generados
CMakeCache.txt cmake_install.cmake Makefile
CMakeLists.txt tutorial.cpp
y una carpeta CMakeFiles
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 sucedía detrás de la escena (es decir, por qué era necesario generar los archivos y cuál era su propósito), era el mayor obstáculo para poder aprender CMake.
Si alguien sabe, ¿podría explicarlo por la posteridad? ¿Cuál es el propósito de estos archivos y cuándo cmake .
¿Qué es exactamente la configuración y generación de cmake antes de construir el proyecto?
Como se indica en su sitio web:
Cmake es un sistema de compilación de código abierto multiplataforma para gestionar el proceso de compilación del software utilizando un método independiente del compilador
En la mayoría de los casos, se utiliza para generar archivos de proyecto / creación: en su ejemplo, ha creado Makefile
que se utiliza para construir su software (principalmente en la plataforma Linux / Unix).
Cmake permite proporcionar archivos de compilación multiplataforma que generarían archivos de proyecto / creación específicos de plataforma para un compilador / plataforma particular.
Por ejemplo, puede intentar compilar su software en Windows con Visual Studio y luego con la sintaxis adecuada en su archivo CMakeLists.txt
puede iniciar
cmake .
dentro del directorio de su proyecto en la plataforma Windows y Cmake generará todos los archivos de proyecto / solución necesarios ( .sln
etc.).
Si desea construir su software en la plataforma Linux / Unix, simplemente vaya al directorio de origen donde tiene su archivo CMakeLists.txt
y active el mismo cmake .
y generará todos los archivos necesarios para crear software a través de sipmle make
o make all
.
Aquí tiene una muy buena presentación sobre las funciones clave de Cmake http://www.elpauer.org/stuff/learning_cmake.pdf
EDITAR
Si desea que la biblioteca dependiente de la plataforma incluya / definiciones de variables, etc., puede usar esta sintaxis en el archivo CMakeLists.txt
IF(WIN32)
...do something...
ELSE(WIN32)
...do something else...
ENDIF(WIN32)
También hay una gran cantidad de comandos con los que puede evitar que la compilación falle y Cmake le notificará que, por ejemplo, no tiene instalado el sistema de filesystem
bibliotecas boost y regex
en su sistema. Para hacer eso puedes usar la siguiente sintaxis:
find_package(Boost 1.45.0 COMPONENTS filesystem regex)
Después de verificar que generará los archivos make para el sistema / IDE / compilador apropiado.
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 rinde frutos si lo usa para crear proyectos de software complejos.
La buena noticia es que CMake hace un buen trabajo para mantener lejos de ti este gran desorden: utiliza versiones fuera de la fuente y ni siquiera tienes que mirar los archivos generados. Si no hizo esto hasta el momento (que supongo que es el caso, ya que escribió cmake .
), cmake .
antes de continuar . Mezclar la compilación y el directorio de origen es realmente doloroso con CMake y no es cómo se supone que se debe usar 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 build
subcarpetas vacía dentro de mi directorio de origen como directorio de compilación.
Para aliviar su dolor, permítame dar una visión general rápida de los archivos relevantes que CMake genera:
- Archivos de proyecto / Makefiles : lo que realmente le interesa: los archivos necesarios para construir su proyecto en el generador seleccionado. Esto puede ser cualquier cosa desde un Makefile de Unix a 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 dependencias de biblioteca o si se debe construir un componente opcional. La lista de variables es en su mayoría idéntica a la que se ve al ejecutar
ccmake
ocmake-gui
. Esto puede ser útil para observar de vez en cuando, pero recomendaría usar las herramientas mencionadas anteriormente para cambiar cualquiera de los valores si es posible. - Archivos generados : puede ser cualquier cosa, desde archivos fuente autogenerados hasta macros de exportación que lo ayuden a reintegrar su proyecto construido con otros proyectos de 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 el sistema de compilación feliz. En particular, nunca tuve que preocuparme por nada que esté sucediendo dentro del subdirectorio
CMakeFiles
.
En general, no debe meterse con ninguno de los archivos que CMake genera para usted. Todos los problemas se pueden resolver desde 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 evitarle en primer lugar.