Está en la página 1de 16

Tutorial de CMake

Daniel Molina Cabrera June 27, 2009

Contents
1 Objetivo del Documento 2 Conguracin: CMakeLists.txt o 3 Conguracin M o nima 4 Primer ejemplo 5 Usando y deniendo librer as 6 B squeda de Librer u as 6.1 Incluyendo generacin de cdigo mediante Doxygen o o 6.2 Buscando una librer . . . . . . . . . . . . . . . . a 6.3 Buscando una librer a mano . . . . . . . . . . . . a 6.4 Ejercicio: Compilar un programa Qt . . . . . . . . 7 Instalando el software 8 Informacin del make o 9 Conguracin de Directorios o 10 Variable de Entorno de CMake 3 3 4 5 6 7 7 7 8 9 9 10 11 12

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

11 Modos de Compilacin o 12 11.1 Activar las instrucciones assert en modo Release . . . . . . . . . 13 11.2 Denir vuestro propio modo . . . . . . . . . . . . . . . . . . . . . 13 11.3 Activas todos los avisos de compilacin . . . . . . . . . . . . . . . 13 o 12 Opciones Avanzadas 14 12.1 Tipos de Condiciones . . . . . . . . . . . . . . . . . . . . . . . . . 14 12.2 Directivas Condicionales . . . . . . . . . . . . . . . . . . . . . . . 14 12.3 Directivas Iterativas . . . . . . . . . . . . . . . . . . . . . . . . . 14

13 Compilando un proyecto Qt 14 Conclusiones

15 16

Objetivo del Documento

Este documento tiene como objetivo servir de tutorial a la herramienta de construccin CMake. o CMake es una herramienta desarrollada inicialmente para poder compilar de forma multiplataforma la librer VTK como un desarrollo interno, pero que a ha sido publicada como herramienta de Software Libre, disponible en http: //www.cmake.org. El objetivo de este documento no es el de servir como una referencia completa a la documentacin del sistema, ya que ste est perfectamente documentado o e a en la pgina anterior. Ni servir como documentacin introductoria al uso. a o El objetivo es otro, es el de, partiendo de un conocimiento de la herramienta basada en la propia experiencia del autor, ofrecer una gu para su aprendizaje. a Por tanto, destacaremos los aspectos que consideramos ms esenciales, as como a ofreceremos ejemplos propios. De esta forma, este documento puede interpretarse como un documento complementario al resto de documentacin adicional o existente (no slo se explica un conjunto de las distintas opciones posibles, sino o que, adems, las opciones de las distintas directivas comentadas no son exhausa tivas). El motivo es que aunque la herramienta est bien documentada, la documa mentacin se reduce a una explicacin exhaustiva de las distintas directivas, sin o o establecer un orden de aprendizaje que permita ir avanzando poco a poco en su uso, tal y como se hace en este documento. Ntese que en todo el documento consideraremos al lector como un desaro rollador interesado en aplicar el CMake en sus propios proyectos, perl que determina. Nota: Aunque haga referencia a Windows en el documento, advierto que aunque tengo referencias de su buen comportamiento no lo he utilizado en ese entorno (porque no tengo Windows instalado en ninguna de las mquinas a que uso ;-) ).

Conguracin: CMakeLists.txt o

Para aplicar la herramienta para compilar un proyecto slo es necesario generar o un chero CMakeLists.txt. Dicho chero es el encargado de indicar toda la informacin necesaria: o Los cheros a compilar. Las librer y ejecutables a generar. as Librer de las que depende. as Parmetros adicionales. a Programas externos a utilizar (doxygen, . . . ).

Toda esta informacin se concentra en un unico chero por proyecto, y con o una sintaxis que se plante para que fuese sencilla, pero potente. Sin embargo, o se puede dividir. Es decir, si tenemos el proyecto dividido de forma jerrquica en varios dia rectorios podemos crear un CMakeLists.txt por cada directorio, y hacer que un CMakeLists.txt llame a los CMakeLists.txt de sus subdirectorios (mediante la instruccin ADD SUBDIRECTORY ). o A continuacin describimos los parmetros ms importantes. o a a Notacin: El uso de <> identica un parmetro. El uso de corchetes o a determina que dicho parmetro es opcional a

