Introduccion a cmake

CMake es una excelente herramienta para generar Makefiles, y no solo eso tambien genera soluciones de Kdevelop, Code::Blocks, Visual Studio entre muchas otras. Así que me puse a investigar y resulta que CMake es trivial de usar, hasta yo lo pude usar!!!

1. Hello World: El código fuente

Usaremos este código que muestra CMake para compilar y enlazar un programa principal con una librería extra generada por nosotros mismos. La siguiente estructura de directorios es la que hay que crear:

[vampird@Sharwyn]:~/devel/C/holaMundoCMake$ tree
.
|-- CMakeLists.txt
|-- build
`-- src
    |-- main.cpp
    `-- milib
        |-- CMakeLists.txt
        |-- milib.cpp
        `-- milib.h

3 directories, 5 files
[vampird@Sharwyn]:~/devel/C/holaMundoCMake$

La idea aqui es que vamos a generar un pequeño programita a partir del codigo en main.cpp y de la libreria milib.cpp, el código de main.cpp es muy sencillo:

main.cpp:

#include "milib.h"

int main (int argc, char** argv) {
   printf("Hola mundo desde main\n");
   hola(2);

   return 0;
} // main

Y lo que hace es cargar el header milib.h que es donde está definida la función hola().

milib.h:

#include <stdio.h>

//Prototipo de funcion
void hola (int);

milib.cpp:

#include "milib.h"

// Implementacion de la funcion
void hola (int veces) {
   int i = 0;
   while (i < veces) {
      printf("[%u] Hola Mundo, desde 'milib'\n" , i);
      i++;
   } // while
} // hola

El código es realmente trivial (si no lo comprendes mejor ni sigas leyendo). Hasta este punto no hemos usado nada de CMake ni hemos creado Makefiles ni nada. El código bien podríamos compilarlo a mano.

2. Hello World: Los archivos CMakeLists.txt para CMake

Hay un archivo de CMake en holaMundoCMake/CMakeLists.txt y hay otro en holaMundoCMake/src/milib/CMakeLists.txt, éstos son los archivos clave para CMake. Con los comentarios se explican solos.

holaMundoCMake/CMakeLists.txt:

cmake_minimum_required(VERSION 2.8)
# El nombre del proyecto "HELLO".
# CMake genera automaticamente una variable llamada
# HELLO_SOURCE_DIR que puede llamarse usando
# ${HELLO_SOURCE_DIR} con la ruta del codigo
# lo mismo con ${HELLO_BINARY_DIR} para binarios
project (HELLO)
# Le decimos donde poner los binarios de librerias y ejecutables
# CMake admite instrucciones partidas en varias lineas
set (LIBRARY_OUTPUT_PATH ${HELLO_BINARY_DIR}/build/lib
     CACHE PATH "Directory for Libraries")
set (EXECUTABLE_OUTPUT_PATH ${HELLO_BINARY_DIR}/build/bin
     CACHE PATH "Directory for Executables")
# Decimos a CMake que haga recursion a los siguientes directorios
# en orden de aparicion
add_subdirectory (src/milib)
# Directorios que debe incluir, ademas de los estandar.
include_directories (${HELLO_SOURCE_DIR}/src/milib/)
# Directorios para el enlazador, ademas de los estandar
# Para este ejemplo no los necesitamos ya que la unica libreria
# adicional es 'milib' y ya sabe donde encontrarla pues el mismo
# la genera
#link_directories (aqui pones mas rutas separadas por espacios)
# Decirle que queremos un ejecutable llamado holaMundo
# y le decimos el source para que lo compile
add_executable (holaMundo src/main.cpp)
# Tenemos una libreria adicional llamada milib, enlazarla
target_link_libraries (holaMundo milib)

El segundo CMakeLists sirve para compilar la libreria milib y es mucho mas corto:

holaMundoCMake/src/milib/CMakeLists.txt

# Agregar una libreria llamada milib generada poru un cpp
# se pueden agregar muchas librerias con varios add_library
# Se deben listar todos los archivos fuente
add_library (milib milib.cpp milib.h)

3. Hello World: Generar Makefiles con CMake y compilar.

En GNU/Linux el modo por default es generar Makefiles, así que entramos al directorio build que actualmente está vacío y generamos los Makefiles:

[vampird@Sharwyn]:~/devel/C/holaMundoCMake/build$ cmake ../CMakeLists.txt 
-- The C compiler identification is GNU
-- The CXX compiler identification is GNU
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/vampird/devel/C/holaMundoCMake
[vampird@Sharwyn]:~/devel/C/holaMundoCMake/build$

Listo, ya estan los Makefiles generados, ahora a compilar con make:

[vampird@Sharwyn]:~/devel/C/holaMundoCMake$ make
[ 50%] Building CXX object src/milib/CMakeFiles/milib.dir/milib.cpp.o
Linking CXX static library ../../build/lib/libmilib.a                                                                        
[ 50%] Built target milib                                                                                                    
[100%] Building CXX object CMakeFiles/holaMundo.dir/src/main.cpp.o
Linking CXX executable build/bin/holaMundo                                                                                   
[100%] Built target holaMundo                                                                                                
[vampird@Sharwyn]:~/devel/C/holaMundoCMake$

En el directorio build/bin se encuentra el binario holaMundo,

[vampird@Sharwyn]:~/devel/C/holaMundoCMake$ cd build/bin/
[vampird@Sharwyn]:~/devel/C/holaMundoCMake/build/bin$ ls
holaMundo
[vampird@Sharwyn]:~/devel/C/holaMundoCMake/build/bin$ ./holaMundo 
Hola mundo desde main
[0] Hola Mundo, desde 'milib'
[1] Hola Mundo, desde 'milib'
[vampird@Sharwyn]:~/devel/C/holaMundoCMake/build/bin$

¡Listo! ¿Quién dijo que habría que generar Makefiles a mano? Generar CMakeLists.txt es mucho mas fácil y mas intuitivo.

Anuncios

Una respuesta to “Introduccion a cmake”

  1. Chrono Strife Says:

    Yo soy el que dijo que hay que generar Makefiles a mano 😀

    Igual voy a probar este método a ver que tal.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s


A %d blogueros les gusta esto: