Está en la página 1de 16

Tutorial de CMake

Daniel Molina Cabrera June 27, 2009

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

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

11 Modos de Compilaci on 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 compilaci on . . . . . . . . . . . . . . . 13 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 construcci on CMake. CMake es una herramienta desarrollada inicialmente para poder compilar de forma multiplataforma la librer a VTK como un desarrollo interno, pero que 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 documentaci on del sistema, ya que este est a perfectamente documentado en la p agina anterior. Ni servir como documentaci on introductoria al uso. El objetivo es otro, es el de, partiendo de un conocimiento de la herramienta basada en la propia experiencia del autor, ofrecer una gu a para su aprendizaje. Por tanto, destacaremos los aspectos que consideramos m as esenciales, as como ofreceremos ejemplos propios. De esta forma, este documento puede interpretarse como un documento complementario al resto de documentaci on adicional existente (no s olo se explica un conjunto de las distintas opciones posibles, sino que, adem as, las opciones de las distintas directivas comentadas no son exhaustivas). El motivo es que aunque la herramienta est a bien documentada, la docummentaci on se reduce a una explicaci on exhaustiva de las distintas directivas, sin establecer un orden de aprendizaje que permita ir avanzando poco a poco en su uso, tal y como se hace en este documento. N otese que en todo el documento consideraremos al lector como un desarrollador 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 m aquinas que uso ;-) ).

Conguraci on: CMakeLists.txt

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

Toda esta informaci on se concentra en un u nico chero por proyecto, y con una sintaxis que se plante o para que fuese sencilla, pero potente. Sin embargo, se puede dividir. Es decir, si tenemos el proyecto dividido de forma jer arquica en varios directorios podemos crear un CMakeLists.txt por cada directorio, y hacer que un CMakeLists.txt llame a los CMakeLists.txt de sus subdirectorios (mediante la instrucci on ADD SUBDIRECTORY ). A continuaci on describimos los par ametros m as importantes. Notaci on: El uso de <> identica un par ametro. El uso de corchetes determina que dicho par ametro es opcional

Conguraci on M 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]) : Denici on del proyecto. < proyecto > es el nombre del proyecto. Asociado a dicho nombre se generar an un conjunto de variables que identican los 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 par ametro presupone el mismo lenguaje para todos los cheros 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 compilaci on, sin ruta. Lo crea en el mismo directorio desde el que se hay ejecutado cmake < arg >. Sin embargo, posteriormente se puede indicar el directorio en el que instalarlo, mediante la instrucci on INSTALL. < 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 extensi on. Los cheros son una lista de nombres separados por espacio en blanco, pueden tener extensi on 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 m as u tiles para hacer el chero legible. < 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). Tambi en se utiliza para denir variables propias del CMake, ver 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 versi on de CMake requerida. 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 versi on 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 >: N umero de versi on. La versi on actual es la 2.6, por lo que lo normal es poner ese n umero. Sin embargo, la versi on anterior, la 2.4, es bastante usada y son muy compatibles, por lo que puede usarse tambi en.

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 a implicada ninguna librer a. Vamos a ver ahora c omo tratar con librer as. El primer paso es poder enlazar con librer as existentes. Ahora mismo no nos vamos a preocupar en buscarlas instaladas, eso se ense na en el apartado ??. 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 as con las que enlazar. < ejecutable >: Nombre del ejecutable utilizado en ADD EXECUTABLE. < librerias >. En Unix/Linux por convenci on las librer as empiezan por libxxx.so o libxxx.a, por lo que ni prejo lib ni la extensi on hay que a nadirlo. Ejemplo, para compilar el programa distancia euclidea con la librer a matem atica libm, se usar a TARGET LINK LIBRARIES(distancia euclidea m). Mediante esta instrucci on se indica que enlace con una librer a. Las librer as ser an DLL (Windows), librer as din amicas (Unix/Linux) o est aticas. Normalmente se hace uso de una variable LIBS en la que se a naden el total de librer as de las que depende. Otro uso de librer as es el de crear vuestras propias librer as. Esta es una tarea que suele ser muy dif cil con otros entornos. Con CMake es muy f acil. 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 a (sin prejo lib ni extensi on). SHARED|ST AT IC dene el tipo de librer a. SHARED dene una librer a din amica (.so en Unix/Linux, DLL en Windows), mientras que ST AT IC deniria una librer a .a. Dada la nula dicultad en hacer la librer a din amica, recomiendo crearlas din amicas.
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 usqueda de Librer as