Conguracin M o nima
CMakeLists.txt m nimo:
PROJECT( h e l l o ) ADD EXECUTABLE( h e l l o h e l l o . c )

Para crear un CMakeLists.txt, el formato m nimo suele ser:

PROJECT(< proyecto > [lenguaje]) : Denicin del proyecto. o < proyecto > es el nombre del proyecto. Asociado a dicho nombre se generarn un conjunto de variables que identican los a distintos directorios. Es un requisito necesario. lenguaje es el lenguaje del proyecto. Aunque no es necesario puede ser muy conveniente, si se especica CXX, por ejemplo, usa el compilador de c++ incluso aunque los cheros sean .c. Este parmetro presupone el mismo lenguaje para todos los cheros a a compilar. Si hay cheros en distintos formatos, no debe de indicarse. ADD EXECUTABLE(< ejecutable > < f ichero1 > [. . . < f icheros >]: Dene un ejecutable. < ejecutable >, nombre del ejecutable resultante de la compilacin, sin ruta. Lo crea en el mismo directorio desde el que se o hay ejecutado cmake < arg >. Sin embargo, posteriormente se puede indicar el directorio en el que instalarlo, mediante la instruccin INSTALL. o < f icheros >, nombre de los cheros de los que depende para compilar. Dado que a veces el ejecutable coincide en nombre con uno de los cheros, dicho chero main se suele indicar en esta l nea indicando su extensin. Los cheros son una lista de o nombres separados por espacio en blanco, pueden tener extensin o o no.Para el resto de cheros, se suele usar una variable SRC, para mayor comodidad. 4

SET (< variable > [< f icheros >]): Dene variable. Este es una de las directivas ms utiles para hacer el chero legible. a < variable >, nombre de la variable. Existen varias convenciones que se recomienda seguir. Si contiene cheros a compilar, debe terminar en SRC. Una vez que se haya denido, para usarla se debe de indicar $ < variable > $. < f icheros > indica el conjunto de cheros a utilizar, separados por espacios (o retornos de carro, para mayor legibilidad). Tambin se utiliza para denir variables propias del CMake, ver e Apartado 10. Puede usarsen variables para denir otras variables. Ejemplo:
SET (PROBLEM SRC functions utils problem common ) SET (CEC SRC $ {PROBLEM SRC} problemcec2005 ) . . .

cmake minimum version(V ERSION < numero version >): Dene la versin de CMake requerida. o A menudo, el CMake exige que aparezca una l nea equivalente a esta al principio del chero CMakeLists.txt. El objetivo es vericar que la versin o del CMake usada es igual o superior a la exigida. Esto se hace ya que el comportamiento del CMake puede variar entre versiones. < numero version >: Nmero de versin. La versin actual es la u o o 2.6, por lo que lo normal es poner ese nmero. Sin embargo, la versin u o anterior, la 2.4, es bastante usada y son muy compatibles, por lo que puede usarse tambin. e

Primer ejemplo

Haciendo uso de las directivas anteriores, vamos a crear el CMakeLists.txt de un proyecto real, pero sencillo. Copiamos el chero cma.tgz, y crearemos un CMakeLists.txt para poder compilarlo. Consejo: Usar la directive CMAKE VERBOSE MAKEFILE del apartado 10.

Usando y deniendo librer as

Hasta ahora hemos utilizado CMake para construir programas en los que no hab implicada ninguna librer Vamos a ver ahora cmo tratar con librer a a. o as. El primer paso es poder enlazar con librer existentes. Ahora mismo no as nos vamos a preocupar en buscarlas instaladas, eso se ensea en el apartado ??. n El primer paso es indicarle que para crear el ejecutable debe de enlazar con las librer as. TARGET LINK LIBRARIES(< ejecutable > [< librerias >]): Indica las librer con las que enlazar. as < ejecutable >: Nombre del ejecutable utilizado en ADD EXECUTABLE. < librerias >. En Unix/Linux por convencin las librer empiezan o as por libxxx.so libxxx.a, por lo que ni prejo lib ni la extensin hay o o que aadirlo. Ejemplo, para compilar el programa distancia euclidea n con la librer matemtica libm, se usar a a a TARGET LINK LIBRARIES(distancia euclidea m). Mediante esta instruccin se indica que enlace con una librer Las lio a. brer sern DLL (Windows), librer dinmicas (Unix/Linux) o estticas. as a as a a Normalmente se hace uso de una variable LIBS en la que se aaden el total n de librer de las que depende. as Otro uso de librer es el de crear vuestras propias librer as as. Esta es una tarea que suele ser muy dif con otros entornos. Con CMake es muy fcil. cil a Simplemente se usa la directiva ADD LIBRARY(< nombre libreria > SHARED|ST AT IC < f icheros >): Dene una librer a. < nombre libreria > dene el nombre de la librer (sin prejo lib ni a extensin). o SHARED|ST AT IC dene el tipo de librer SHARED dene una a. librer dinmica (.so en Unix/Linux, DLL en Windows), mientras a a que ST AT IC deniria una librer .a. Dada la nula dicultad en a hacer la librer dinmica, recomiendo crearlas dinmicas. a a a
PROJECT( h e l l o C) SET(LIBSRC hellolib ) SET(SRC hello ) 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 )

