Documentos de Académico
Documentos de Profesional
Documentos de Cultura
es/2009/12/tutorial-cmake/
La plaga Tux
Los tuxes con ansias de aprender acechan. Software libre, programacin,
LaTeX y puede que algo ms
Inicio
Autor
Tutoriales Plagatux
Tutorial CMake
Lunes, 7 de diciembre de 2009 piponazo Dejar un comentario Ir a
comentarios
Hasta ahora he estado usando las autotools (autoconf, automake, libtool, etc.)
para llevar a cabo la conguracin de todos mis proyectos, y la verdad que
me ha ido muy bien con estas herramientas una vez consegu desentrelazar
alguna que otra cosilla que me llev ms de un quebradero de cabeza. Pero
ya sabis, uno no se cansa de aprender cosas y ampliar conocimientos, y
desde hace tiempo vengo observando que cmake recibe muy buenas crticas,
sobre todo debido a la posibilidad que nos ofrece para poder congurar
nuestros proyectos software para distintas plataformas (GNU/Linux,
Windows, Mac OS/X, etc) y distintos compiladores (GnuC, Visual C++,
Borland, MinGW, etc). En esta entrada os hablar sobre cmake, explicar
algunas de sus principales caractersticas y os dejar algunos ejemplos tiles.
1 de 27 13/03/16 09:14
CMake Tutorial | La plaga Tux http://plagatux.es/2009/12/tutorial-cmake/
Qu es CMake?
CMake es un sistema extensible y abierto que controla el proceso de
construccin de manera independiente en diferentes sistemas operativos y
compiladores. CMake est diseado para ser usado en conjunto con el
sistema de construccin nativo de un entorno. Se utilizan cheros simples de
conguracin en cada directorio fuente (llamados CMakeLists.txt) para
generar cheros de estndar de construccin (Makeles en Unix y proyectos
en Windows MSVC) que se usan de la manera usual. CMake puede compilar
cdigo fuente, crear libreras, generar wrappers y construit ejecutables en
combinaciones arbitrarias. CMake soporta construcciones in-place y out-of-
place, y por lo tanto se puede realizar mltiples construcciones a partir de un
nico rbol fuente. CMake tambin soporta la construccin de libreras
estticas y dinmicas. Otra buena caracterstica de CMake es que genera un
chero cache que es diseado para ser usado con un editor grco. Por
ejemplo, cuando ejecutamos CMake, este localiza los cheros de inclusin,
libreras, ejecutables y puede encontrar otras directivas de construccin
opcionales. Dicha informacin es reunida en la cache, que puede ser
cambiada por el usuario antes de que se generen los cheros de construccin
nativos.
Despus de haber estado unos cuantos das trabajando con CMake puedo
decir que es bastante ms rpido de aprender que las autotools, aunque est
armacin puede estar inuenciada por mi desconocimiento en algunos
estndares en la programacin de proyectos que he ido adquiriendo con el
tiempo. Tambin son necesarias, en general, menos lneas de cdigo para un
mismo proyecto con autotools.
2 de 27 13/03/16 09:14
CMake Tutorial | La plaga Tux http://plagatux.es/2009/12/tutorial-cmake/
Directorio raz
Dentro de nuestro directorio de trabajo raz vamos a crear la carpeta src
donde almacenaremos los cheros fuente que formarn una librera a la que
llamaremos Hello, y otra carpeta test donde crearemos un programa que
har uso de la librera creada. Por otro lado, necesitaremos un directorio de
nombre aleatorio (en este caso build) donde se crearn los archivos
necesarios para generar el proyecto, independientemente del sistema
operativo y compilador que usemos. Por ltimo, y ms importante, crearemos
el archivo CMakeLists.txt el cul describir como se organiza el proyecto en
el que estamos trabajando. El contenido de dicho chero ser el siguiente:
1 PROJECT(HELLO) ?
2 CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
3
4 ADD_SUBDIRECTORY(src)
5 ADD_SUBDIRECTORY(test)
3 de 27 13/03/16 09:14
CMake Tutorial | La plaga Tux http://plagatux.es/2009/12/tutorial-cmake/
Directorio src
En el directorio src vamos a incluir el cdigo fuente de una librera que
solamente va a consistir en una clase Hello compuesta por los cheros
hello.h y hello.cpp. El cdigo de los cheros es el siguiente:
01 // hello.h ?
02 #ifndef HELLO_INC
03 #define HELLO_INC
04
05 class Hello
06 {
07 public:
08 void Print();
09 }; // ----- end of class Hello -----
10
11 #endif // ----- #ifndef HELLO_INC -----
1 #include "hello.h" ?
2 #include <iostream>
3
4 using namespace std;
5
6 void Hello:: Print()
7 {
8 cout << "Hello, World!" << endl;
9 }
Por ltimo, el contenido del chero CMakeLists.txt que est dentro del
directorio src sera simplemente:
1 #Aade una librera llamada Hello (libHello.a bajo linux) a ?partir del
2 ADD_LIBRARY(Hello hello)
Este comando por defecto nos crear una librera llamada Hello con el
chero que le hemos especicado. Aqu tambin se puede especicar si
queremos que la librera sea dinmica o esttica, pero ya hablar sobre eso
ms adelante.
4 de 27 13/03/16 09:14
CMake Tutorial | La plaga Tux http://plagatux.es/2009/12/tutorial-cmake/
Directorio test
En el directorio test vamos a incluir el tpico programa Hola Mundo
haciendo uso de la librera Hello que hemos creado en el directorio src. El
cdigo fuente de dicho programa es el siguiente:
1 // test.cpp ?
2 #include <iostream>
3 #include "hello.h"
4
5 int main()
6 {
7 Hello().Print();
8 return 0;
9 }
Y el contenido del chero CMakeLists.txt que est dentro del directorio test
es:
Construyendo el proyecto
Ya tenemos todo el cdigo de nuestro proyecto y los cheros CMakeLists.txt
necesarios para poder construirlos mediante cmake. Normalmente para
construir un proyecto crearemos una nueva carpeta (en nuestro caso la
hemos llamado build) para generar una compilacin del proyecto especca
para un determinado S.O. (Windows, Linux, Mac), un determinado compilador
(gcc, MSVC, icc, mingw, etc), o una determinada conguracin (Debug,
Release, etc). Esta caracterstica es verdaderamente til para no tener que
re-generar proyectos enteros segn la conguracin deseada cuando
hagamos pequeos cambios en el cdigo. Yo lo que suelo hacer es crearme
dos directorios: build-debug y build-release. El primero lo uso durante la
fase ms intensa de desarrollo, para corregir todos los posibles warning que
me lance el compilador y activar el soporte de depuracin para los
depuradores. El segundo lo uso una vez que estoy seguro (o tengo una gran
certeza) de que el cdigo no contiene ningn error, y quiero compilar la
librera con todas las optimizaciones posibles y sin soporte de depuracin.
5 de 27 13/03/16 09:14
CMake Tutorial | La plaga Tux http://plagatux.es/2009/12/tutorial-cmake/
1 cmake .. ?
Una vez hecho esto, se habrn generado una serie de directorios y archivos
para que realizar la compilacin e instalacin del proyecto sea tan sencillo
como ejecutar los siguientes comandos:
1 make ?
Opciones avanzadas
El ejemplo Hola-Mundo que os acabo de mostrar, es solo la punta del Iceberg
de posibilidades que nos presenta CMake. Podemos tener cheros de
conguracin tan sencillos como los que acabo de mostrar o otros ms
complejos donde tendremos en cuenta la portabilidad de nuestro cdigo a
diferentes sistemas operativos, compiladores, uso de programas externos,
etc. A continuacin os hablar de algunas cosas ms, sobre el uso bsico de
6 de 27 13/03/16 09:14
CMake Tutorial | La plaga Tux http://plagatux.es/2009/12/tutorial-cmake/
Cmake, adems de otros problemas con los que me he ido encontrando y a los
que he ido dando solucin.
1 cmake .. ?
1 cmake -D CMAKE_BUILD_TYPE=Debug .. ?
Variables
El uso de variables es fundamental en cmake y una buena comprensin en la
manipulacin de estas nos facilitar la elaboracin de otras arduas tareas.
Quizs las caractersticas ms destacables del manejo de variables con cmake
sean las siguientes:
7 de 27 13/03/16 09:14
CMake Tutorial | La plaga Tux http://plagatux.es/2009/12/tutorial-cmake/
Normalmente en todos los proyectos con los que trabajo siempre incluyo ags
de compilacin segn el modo de trabajo en el que me encuentre (Release y
Debug). Para ello podemos modicar las siguientes variables:
Para congurar el proyecto de una forma u otra solo tenemos que modicar
la variable CMAKE_BUILD_TYPE mediante el comando SET. Una forma de
establecer el modo de construccin del proyecto por defecto a Release
podra ser:
1 IF(NOT CMAKE_BUILD_TYPE ) ?
8 de 27 13/03/16 09:14
CMake Tutorial | La plaga Tux http://plagatux.es/2009/12/tutorial-cmake/
Para hacer uso de esta interfaz vamos a tener que incluir el mdulo
FindPkgCong.cmake en nuestro proyecto y despus utilizarlo mediante el
comando PKG_CHECK_MODULES. Podis encontrar una amplia
documentacin sobre dicho comando en el propio chero del mdulo, el cual
si usis Ubuntu se encuentra en: /usr/share/cmake-2.6/Modules
/FindPkgCong.cmake. A continuacin un sencillo ejemplo de como
comprobar si en nuestro sistema est instalada la librera matio.
2 PKG_CHECK_MODULES(MATIO matio>=1.3.3)
9 de 27 13/03/16 09:14
CMake Tutorial | La plaga Tux http://plagatux.es/2009/12/tutorial-cmake/
1 IF (MATIO_FOUND) ?
001 # -helper macro to add a "doc" target with CMake build system.
?
10 de 27 13/03/16 09:14
CMake Tutorial | La plaga Tux http://plagatux.es/2009/12/tutorial-cmake/
030
031 IF (USE_CHM AND WIN32)
032 SET(WIN_CHM "YES" )
033 SET(CHM_FILE "${PROJECT_SOURCE_DIR}/doc/help.chm" )
034 SET (BINARY_TOC "YES" )
035 SET (TOC_EXPAND "YES" )
036 ELSE()
037 SET(WIN_CHM "NO" )
038 SET (BINARY_TOC "NO" )
039 SET (TOC_EXPAND "NO" )
040 ENDIF()
041
042 IF (USE_LATEX)
043 SET(GENERATE_PDF "YES" )
044 SET(GENERATE_LATEX "YES" )
045 SET(LATEXOUT "latex" )
046 ELSE()
047 SET(GENERATE_PDF "NO" )
048 SET(GENERATE_LATEX "NO" )
049 ENDIF()
050
051 IF (NOT USE_DOT)
052 SET(DOXYGEN_DOT_FOUND "NO" )
053 ENDIF()
054
055 #click+jump in Emacs and Visual Studio (for doxy.config) (jw)
056 IF (CMAKE_BUILD_TOOL MATCHES "(msdev|devenv)" )
057 SET(DOXY_WARN_FORMAT "\"$file($line) : $text \"" )
058 ELSE (CMAKE_BUILD_TOOL MATCHES "(msdev|devenv)" )
059 SET(DOXY_WARN_FORMAT "\"$file:$line: $text \"" )
060 ENDIF (CMAKE_BUILD_TOOL MATCHES "(msdev|devenv)" )
061
062 # we need latex for doxygen because of the formulas
063 FIND_PACKAGE(LATEX)
064 IF (NOT LATEX_COMPILER)
065 MESSAGE(STATUS "latex command LATEX_COMPILER not found but usually r
066 ENDIF (NOT LATEX_COMPILER)
067 IF (NOT MAKEINDEX_COMPILER)
068 MESSAGE(STATUS "makeindex command MAKEINDEX_COMPILER not found but u
069 ENDIF (NOT MAKEINDEX_COMPILER)
070 IF (NOT DVIPS_CONVERTER)
071 MESSAGE(STATUS "dvips command DVIPS_CONVERTER not found but usually
072 ENDIF (NOT DVIPS_CONVERTER)
073
074 # Check config file
075 IF (EXISTS "${DOX_CONFIG_FILE}" )
076 CONFIGURE_FILE(${DOX_CONFIG_FILE} ${CMAKE_CURRENT_BINARY_DIR}
077 SET(DOXY_CONFIG "${CMAKE_CURRENT_BINARY_DIR}/doxy.config" )
078 ELSE ()
079 MESSAGE(SEND_ERROR "Please create configuration file for doxygen in
080 ENDIF()
081
082 # Add target
11 de 27 13/03/16 09:14
CMake Tutorial | La plaga Tux http://plagatux.es/2009/12/tutorial-cmake/
12 de 27 13/03/16 09:14
CMake Tutorial | La plaga Tux http://plagatux.es/2009/12/tutorial-cmake/
01 # ----------------------------------------------- ?
02 # - cmake_uninstall.cmake.in
03 # File that provides "make uninstall" target
04 # We use the file 'install_manifest.txt'
05 # -----------------------------------------------
06 IF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" )
07 MESSAGE(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT
08 ENDIF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" )
09
10 FILE(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files)
11 STRING(REGEX REPLACE "\n" ";" files "${files}" )
12 FOREACH(file ${files})
13 MESSAGE(STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"" )
14 IF(EXISTS "$ENV{DESTDIR}${file}" )
15 EXEC_PROGRAM(
16 "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\""
17 OUTPUT_VARIABLE rm_out
18 RETURN_VALUE rm_retval
19 )
20 IF(NOT "${rm_retval}" STREQUAL 0)
21 MESSAGE(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${fil
22 ENDIF(NOT "${rm_retval}" STREQUAL 0)
23 ELSE(EXISTS "$ENV{DESTDIR}${file}" )
24 MESSAGE(STATUS "File \"$ENV{DESTDIR}${file}\" does not exist." )
25 ENDIF(EXISTS "$ENV{DESTDIR}${file}" )
26 ENDFOREACH(file)
1 CONFIGURE_FILE( "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
?
13 de 27 13/03/16 09:14
CMake Tutorial | La plaga Tux http://plagatux.es/2009/12/tutorial-cmake/
1 FIND_PACKAGE(JPEG REQUIRED) ?
2 FIND_PACKAGE(ZLIB REQUIRED)
2 IF (NOT PTHREAD)
3 MESSAGE(FATAL_ERROR "Could not find pthread library" )
4 ENDIF ()
1 ELSEIF (WIN32) ?
2 SET(GNULIBS_PATH ${PROJECT_SOURCE_DIR}/libraries)
14 de 27 13/03/16 09:14
CMake Tutorial | La plaga Tux http://plagatux.es/2009/12/tutorial-cmake/
Creo un directorio libraries, donde coloco las libreras de terceros (en este
caso jpeg). Busco en el sub-directorio libs de dicho directorio si se encuentra
la librera que busco y por ltimo deno el directorio donde se encuentran las
cabeceras para incluirlas posteriormente donde haga falta.
01 # ===================================================================
?
15 de 27 13/03/16 09:14
CMake Tutorial | La plaga Tux http://plagatux.es/2009/12/tutorial-cmake/
Para que se genere este chero debemos aadir las siguientes lneas a
16 de 27 13/03/16 09:14
CMake Tutorial | La plaga Tux http://plagatux.es/2009/12/tutorial-cmake/
01 set(${PROJECT_NAME}_VERSION "1.0.0" ) ?
2 FIND_PACKAGE(PACKAGE REQUIRED)
3 IF (PACKAGE_VERSION VERSION_LESS X.X.X)
4 MESSAGE(FATAL_ERROR "Unable to use version ${PACKAGE_VERSION} of P
5 ENDIF ()
Por supuesto tendremos que cambiar las X por el nmero de versin que
queramos usar, y en caso de haber instalado los cheros en otra ruta
modicar la ruta que establecemos para CMAKE_MODULE_PATH.
17 de 27 13/03/16 09:14
CMake Tutorial | La plaga Tux http://plagatux.es/2009/12/tutorial-cmake/
Por otra parte en nuestro cdigo C/C++ seguramente tambin tendremos que
escribir algunas directivas del procesador para diferenciar entre partes de
cdigo especcas para sistemas Windows y otras partes de cdigo
especcas para sistemas Unix. En gcc y mingw se denen las siguientes
variables (tener cuidado con los dobles guiones bajos):
18 de 27 13/03/16 09:14
CMake Tutorial | La plaga Tux http://plagatux.es/2009/12/tutorial-cmake/
Despus dentro del CMakeLists.txt del directorio raz del proyecto agrego las
siguientes lneas:
1 SET(RESOURCES_PATH ${PROJECT_SOURCE_DIR}/resources) ?
2 CONFIGURE_FILE("${PROJECT_SOURCE_DIR}/config.h.cmake" "${CMAKE_CURRENT
1 INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}) ?
Enlaces de inters
CMake
Tutorial Cmake (pdf en espaol)
cmake para tus proyectos
Sobre dependencias en plataformas especcas.
MinGW + MSYS.
1.
Hook
19 de 27 13/03/16 09:14
CMake Tutorial | La plaga Tux http://plagatux.es/2009/12/tutorial-cmake/
2.
piponazo
Jueves, 16 de septiembre de 2010 a las 18:06 | #2
Responder | Citar
Saludos!
3.
Hook
Viernes, 17 de septiembre de 2010 a las 18:43 | #3
Responder | Citar
4.
Hook
Viernes, 17 de septiembre de 2010 a las 18:45 | #4
20 de 27 13/03/16 09:14
CMake Tutorial | La plaga Tux http://plagatux.es/2009/12/tutorial-cmake/
Responder | Citar
5.
piponazo
Viernes, 17 de septiembre de 2010 a las 18:47 | #5
Responder | Citar
@Hook
Pues de eso ya si que no tengo ni idea Hook. Lo nico que se es que eso
est relacionado con cheros de conguracin de Gnome que tienen que
instalarse en alguna carpeta en concreto, pero no recuerdo nada ms.
Por cierto, dices que se te instala todo en /usr/local pero todo
directamente ah o las libreras en /usr/local/lib y los programas en
/usr/local/bin ? Debes tener cuidado con eso y colocar cada cosa en su
sitio.
Saludos.
6.
Hook
Martes, 21 de septiembre de 2010 a las 19:05 | #6
Responder | Citar
Buenas ya estoy aqu de nuevo a ver si me puedes sacar unas dudas. Que
no quiero irme al Makele sin a verlo intentado con el CMake
1. Trabajo con las libreras POSIX para crear una conexion serial,
funciona correctamente compilando con Code::Blocks, pero al realizarlo
con Cmake no se establece la conexin, es como si le faltara permisos o
algo raro. ( A todo esto no he tenido problemas de compilacion ni nada
por el estilo con CMake).
21 de 27 13/03/16 09:14
CMake Tutorial | La plaga Tux http://plagatux.es/2009/12/tutorial-cmake/
7.
piponazo
Martes, 21 de septiembre de 2010 a las 19:34 | #7
Responder | Citar
$ ls /dev/video0 -lh
crw-rw-+ 1 root video 81, 0 2010-09-21 20:23 /dev/video0
Por lo que solo puede acceder a ella el superusuario y los usuarios que
pertenezcan al grupo vdeo. Probablemente tu cmara tiene los mismos
permisos, por lo que bastar con aadirte al grupo vdeo para poder
acceder a ella con tu usuario normal.
make VERBOSE=1
22 de 27 13/03/16 09:14
CMake Tutorial | La plaga Tux http://plagatux.es/2009/12/tutorial-cmake/
Saludos!
8.
piponazo
Mircoles, 3 de octubre de 2012 a las 06:38 | #8
Responder | Citar
9.
EliasM
Mircoles, 3 de octubre de 2012 a las 13:53 | #9
Responder | Citar
23 de 27 13/03/16 09:14
CMake Tutorial | La plaga Tux http://plagatux.es/2009/12/tutorial-cmake/
Nombre (requerido)
e-Mail (no ser publicado) (requerido)
Sitio web
Google
Youdao
Xian Guo
Zhua Xia
My Yahoo!
newsgator
Bloglines
iNezha
Etiquetas
24 de 27 13/03/16 09:14
CMake Tutorial | La plaga Tux http://plagatux.es/2009/12/tutorial-cmake/
Categories
Breves
Compiz
Distribuciones
Documentos
Drivers
Enlightenment
General
Gnome
Grcos
Hardware
Internet
Investigacin
juegos
KDE
Latex
Libros
MSN
Noticias
25 de 27 13/03/16 09:14
CMake Tutorial | La plaga Tux http://plagatux.es/2009/12/tutorial-cmake/
Ocio
OpenCV
P2P
Programacin
Redes
Resolucin problemas
Scripting
Seguridad
sonido
Tecnologa
Terminal
Tutoriales
Utilidades
vim
Blogroll
ArUco
crystalxp.net
Damiles
El blog de Neonigma
Entre tuxes y pepinos
Hablando de linux
Helektron
Just 4 Cool!
Phoenix Revolution
Ubuntu Life
ltimos comentarios
Average rating:
8.5
831 votes for 200 posts
26 de 27 13/03/16 09:14
CMake Tutorial | La plaga Tux http://plagatux.es/2009/12/tutorial-cmake/
Arriba WordPress
Copyright 2007-2015 La plaga Tux
Tema por NeoEase. Valido XHTML 1.1 y CSS 3.
27 de 27 13/03/16 09:14