Un aspectos que hace las herramientas autotools muy bien es el de buscar librer as necesarias para compilar. Antes de compilar, identica el compilador, y las distintas librer as (ej: Qt). En el caso de no encontrarlo, termina el proceso avisando al usuario con un mensaje adecuado, de esta forma sabe que debe de instalar dicha librer a antes de reintentarlo. Usando un simple Makele dar a un error en el enlazado, pero sin avisar convenientemente al usuario del motivo del error. CMake tambi en permite realizar este tipo de operaciones, tanto para b usqueda de ejecutables como para b usqueda de librer as. Aunque posee instrucciones para realizar b usquedas personalizadas de librer as, por comodidad permiten cheros de extensiones que permiten buscar c omodamente una librer a o programa. 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 generaci on de c odigo mediante Doxygen

Para a nadir a makele la opci on de generar la documentaci on en doxygen, es 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 m as habitual es la b usqueda de librer as de desarrollo. Se realiza de la misma forma, mediante la directiva INCLUDE. Ejemplo: 7

INCLUDE(FindQt4). Esta directiva permite buscar la librer a Qt4 para poder enlazarla. La acci on de cada Find puede diferir, pero por convenci on utilizan la mayor 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 a nadido autom aticamente a IN CLU DED IRECT ORIES , pero en alg un caso puede ser necesario incluirlo. as a incluir. Se deben de especicar en < P KG > LIBRARIES: Librer la instrucci on TARGET LINK LIBRARIES. < P KG > DEFINITIONS: Denici on de la librer a. Admite el par ametro adicional REQUIRED. Si est a denido y no encuentra termina, si no est a denido, simplemente no hace nada, pero se puede comprobar que tras el INCLUDE una de estas variables est e denida. Si no es el caso, se 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 a mano