B squeda de Librer u as

Un aspectos que hace las herramientas autotools muy bien es el de buscar librer necesarias para compilar. Antes de compilar, identica el compilador, y as las distintas librer (ej: Qt). En el caso de no encontrarlo, termina el proceso as avisando al usuario con un mensaje adecuado, de esta forma sabe que debe de instalar dicha librer antes de reintentarlo. Usando un simple Makele dar a a un error en el enlazado, pero sin avisar convenientemente al usuario del motivo del error. CMake tambin permite realizar este tipo de operaciones, tanto para bsqueda e u de ejecutables como para bsqueda de librer u as. Aunque posee instrucciones para realizar bsquedas personalizadas de librer u as, por comodidad permiten cheros de extensiones que permiten buscar cmodamente una librer o proo a grama. Para ello se hace uso de la directiva INCLUDE conjuntamente con un chero Find existente. En el siguiente apartado pongo un ejemplo.

6.1

Incluyendo generacin de cdigo mediante Doxygen o o

Para aadir a makele la opcin de generar la documentacin en doxygen, es n o o necesario hacer uso de la directiva INCLUDE. INCLUDE(FindDoxygen) [REQUIRED]: Busca el software Doxygen. Una vez indicado, dene (si existe) en la variable DOXY GENE XECU T ABLE la ruta del ejecutable Doxygen. La deja en blanco si no lo encontr. o
# Busca e l Doxygen INCLUDE( FindDoxygen ) # Comprueba s i l o ha encontrado , s i no no hace nada ( no da e r r o r ) IF (DOXYGEN EXECUTABLE) # Avisa de que l o ha e n c o n t r a d o MESSAGE( STATUS S e t t i n g Doxygen G e n e r a t o r ) # D e f i n e l a nueva s a l i d a doc como r e s u l t a d o de e j e c u t a r Doxygen s o b r e e l # d i r e c t o r i o a c t u a l ( Doxygen debe de e s t a r p e r f e c t a m e n t e c o n f i g u r a d o ) ADD CUSTOM TARGET( doc COMMAND $ {DOXYGEN EXECUTABLE} VERBATIM) ENDIF(DOXYGEN EXECUTABLE)

6.2

Buscando una librer a

En el apartado anterior se buscaba un ejecutable, pero el caso ms habitual es a la bsqueda de librer de desarrollo. Se realiza de la misma forma, mediante u as la directiva INCLUDE. Ejemplo: 7

INCLUDE(FindQt4). Esta directiva permite buscar la librer Qt4 para poder enlazarla. a La accin de cada Find puede diferir, pero por convencin utilizan la mayor o o a el mismo esquema. Una vez incluida, dene una serie de variables si la encontr o (donde < P KG > es el nombre del paquete/librer a): < P KG > INCLUDE DIRS: Dene la ruta de los includes. Usualmente se ha aadido automticamente a IN CLU DED IRECT ORIES, n a pero en algn caso puede ser necesario incluirlo. u as < P KG > LIBRARIES: Librer a incluir. Se deben de especicar en la instruccin TARGET LINK LIBRARIES. o < P KG > DEFINITIONS: Denicin de la librer o a. Admite el parmetro adicional REQUIRED. Si est denido y no encuentra a a termina, si no est denido, simplemente no hace nada, pero se puede comprobar a que tras el INCLUDE una de estas variables est denida. Si no es el caso, se e puede escribir un mensaje de advertencia con MESSAGE MESSAGE(Mensaje): Permite escribir un mensaje. Esta directiva permite escribir un mensaje de texto al usuario. MESSAGE(FATAL ERROR Mensaje): Permite escribir un mensaje de error, y terminar. Esta directiva permite escribir un mensaje de texto al usuario avisando de un error, y terminar de procesar el chero CMakeLists.txt.

