Introducci´ on Ejecutando CMake Ejemplos Final CMake: Sistema de Compilaci´ on para C/C++ Daniel Molina Universidad of C´ adiz, Departamento de Lenguaje y Sistemas Inform´ aticos, OSLUCA 29 de Junio 2009, C´ adiz
Introduccion Ejecutando CMake Ejemplos Final
CMake: Sistema de Compilacion para C/C++
Daniel Molina
Universidad of Cadiz, Departamento de Lenguaje y Sistemas Informaticos,OSLUCA
29 de Junio 2009, Cadiz
Introduccion Ejecutando CMake Ejemplos Final
Presentacion
1 Introduccion
2 Ejecutando CMake
3 Ejemplos
Introduccion Ejecutando CMake Ejemplos Final
Que es CMake
CMake:
Genera ficheros de compilacion.
Unix/Linux → Makefiles.Windows → Proyectos Visual Studio.Apple → Xcode.
Multiplataforma.Software Libre :-).
Pero si mi aplicacion no es multiplataforma
Mas sencillo que Makefiles a mano.
¿Para eso no estan las autotools?
Introduccion Ejecutando CMake Ejemplos Final
Que es CMake
CMake:
Genera ficheros de compilacion.
Unix/Linux → Makefiles.Windows → Proyectos Visual Studio.Apple → Xcode.
Multiplataforma.Software Libre :-).
Pero si mi aplicacion no es multiplataforma
Mas sencillo que Makefiles a mano.
¿Para eso no estan las autotools?
Introduccion Ejecutando CMake Ejemplos Final
Que es CMake
CMake:
Genera ficheros de compilacion.
Unix/Linux → Makefiles.Windows → Proyectos Visual Studio.Apple → Xcode.
Multiplataforma.
Software Libre :-).
Pero si mi aplicacion no es multiplataforma
Mas sencillo que Makefiles a mano.
¿Para eso no estan las autotools?
Introduccion Ejecutando CMake Ejemplos Final
Que es CMake
CMake:
Genera ficheros de compilacion.
Unix/Linux → Makefiles.Windows → Proyectos Visual Studio.Apple → Xcode.
Multiplataforma.Software Libre :-).
Pero si mi aplicacion no es multiplataforma
Mas sencillo que Makefiles a mano.
¿Para eso no estan las autotools?
Introduccion Ejecutando CMake Ejemplos Final
Que es CMake
CMake:
Genera ficheros de compilacion.
Unix/Linux → Makefiles.Windows → Proyectos Visual Studio.Apple → Xcode.
Multiplataforma.Software Libre :-).
Pero si mi aplicacion no es multiplataforma
Mas sencillo que Makefiles a mano.
¿Para eso no estan las autotools?
Introduccion Ejecutando CMake Ejemplos Final
Que es CMake
CMake:
Genera ficheros de compilacion.
Unix/Linux → Makefiles.Windows → Proyectos Visual Studio.Apple → Xcode.
Multiplataforma.Software Libre :-).
Pero si mi aplicacion no es multiplataforma
Mas sencillo que Makefiles a mano.
¿Para eso no estan las autotools?
Introduccion Ejecutando CMake Ejemplos Final
Que es CMake
CMake:
Genera ficheros de compilacion.
Unix/Linux → Makefiles.Windows → Proyectos Visual Studio.Apple → Xcode.
Multiplataforma.Software Libre :-).
Pero si mi aplicacion no es multiplataforma
Mas sencillo que Makefiles a mano.
¿Para eso no estan las autotools?
Introduccion Ejecutando CMake Ejemplos Final
Ventajas frente a Makefile y Autotools
CMake Versus Makefile
Mas comodo y facil.
¿He dicho que es mas facil?
Portable.
Mas opciones(busqueda de librerıas, . . .).
CMake Versus Autotools
Menor curva de aprendizaje.
No usa M4 :-).
Mas portable.
Mas facil de extender.
Mejor documentado.
Introduccion Ejecutando CMake Ejemplos Final
Ventajas frente a Makefile y Autotools
CMake Versus Makefile
Mas comodo y facil.
¿He dicho que es mas facil?
Portable.
Mas opciones(busqueda de librerıas, . . .).
CMake Versus Autotools
Menor curva de aprendizaje.
No usa M4 :-).
Mas portable.
Mas facil de extender.
Mejor documentado.
Introduccion Ejecutando CMake Ejemplos Final
Ventajas frente a Makefile y Autotools
CMake Versus Makefile
Mas comodo y facil.
¿He dicho que es mas facil?
Portable.
Mas opciones(busqueda de librerıas, . . .).
CMake Versus Autotools
Menor curva de aprendizaje.
No usa M4 :-).
Mas portable.
Mas facil de extender.
Mejor documentado.
Introduccion Ejecutando CMake Ejemplos Final
Ventajas frente a Makefile y Autotools
CMake Versus Makefile
Mas comodo y facil.
¿He dicho que es mas facil?
Portable.
Mas opciones(busqueda de librerıas, . . .).
CMake Versus Autotools
Menor curva de aprendizaje.
No usa M4 :-).
Mas portable.
Mas facil de extender.
Mejor documentado.
Introduccion Ejecutando CMake Ejemplos Final
Ventajas frente a Makefile y Autotools
CMake Versus Makefile
Mas comodo y facil.
¿He dicho que es mas facil?
Portable.
Mas opciones(busqueda de librerıas, . . .).
CMake Versus Autotools
Menor curva de aprendizaje.
No usa M4 :-).
Mas portable.
Mas facil de extender.
Mejor documentado.
Introduccion Ejecutando CMake Ejemplos Final
Caracterısticas de CMake
Utilizado en entornos complejos (VTK+, KDE4, . . . ).
Flexible y Extensible.
Soporte de macros (buscar/configurar software).
Ejecutar programar externos.
Syntaxis Intuitiva.
Modos de compilacion (Debug, Release, . . . ).
Admite jerarquıa de directorios complejas, y detecta librerıas.
Introduccion Ejecutando CMake Ejemplos Final
Quien lo esta usando
Kitware, http://www.kitware.com/
The Visualization ToolKit (VTK), http://www.vtk.org/
ParaView, http://www.paraview.org/
KDE 4, https://lwn.net/Articles/188693/
Introduccion Ejecutando CMake Ejemplos Final
Estructura
CMakefiles.txt: Formato del fichero, define el flujo de controlen sintaxis CMake.
Modulos CMake: Modulos que extienden la funcionalidad deCMake, principalmente en buscar aplicaciones/herramientas.
Ejemplo: FindQt4.cmake, FindJava.cmake
Introduccion Ejecutando CMake Ejemplos Final
Ejecutando CMake
Preparar el fichero CMakeLists.txt:
Con editor favorito.Visualmente: cmake-gui.
Ejecutar cmake . → Makefile
Compilar (make)
Introduccion Ejecutando CMake Ejemplos Final
Ejemplo: “Hello, World”
Estructura
hello src
hello.cCMakeLists.txt
Makefile
CMakeFiles
CMakeCache.txt
cmake install.cmake
hello
CMakeLists.txt
PROJECT(hello C)SET(SRC
hello.c)
ADD EXECUTABLE(hello ${SRC})
Introduccion Ejecutando CMake Ejemplos Final
Ejemplo: “Hello, World”
Estructura
hello src
hello.cCMakeLists.txt
Makefile
CMakeFiles
CMakeCache.txt
cmake install.cmake
hello
CMakeLists.txt
PROJECT(hello C)SET(SRC
hello.c)
ADD EXECUTABLE(hello ${SRC})
Introduccion Ejecutando CMake Ejemplos Final
Ejemplo: “Hello, World”
Estructura
hello src
hello.cCMakeLists.txt
Makefile
CMakeFiles
CMakeCache.txt
cmake install.cmake
hello
CMakeLists.txt
PROJECT(hello C)SET(SRC
hello.c)
ADD EXECUTABLE(hello ${SRC})
Introduccion Ejecutando CMake Ejemplos Final
Ejemplo: “Hello, World”
Estructura
hello src
hello.cCMakeLists.txt
Makefile
→ Fichero autogenerado
CMakeFiles
→ Directorio con ficheros objeto (.o)
CMakeCache.txt
→ Fichero cache (evitar recompilarinnecesariamente)
cmake install.cmake
→ Fichero de instalacion/desistalacion(cuando se usa)
hello → Ejecutable
Introduccion Ejecutando CMake Ejemplos Final
Ejemplo: “Hello, World”
Estructura
hello src
hello.cCMakeLists.txt
Makefile → Fichero autogenerado
CMakeFiles
→ Directorio con ficheros objeto (.o)
CMakeCache.txt
→ Fichero cache (evitar recompilarinnecesariamente)
cmake install.cmake
→ Fichero de instalacion/desistalacion(cuando se usa)
hello → Ejecutable
Introduccion Ejecutando CMake Ejemplos Final
Ejemplo: “Hello, World”
Estructura
hello src
hello.cCMakeLists.txt
Makefile → Fichero autogenerado
CMakeFiles → Directorio con ficheros objeto (.o)
CMakeCache.txt
→ Fichero cache (evitar recompilarinnecesariamente)
cmake install.cmake
→ Fichero de instalacion/desistalacion(cuando se usa)
hello → Ejecutable
Introduccion Ejecutando CMake Ejemplos Final
Ejemplo: “Hello, World”
Estructura
hello src
hello.cCMakeLists.txt
Makefile → Fichero autogenerado
CMakeFiles → Directorio con ficheros objeto (.o)
CMakeCache.txt → Fichero cache (evitar recompilarinnecesariamente)
cmake install.cmake
→ Fichero de instalacion/desistalacion(cuando se usa)
hello → Ejecutable
Introduccion Ejecutando CMake Ejemplos Final
Ejemplo: “Hello, World”
Estructura
hello src
hello.cCMakeLists.txt
Makefile → Fichero autogenerado
CMakeFiles → Directorio con ficheros objeto (.o)
CMakeCache.txt → Fichero cache (evitar recompilarinnecesariamente)
cmake install.cmake → Fichero de instalacion/desistalacion(cuando se usa)
hello → Ejecutable
Introduccion Ejecutando CMake Ejemplos Final
Ejemplo: “Hello, World”
Otra alternativa:
mkdir buildcd buildcmake ..
Ası, todos los ficheros adicionales estan en bin
Tambien se puede hacer configurando adecuadamenteCMakeLists.txt
Introduccion Ejecutando CMake Ejemplos Final
Otras versiones
hellolib.c
#i n c l u d e <s t d i o . h>#i n c l u d e <s t r i n g . h>
v o i d get msg ( c h a r ∗msg ) {s t r c p y ( msg , ” h e l l o , w o r l d\n ” ) ;
}
hellolib.h
#i f n d e f HELLO LIB H
#d e f i n e HELLO LIB H 1
v o i d get msg ( c h a r ∗msg ) ;
#e n d i f
hello.c
/∗ h e l l o . c : d i s p l a y a messageon t h e s c r e e n ∗/
#i n c l u d e <s t d i o . h>#i n c l u d e ” h e l l o l i b . h”
i n t main ( v o i d ) {c h a r msg [ 3 0 ] ;
get msg ( msg ) ;p r i n t f ( msg ) ;r e t u r n 0 ;
}
Introduccion Ejecutando CMake Ejemplos Final
Usando Librerıa Dinamica Versus Sin Usar
Sin ibrerıa
PROJECT( h e l l o C)SET(SRC
h e l l oh e l l o l i b )
ADD EXECUTABLE( h e l l o ${SRC})
Con Librerıa Dinamica
PROJECT( h e l l o C)SET( LIBSRC
h e l l o l i b )
SET(SRCh e l l o )
ADD LIBRARY( h e l l o l i b SHARED ${LIBSRC})
ADD EXECUTABLE( h e l l o ${SRC})
TARGET LINK LIBRARIES ( h e l l o h e l l o l i b )
Introduccion Ejecutando CMake Ejemplos Final
Espero que esta introduccionmotive para el taller
¿Empezamos? :-)