Como ya coment e, en el caso de que no exista ning un m odulo para la librer a que queremos usar, tenemos dos opciones. Denir el m odulo, y contribuir a la sociedad :-). 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 a (sin extensi on y sin 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 a. Si no la encuentra deja la 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 a la informaci on necesaria para compilar los programas y librer as congurados, pero no tendr a informaci on de instalaci on. Si queremos poder usar una orden make install y que se instalen los programas y/o librer as, es necesario congurarlo adecuadamente, mediante las directivas siguientes. INSTALL(FILES < nombre libreria > DESTINATION lib): Permite instalar una librer a. a instalar (con su < nombre libreria >: Dene el chero de la librer 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 u nico ejecutable o librer a o una lista de ellos (separados por espacio en blanco). Sin mayor conguraci on, instalar a en /usr/local /bin y /usr/local /lib, respectivamente. Si se desea cambiar el prejo se puede usar la variable CMAKE INSTALL PREFIX.

Informaci on del make

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 as din amicas necesarias, . . . por lo que consideramos que no es un problema tan importante. El Makele generado admite varias opciones. Usando make help se indican las distintas opciones. Las m as importantes son: all: Permite compilar todo el sistema, tanto los ejecutables indicados con as ADD LIBRARY. ADD EXECUTABLE como las librer 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 m as. Adem as, por cada programa(ejecutable, librer a, chero objeto) existe una directiva para compilarlo por separado, si se desea. Adem as de este comportamiento por defecto, se pueden a nadir opciones mediante la directiva Sin embargo, se pueden a nadir nuestras instrucciones, mediante la instrucci on ADD CUSTOM TARGET. ADD CUSTOM TARGET(< nombre > COMMAND < orden > [V ERBAT IM ]): Permite a nadir opci on al make. < nombre >: nombre de la opci on. Para ejecutar la orden se har 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 : Par ametro adicional que activa la informaci on. Tambi en se pueden denir opciones propias, le das mediante la expresi on cmake -DVAR=valor, mediante la directiva. OPTION(< variable > < descripcion > [valor def ecto]): Dene un par ametro. < variable > nombre del la variable. < descripcion > Cadena con la descripci on del par ametro. 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 documentaci on (la instala por defecto). 10

Conguraci on de Directorios

En primer lugar, es muy usual que un directorio de c odigo fuente a su vez se divida en otros directorios (que denan librer as, por ejemplo). En este caso, 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. nade un subdirectorio. ADD SUBDIRECTORY(< directorio >): A < directorio > directorio a a nadir, con la ruta relativa. Permite a nadir un subdirectorio. Antes de procesar el directorio actual, se procesar a cada uno de los subdirectorios indicado. Toda variable denida en el directorio padre mantendr a su valor para cada uno de los CMakeLists.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 a nadir nuevas rutas para buscar los cheros .h. Si se hace uso de una sentencia #include name.h deber a de 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 as. Mediante esta variable se pueden a nadir nuevas rutas para buscar las librer as. AUX SOURCE DIRECTORIES( < directorio > < variable > ): Permite a nadir en la variable < variable > todos los cheros almacenados en el directorio < directorio >. < directorio > directorio (usualmente subdirectorio) en donde se encuentran c odigo fuente. < 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 instalaci on. PROJECT BINARY DIR: Directorio en donde se guarda el binario (no modicar). 11

PROJECT SOURCE DIR: Directorio en donde se encuentra el c odigo 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 num erico. Todo depende 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 opci on v alida para redenir una variable m as puntualmente (como CMAKE VERBOSE MAKEFILE o CMAKE BUILD TYPE), pero no para aplicarlo de forma general. A continuaci on detallo las variables que considero m as importantes: CMAKE VERBOSE MAKEFILE OF F |ON : Activa mensajes de informaci on por pantalla. A la hora de denir, a veces pueden producirse errores como no encontrar el c odigo de una funci on. Con esta l nea muestra lo que hace (los cheros que compila, los par ametros que usa). Suele ser muy recomendable usarlo. CMAKE BUILD TYPE Release|Debug : Selecciona el modo de depuraci on. Release: Activa todas las opciones de optimizaci on (sin informaci on de depuraci on). Nota: Desactiva tambi en las instrucciones assert en C/C++. Debug: Activa la informaci on del depurador (para poder usar despu es). No optimiza. Ver apartado 11 para m as informaci on.

11

Modos de Compilaci on

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

Dado que supongo que us ais un sistema de repositorio para conrmar que el CMakeLists.txt de desarrollo y de implantaci on coincidan, el conveniente especicar el modo de compilaci on desde la linea de comandos (al menos en las fases iniciales d desarrollo). A continuaci on muestro algunos trucos que pueden seros interesantes.

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 a la directiva -pg necesaria para poder usar la aplicaci on de prole de C++ (si no sabeis a lo que me reero, deber ais echarle un vistado al programa cprof ).
# 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 compilaci on

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 opci on m as portable ser 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 funci on de condiciones. Se ha intentado que sea lo sucientemente exible para adaptarse a las distintas necesidades, pero no a costa de hacerlo demasiado complejo.

12.1

Tipos de Condiciones

A continuaci on presentamos los principales tipos de condiciones: DEFINED( < var > ): Comprueba si la variable < var > est a denida. < variable > STREQUAL < cadena >: Devuelve si el contenido de la variable es la cadena indicada. NOT < CON DICION >: Devuelve verdadero si la condici on indicada es falsa. < variable > < valor >: Devuelve verdadero si la variable < variable > es num erica o l ogica (ONOFF) y su valor coincide con el indicado en < valor >.

12.2

Directivas Condicionales

Existe directiva condicional, que permite modicar la construcci on en funci on de alguna informaci on (generar documentaci on mediante doxygen s olo si est a instalado) IF( < CON DICION > ) . . . ENDIF( < CON DICION > ) La interpretaci on de la cadena es evidente. Las directivas situadas dentro del IF s olo se evaluar a si la condici on indicada es cierta, pero en todo caso debe de ser sint acticamente correctas. Dado que a menudo es muy molesto tener que repetir la condici on dos veces (en el IF y en el ENDIF), se puede hacer uso de la condici on SET (CMAKE ALLOW LOOSE LOOP CONSTRUCTS TRUE): Permite denir las sentencias ENDIF sin la condici on.

12.3

Directivas Iterativas

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

14

FOREACH (< variable > < valores >) . . . ENDFOREACH(< variable >) Con la instrucci on FOREACH se puede denir aplicar un conjunto de 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 construcci on para proyectos KDE, y, por tanto, para Qt. 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 m odulo 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 a dirigida les haya servido, y que se animen a utilizar el CMake :-).

16

También podría gustarte