6.3

Buscando una librer a mano a

Como ya coment, en el caso de que no exista ningn mdulo para la librer e u o a que queremos usar, tenemos dos opciones. Denir el mdulo, y contribuir a la sociedad :-). o Hacer uso de la directiva FIND LIBRARY. FIND LIBRARY(< variable > NAMES < nombre lib > PATHS < rutas busqueda >): Busca una librer a. < variable > Nombre de la variable. < nombre lib > Lista de nombres de la librer (sin extensin y sin a o prejo lib). < rutas busqueda >, conjunto de rutas (path) en el que buscar la librer a.

El proceso es muy sencillo, busca para cada una de las rutas la librer a indicada un chero con el nombre indicado, y si lo encuentra almacena en dicha variable la ruta completa de la librer Si no la encuentra deja la a. variable sin denir (se puede comprobar con IF (NOT < variable >). Ejemplo:
FIND LIBRARY( TCL LIB NAMES t c l PATHS / u s r / l i b / u s r / l o c a l / l i b ) IF ( TCL LIB ) TARGET ADD LIBRARY( H e l l o TCL LIB ) ENDIF ( TCL LIB )

6.4

Ejercicio: Compilar un programa Qt

Vamos a compilar un programa Qt, para ello vamos a tener que buscar el paquete antes de compilarlo.

Instalando el software

Hasta ahora el make tendr la informacin necesaria para compilar los proa o gramas y librer congurados, pero no tendr informacin de instalacin. Si as a o o queremos poder usar una orden make install y que se instalen los programas y/o librer es necesario congurarlo adecuadamente, mediante las directivas as, siguientes. INSTALL(FILES < nombre libreria > DESTINATION lib): Permite instalar una librer a. a < nombre libreria >: Dene el chero de la librer instalar (con su ruta, si se encuentra en otro directorio). INSTALL(FILES < nombre ejecutable > DESTINATION bin): Permite instalar un ejecutable. < nombre ejecutable >: Dene el programa a instalar (con su ruta, si se encuentra en otro directorio). En ambos casos, se puede especicar un unico ejecutable o librer o una lista a de ellos (separados por espacio en blanco). Sin mayor conguracin, instalar en o a /usr/local /bin y /usr/local /lib, respectivamente. Si se desea cambiar el prejo se puede usar la variable CMAKE INSTALL PREFIX.

Informacin del make o

Un problema importante del CMake es que, a diferencia de las autotools, requiere tener instalado el cmake para compilar. Aunque a primera vista pueda parecer un problema importante, ya de antemano le exigimos al usuario que compila el gcc/g++, make, todas las librer dinmicas necesarias, . . . por lo as a que consideramos que no es un problema tan importante. El Makele generado admite varias opciones. Usando make help se indican las distintas opciones. Las ms importantes son: a all: Permite compilar todo el sistema, tanto los ejecutables indicados con as ADD EXECUTABLE como las librer ADD LIBRARY. clean: Borra todos los cheros generados (no elimina los cheros CMakexxx generados por cmake). rebuild cache: Compila todo, ignorando la cach. e depend: Comprueba las dependencias, no hace nada ms. a Adems, por cada programa(ejecutable, librer chero objeto) existe una a a, directiva para compilarlo por separado, si se desea. Adems de este compora tamiento por defecto, se pueden aadir opciones mediante la directiva n Sin embargo, se pueden aadir nuestras instrucciones, mediante la instruccin n o ADD CUSTOM TARGET. ADD CUSTOM TARGET(< nombre > COMMAND < orden > [V ERBAT IM ]): Permite aadir opcin al make. n o < nombre >: nombre de la opcin. Para ejecutar la orden se har o a make < nombre >. < orden >: Sentencia shell a ejecutar, a menudo es necesario usar la ruta. Por portabilidad, es conveniente hacer uso de Find. V ERBAT IM : Parmetro adicional que activa la informacin. a o Tambin se pueden denir opciones propias, le e das mediante la expresin o cmake -DVAR=valor, mediante la directiva. OPTION(< variable > < descripcion > [valor def ecto]): Dene un parmetro. a < variable > nombre del la variable. < descripcion > Cadena con la descripcin del parmetro. o a valor def ecto valor por defecto. Ejemplo: OPTION(INSTALL DOC Set to OFF to skip build/install Documentation ON), permite especicar si se desea instalar la documentacin (la instala por defecto). o 10

Conguracin de Directorios o

En primer lugar, es muy usual que un directorio de cdigo fuente a su vez se o divida en otros directorios (que denan librer por ejemplo). En este caso, as, se puede denir para cada uno de esos directorios un chero CMakeLists.txt y establecer que el directorio padre llame a los CMakeLists.txt de sus subdirectorios. n ADD SUBDIRECTORY(< directorio >): Aade un subdirectorio. < directorio > directorio a aadir, con la ruta relativa. n Permite aadir un subdirectorio. Antes de procesar el directorio actual, se n procesar cada uno de los subdirectorios indicado. Toda variable denida a en el directorio padre mantendr su valor para cada uno de los CMakea Lists.txt de sus subdirectorios indicados. Sin embargo, es conveniente evitar depender demasiado de dichas variables, ya que generan dependencias innecesarias. INCLUDE DIRECTORIES( < directorios > ): Permite insertar directorios para los include. Mediante esta variable se pueden aadir nuevas rutas para buscar los n cheros .h. Si se hace uso de una sentencia #include name.h deber de a encontrarse el chero name.h o bien en una ruta del sistema (usualmente: /usr/include/, /usr/local/include, . . . ) o bien en una ruta asignada a esta variable. LINK DIRECTORIES( < directorios > ): Permite insertar directorios en donde buscar las librer Mediante esta variable se pueden aadir as. n nuevas rutas para buscar las librer as. AUX SOURCE DIRECTORIES( < directorio > < variable > ): Permite aadir en la variable < variable > todos los cheros almacenados n en el directorio < directorio >. < directorio > directorio (usualmente subdirectorio) en donde se encuentran cdigo fuente. o < variable > variable en donde se almacenan todos los cheros fuente del directorio indicado. Existe una serie de variables que permite especicar las rutas para cada elemento. Aunque no suele ser necesario suele ser conveniente denirlas si el software posee una estructura compleja. CMAKE INSTALL PREFIX: Ruta de instalacin. o PROJECT BINARY DIR: Directorio en donde se guarda el binario (no modicar). 11

PROJECT SOURCE DIR: Directorio en donde se encuentra el cdigo o fuente (no modicar).

10

Variable de Entorno de CMake

CMake usa una serie de variables de entorno que determinan su comportamiento. Todas ellas poseen un valor por defecto, pero que pueden modicarse de dos formas: Mediante la directiva SET(< variable > < valor >), donde valor puede ser una cadena, una lista de cheros, o un valor numrico. Todo depende e de la variable utilizada. Mediante la l nea de comando cmake -D< variable >=< valor >. Mediante este formato se puede denir sin necesidad de reescribirlo en el CMakeLists.txt. Es una opcin vlida para redenir una variable ms o a a puntualmente (como CMAKE VERBOSE MAKEFILE o CMAKE BUILD TYPE), pero no para aplicarlo de forma general. A continuacin detallo las variables que considero ms importantes: o a CMAKE VERBOSE MAKEFILE OF F |ON : Activa mensajes de informacin por pantalla. o A la hora de denir, a veces pueden producirse errores como no encontrar el cdigo de una funcin. Con esta l o o nea muestra lo que hace (los cheros que compila, los parmetros que usa). Suele ser muy recomendable usarlo. a CMAKE BUILD TYPE Release|Debug: Selecciona el modo de depuracin. o Release: Activa todas las opciones de optimizacin (sin informacin o o de depuracin). Nota: Desactiva tambin las instrucciones assert o e en C/C++. Debug: Activa la informacin del depurador (para poder usar deo spus). No optimiza. e Ver apartado 11 para ms informacin. a o

11

Modos de Compilacin o

A la hora de trabajar con el compilador existen dos modos de compilacin, o denidos en la variable CMAKE BUILD TYPE: Depuracin (Debug) y deo spliegue (Release). Es recomendable trabajar en modo Debug y emplear el modo release cuando se realice la versin nal, o para hacer pruebas de rendimiento (si se usan las o STL de C++, hay gran diferencias de rendimiento entre un modo u otro). 12

Dado que supongo que usis un sistema de repositorio para conrmar que a el CMakeLists.txt de desarrollo y de implantacin coincidan, el conveniente o especicar el modo de compilacin desde la linea de comandos (al menos en las o fases iniciales d desarrollo). A continuacin muestro algunos trucos que pueden seros interesantes. o

11.1

Activar las instrucciones assert en modo Release

A pesar de lo comentado anteriormente, es posible hacer que las instrucciones assert funcionen en modo Release.
# d e f i n e macro DEBUG macro en modo R e l e a s e STRING(TOLOWER $ {CMAKE BUILD TYPE} CMAKE BUILD TYPE TOLOWER) i f (CMAKE BUILD TYPE TOLOWER MATCHES r e l e a s e ) s e t (NDEBUG 1 ) e n d i f (CMAKE BUILD TYPE TOLOWER MATCHES r e l e a s e )

11.2

Denir vuestro propio modo

En este ejemplo deno un modo Prole, en el que se activar la directiva -pg a necesaria para poder usar la aplicacin de prole de C++ (si no sabeis a lo que o me reero, deber echarle un vistado al programa cprof ). ais
# d e f i n e macro DEBUG macro en modo R e l e a s e STRING(TOLOWER $ {CMAKE BUILD TYPE} CMAKE BUILD TYPE TOLOWER) IF (CMAKE BUILD TYPE TOLOWER MATCHES p r o f i l e ) SET (GPROF FLAGS pg ) SET (FLAGS $ {SHARED FLAGS} Wall O DNDEBUG $ {GPROF FLAGS} ) SET (CMAKE CXX FLAGS $ {FLAGS} $ {GPROF FLAGS} ) SET (CMAKE EXE LINKER FLAGS $ {GPROF FLAGS} ) MESSAGE(STATUS P r o f i l e ) ENDIF (CMAKE BUILD TYPE TOLOWER MATCHES p r o f i l e )

11.3

Activas todos los avisos de compilacin o

Existen una serie de directivas que indican al compilador que active todos los posibles mensajes de advertencia (warnings), que pueden utilizarse en todos los modos. Lamentablemente, no se especica por defecto. Para activarlo se puede utilizar la directiva: SET(CMAKE CXX FLAGS -Wall) para C++. SET(CMAKE C FLAGS -Wall) para ansi C. Otra opcin ms portable ser o a a: ADD DEFINITIONS(-Wall), pero en el caso de que queramos denir directivas distintas para C y para C++ tendr amos que usar las variables anteriores). L 13

12

Opciones Avanzadas

Tal y como se ha podido ver en algunos ejemplos, se pueden ejecutar las directivas en funcin de condiciones. Se ha intentado que sea lo sucientemente o exible para adaptarse a las distintas necesidades, pero no a costa de hacerlo demasiado complejo.

12.1

Tipos de Condiciones

A continuacin presentamos los principales tipos de condiciones: o DEFINED( < var > ): Comprueba si la variable < var > est denida. a < variable > STREQUAL < cadena >: Devuelve si el contenido de la variable es la cadena indicada. NOT < CON DICION >: Devuelve verdadero si la condicin indicada o es falsa. < variable > < valor >: Devuelve verdadero si la variable < variable > es numrica o lgica (ONOFF) y su valor coincide con el indicado en e o < valor >.

12.2

Directivas Condicionales

Existe directiva condicional, que permite modicar la construccin en funcin o o de alguna informacin (generar documentacin mediante doxygen slo si est o o o a instalado) IF( < CON DICION > ) . . . ENDIF( < CON DICION > ) La interpretacin de la cadena es evidente. Las directivas situadas dentro o del IF slo se evaluar si la condicin indicada es cierta, pero en todo caso debe o a o de ser sintcticamente correctas. a Dado que a menudo es muy molesto tener que repetir la condicin dos veces o (en el IF y en el ENDIF), se puede hacer uso de la condicin o SET (CMAKE ALLOW LOOSE LOOP CONSTRUCTS TRUE): Permite denir las sentencias ENDIF sin la condicin. o

12.3

Directivas Iterativas

Aunque el uso de instrucciones iterativas no sea realmente necesario, hay ocasiones en las que puede rsultar muy cmodo su uso. o

14

FOREACH (< variable > < valores >) . . . ENDFOREACH(< variable >) Con la instruccin FOREACH se puede denir aplicar un conjunto de o directivas sucesivas veces, cada vez con un valor de la variable < variable > distinto. Ejemplo de su uso:
SET(REALEALIBS realea newmat realpeasy bbob2009 realls ) SET ( LIBS m newmat $ {REALEALIBS} ) SET ( EAs chc de ssga pso ) FOREACH(EA $ {EAs } ) ADD EXECUTABLE( $ {EA} main $ {EA} . c c ) TARGET LINK LIBRARIES( $ {EA} $ {LIBS} r e a l $ {EA} r e a l p c e c 2 0 0 5 m) INSTALL(TARGETS $ {EA} DESTINATION b i n ) INSTALL( FILES l i b / l i b r e a l $ {EA} . s o DESTINATION l i b ) ENDFOREACH(EA)

13

Compilando un proyecto Qt

Tal y como se ha comentado, CMake es actualmente la herramienta de construccin para proyectos KDE, y, por tanto, para Qt. o El principal problema para el uso de Qt era la necesidad del sistema moc (una especie de preprocesador especial), que se aborda mediante el uso del mdulo o de Qt4.
q t p r o j e c t / CMakeLists . t x t : p r o j e c t ( q t p r o j e c t ) # t h e name o f your p r o j e c t cmake minimum required (VERSION 2 . 4 . 0 ) f i n d p a c k a g e ( Qt4 REQUIRED) # f i n d and s e t u p Qt4 f o r t h i s p r o j e c t

15

# t e l l cmake t o p r o c e s s CMakeLists . t x t i n t h a t s u b d i r e c t o r y add subdirectory ( src ) q t p r o j e c t / s r c / CMakeLists . t x t :

# t h e next l i n e s e t s up i n c l u d e and l i n k d i r e c t o r i e s and d e f i n e s some v a r i a b l e s t h a t # you can modify t h e b e h a v i o r by s e t t i n g some v a r i a b l e s , e . g . # s e t (QT USE OPENGL TRUE) # > t h i s w i l l c a u s e cmake t o i n c l u d e and l i n k a g a i n s t t h e OpenGL module i n c l u d e ( $ {QT USE FILE } ) # t h e v a r i a b l e q t p r o j e c t S R C S c o n t a i n s a l l . cpp f i l e s o f t h i s p r o j e c t s e t ( qtproject SRCS main . cpp top . cpp ) # t e l l cmake t o c r e a t e . moc f i l e s f o r a l l f i l e s i n t h e v a r i a b l e q t p r o j e c t S R C S t h a t # n o t e : t h i s assumes t h a t you u s e #i n c l u d e h e a d e r . moc i n your f i l e s qt4 automoc ( $ { q t p r o j e c t S R C S } ) # c r e a t e an e x e c u t a b l e f i l e named q t p r o j e c t from t h e s o u r c e f i l e s i n t h e v a r i a b l e add executable ( q t p r o j e c t ${ qtproject SRCS }) # l i n k t h e q t p r o j e c t t a r g e t a g a i n s t t h e Qt l i b r a r i e s . which l i b r a r i e s e x a c t l y , i s t a r g e t l i n k l i b r a r i e s ( q t p r o j e c t $ {QT LIBRARIES} )

14

Conclusiones

Espero que esta gu dirigida les haya servido, y que se animen a utilizar el a CMake :-).

16

También podría gustarte