Vous êtes sur la page 1sur 76

Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Introduction CMake et CTest

Anne Cadiou

Laboratoire de Mcanique des Fluides et dAcoustique

Informatique scientifique pour le calcul


cole doctorale
2015-2016

1 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Table des matires

1 Contexte

2 Exemple simple

3 Exemple avec lien

4 Paramtres

5 CTest

6 Conclusion

2 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Table des matires

1 Contexte

2 Exemple simple

3 Exemple avec lien

4 Paramtres

5 CTest

6 Conclusion

3 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Quest ce que cest ?


CMake, CTest, CPack, CDash sont des outils opensource
dvelopps par Kitware (VTK - Visualisation ToolKit) depuis 2001
outils adopts par les dveloppeurs de KDE

CMake est un outil de gestion du processus de compilation


CTest permet de faire des tests unitaires
CPack permet de construire des packages
CDash est un outil dintgration continue

Adopter une mthodologie dintgration continue


Vise lautomatisation des tches (compilation, tests unitaires et
fonctionnels, tests de performances, validation, documentation ...)

4 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Pour faire quoi ?


CMake
aide gnrer le Makefile pour diffrentes plateformes
pour compiler des sources
possde de nombreuses commandes permettant de localiser les
dpendances
recherche de bibliothques
facilite le portage ou la gestion de diffrents compilateurs
permet linterface avec des tests unitaires

CTest/Boost

permet de faire des tests unitaires


tests diffrents du code, permettant den valider une partie
dtermine ou une fonctionnalit particulire
crire avant le code dans la mthodologie Extreme Programming
sutilise avec ou sans CMake

5 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Rfrences

Kitware
http://www.cdash.org/
https://cmake.org/Wiki/CMake
Professional Training Courses, Kitware Lyon
Livre
K. Martin, B. Hoffman, "Mastering CMake" book, Kitware ed.
Liste de discussion
https://cmake.org/mailing-lists/
nombreuses ressources en ligne, par exemple
https://github.com/TheErk/CMake-tutorial
http://sirien.metz.supelec.fr/depot/SIR/TutorielCMake/index.html

6 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Autres outils

Outils gnraux de construction (et packaging)


Autotools, Ant, Scons, ...
suivent une dmarche connue :
./ configure ; make ; make install

pour le dploiement dapplication (une tche complexe)


Outils de dveloppement, suivant une dmarche dintgration continue
Eclipse, Visual Studio, KDevelop ...

Ici on se focalise sur la configuration, la compilation, lexcution de tests


unitaires multi-plateformes dans le cadre dun dveloppement pour le
calcul scientifique

7 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Table des matires

1 Contexte

2 Exemple simple

3 Exemple avec lien

4 Paramtres

5 CTest

6 Conclusion

8 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Projet simple

Programme seul, sans dpendances.


1 # include < iostream >
2
3 int main ()
4 {
5 std :: cout << " Hello , world ! \ n " ;
6 }

Structure du projet

project/
src/
prog.cpp

Objectif : compiler le code, linstaller, le tester.

9 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Compilation manuelle

en utilisant les compilateurs de GNU


cadiou@moon :~/ project / src$ g ++ prog . cpp

Gnration de lexcutable
cadiou@moon :~/ project / src$ ls
cadiou@moon :~/ project / src$ a . out prog . cpp
cadiou@moon :~/ project / src$ ./ a . out
Hello , world !

10 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Cration manuelle dun Makefile

project/
src/
prog.cpp
Makefile
bin/

cadiou@moon :~/ project / src$ make -n


g ++ -c prog . cpp
g ++ -o a . out prog . o
cadiou@moon :~/ project / src$ make
cadiou@moon :~/ project / src$ make install
mv a . out ../ bin /.
cadiou@moon :~/ project / src$ cd ../ bin
cadiou@moon :~/ project / bin$ ./ a . out

11 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Exemple de Makefile
CC = g ++
CLINKER = g ++

OBJS = prog . o

. SUFFIXES : . o . cpp
. cpp . o :
$ ( CC ) -c $ ( CCLAGS ) $ <

EXE = a . out

all : $ ( EXE )

$ ( EXE ) : $ ( OBJS )
$ ( CLINKER ) $ ( LDFLAGS ) -o $@ $ ( OBJS )

clean :
rm -f $ ( OBJS ) $ ( EXE )

install :
mv $ ( EXE ) ../ bin /.

12 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Construction par CMake


project/
src/
prog.cpp
CMakeLists.txt
bin/
CMakeLists.txt

cadiou@moon :~/ project$ mkdir build ; cd build


cadiou@moon :~/ project / build$ ccmake ..
cadiou@moon :~/ project / build$ make
Scanning dependencies of target a . out
[100%] Building CXX object src / CMakeFiles / a . out . dir / prog . o
Linking CXX executable a . out
[100%] Built target a . out
cadiou@moon :~/ project / build$ make install
Install the project ...
-- Install configuration : " Release "
-- Installing : ~/ project / build /../ bin / a . out
13 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

CMakeLists.txt la racine du projet

# cmake version
c m a k e _ m i n i m u m _ r e q u i r e d ( VERSION 2.8.10 FATAL_ERROR )

# define project name and langage


project ( MyProject CXX )

# define executable names


set ( EXE MyProgram )

# define directories
set ( SRC $ { C M A KE _ S O U R C E _ D I R }/ src )

a d d _ s u bd i r e c t or y ( $ { SRC })

14 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

CMakeLists.txt associ aux sources

# set up the source files compilation

# add the source files


set ( SRC
prog . cpp
)

# define the executable in terms of the source files


add_e xecutabl e ( $ { EXE } $ { SRC })

# how to install this executable


install ( TARGETS $ { EXE } RUNTIME DESTINATION bin )

15 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Makefile vs. CMake

Make
main . o : main . c main . h
< TAB > cc -c main . c
MyProgram : main . o
< TAB > cc -o MyProgram main . o - lm - lz

CMake
PROJECT ( MyProject C )
ADD_E XECUTABL E ( MyProgram main . c )
T A R G E T _ L I N K _ L I B R A R I E S ( MyProgram z m )

16 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Pourquoi ne pas se contenter dappeler le compilateur ?

Dans les codes de calculs, la construction de lxecutable est une tche


parfois dlicate. Elle dpend
dun grand nombre de fichiers
avec de nombreuses dpendances
du cas traiter (compilation conditionnelle, ...)
de nombreux lments externes (bibliothques, ...)
et de la manire dont ils sont installs
de la plateforme
de lenvironnement sur le plateforme
La plupart du temps, on ne contrle pas ces dpendances.

17 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Pourquoi ne pas se contenter dcrire un makefile ?


Le makefile ne fait pas tout :
il dpend de la plateforme
il est essentiellement orient sur les OS de type unix
Cest un outils puissant qui peut tre paramtr, mais dans la grande
majorit des cas :
les dpendances doivent tre explicites manuellement
ainsi que la recherche des lments externes
Sur une plateforme donne, les performances peuvent varier suivant
lenvironnement,
le compilateur, ses options (tester, cest refaire les dpendances...)
Dans un makefile, se trouvent explicites la fois les commandes de
construction du code et la manire de le faire sur une plateforme
donne, pour un environnement donn. Le portage est facilit si ces deux
tapes sont spares.

18 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Table des matires

1 Contexte

2 Exemple simple

3 Exemple avec lien

4 Paramtres

5 CTest

6 Conclusion

19 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Projet parallle
Programme appelant la bibliothque MPI
1 # include < mpi .h >
2 # include < iostream >
3
4 int main ( int argc , char * argv [])
5 {
6 MPI :: Init ( argc , argv ) ;
7
8 int rank = MPI :: COMM_WORLD . Get_rank () ;
9 int size = MPI :: COMM_WORLD . Get_size () ;
10
11 std :: cout << " Process " << rank << " / " << size << " says
Hello , world ! \ n " ;
12
13 MPI :: Finalize () ;
14 return 0;
15 }

Mme structure du projet que prcdemment

20 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Compilation manuelle

en utilisant les compilateurs de GNU


cadiou@moon :~/ project / src$ mpicxx prog . cpp

Gnration de lexcutable
cadiou@moon :~/ project / src$ ls
cadiou@moon :~/ project / src$ a . out prog . cpp
cadiou@moon :~/ project / src$ ./ a . out
cadiou@moon :~/ project / src$ mpirun - np 4 a . out
Process 1/4 says Hello , world !
Process 2/4 says Hello , world !
Process 3/4 says Hello , world !
Process 0/4 says Hello , world !

21 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Cration manuelle dun Makefile

project/
src/
prog.cpp
Makefile
bin/

cadiou@moon :~/ project / src$ make -n


mpicxx -c prog . cpp
mpicxx -o a . out prog . o - lmpi
cadiou@moon :~/ project / src$ make
cadiou@moon :~/ project / src$ make install
mv a . out ../ bin /.
cadiou@moon :~/ project / src$ cd ../ bin
cadiou@moon :~/ project / bin$ ./ a . out

22 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Exemple de Makefile
. SUFFIXES :
. SUFFIXES : . cpp . o

CXX = mpicxx
CXXFLAGS =
LDFLAGS = - lmpi

EXE = a . out

SRC = \
prog . cpp
OBJ = $ ( SRC :. cpp =. o )

. cpp . o :
$ ( CXX ) $ ( CXXFLAGS ) -c $ <

all : $ ( EXE )
$ ( EXE ) : $ ( OBJ )
$ ( CXX ) -o $@ $ ^ $ ( LDFLAGS )
clean :
rm -f $ ( OBJ ) $ ( EXE ) core
install :
mv $ ( EXE ) ../ bin /.
23 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Construction par CMake


project/
src/
prog.cpp
CMakeLists.txt
bin/
CMakeLists.txt

cadiou@moon :~/ project$ mkdir build ; cd build


cadiou@moon :~/ project / build$ ccmake ..
cadiou@moon :~/ project / build$ make
Scanning dependencies of target a . out
[100%] Building CXX object src / CMakeFiles / a . out . dir / prog . o
Linking CXX executable a . out
[100%] Built target a . out
cadiou@moon :~/ project / build$ make install
Install the project ...
-- Install configuration : " Release "
-- Installing : ~/ project / build /../ bin / a . out
24 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

CMakeLists.txt la racine du projet

# cmake version
c m a k e _ m i n i m u m _ r e q u i r e d ( VERSION 2.8.10 FATAL_ERROR )

# define project name and langage


project ( MyProject CXX )

# MPI
find_package ( MPI REQUIRED )
i n c l u d e _ d i r e c t o r i e s ( $ { M P I_ I N C L U D E _ P A T H })
set ( INCLUDE $ { M P I _ I N C L U D E _ P A T H })

# define executable names


set ( EXE MyProgram )

# define directories
set ( SRC $ { C M A KE _ S O U R C E _ D I R }/ src )

a d d _ s u bd i r e c t or y ( $ { SRC })

25 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

CMakeLists.txt associ aux sources


# set up the source files compilation

# add the source files


set ( SRC
prog . cpp
)

# define the executable in terms of the source files


add_e xecutabl e ( $ { EXE } $ { SRC })

# add the needed libraries and special compiler flags


s e t _ t a r g e t _ p r o p e r t i e s ( $ { EXE } PROPERTIES
COMPILE_FLAGS " $ { M P I _ C X X _ C O M P I L E _ F L A G S }"
LINK_FLAGS " $ { M P I _ C X X _ L I N K _ F L A G S }")
i n c l u d e _ d i r e c t o r i e s ( $ { M P I _ C X X _ I N C L U D E _ P A T H })
t a r g e t _ l i n k _ l i b r a r i e s ( $ { EXE } $ { M P I _ C X X _ L I B R A R I E S })

# how to install this executable


install ( TARGETS $ { EXE_MPI } RUNTIME DESTINATION bin )

26 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Syntaxe
Configuration dynamique
conf igure_fil e ( config . h . in config . h )

# cmakedefine FOO_VERSION $ { FOO_VERSION }


# cmakedefine B U I L D _ S H A R E D _ L I B S

Dtection de bibliothque
find_package ( BZip2 )
if ( BZIP2_FOUND )
i n c l u d e _ d i r e c t o r i e s ( $ { B Z I P _ I N C L U D E _ D I R S })
t a r g e t _ l i n k _ l i b r a r i e s ( $ { PROJET } $ { BZ IP 2_ LI B RA RI ES })
endif ( BZIP2_FOUND )

find_package ( Doxygen )
find_program ( DOXYPY doxypy )
if ( DOXYGEN_FOUND )
a d d _ s u b d i r e ct o r y ( doc )
endif ( DOXYGEN_FOUND )

27 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Table des matires

1 Contexte

2 Exemple simple

3 Exemple avec lien

4 Paramtres

5 CTest

6 Conclusion

28 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Lancement de CMake

cadiou@moon :~/ project / build$ cmake ..


-- The CXX compiler i dentific ation is GNU 4.8.4
-- 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 : ~/ project / build

29 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Lancement en mode interactif (quasi graphique !)


cadiou@moon :~/ project / build$ ccmake ..

30 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

[c]

31 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

[ c ] [ g ] make

32 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Modifications via linterface


cadiou@moon :~/ project / build$ ccmake ..

33 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

[c]

34 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

[ enter ] Release [ enter ]; [ enter ] .. [ enter ];

35 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

[ c ] [ g ] make

36 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Modifications en ligne de commande


cadiou@moon :~/ project / build$ ccmake - D C M A K E _ B U I L D _ T Y P E =
Release - D C M A K E _ I N S T A L L _ P R E F I X =.. ..

37 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

[ c ] [ g ] make

38 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Contenu du rpertoire build

project/build/
CMakeCache.txt
CMakeFiles/
cmake_install.cmake
Makefile
src/
CMakeFiles/
cmake_install.cmake
Makefile

Fichier CMakeCache.txt gnr lors de la construction


Contient lensemble des variables par dfaut, et les dpendances internes

39 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Aperu du CMakeCache.txt
########################
# EXTERNAL cache entries
########################

// CXX compiler .
C M A K E _ CX X _ C O M P I L E R : FILEPATH =/ usr / bin / c ++

// Flags used by the compiler during all build types .


C MA KE _C X X_ FL AG S : STRING =

// Flags used by the compiler during debug builds .


C M A K E _ C X X _ F L A G S _ D E B U G : STRING = - g

// Flags used by the compiler during release minsize builds .


C M A K E _ C X X _ F L A G S _ M I N S I Z E R E L : STRING = - Os - DNDEBUG

// Flags used by the compiler during release builds (/ MD / Ob1


/ Oi
// / Ot / Oy / Gs will produce slightly less optimized but
smaller
// files ) .
C M A K E _ C X X _ F L A G S _ R E L E A S E : STRING = - O3 - DNDEBUG
40 / 76
// Flags used by the compiler during Release with Debug Info
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Configuration : variables principales du cache

La configuration met jour les variables du cache, listes dans le fichier


CMakeCache.txt
Type de lexcutable
C M AK E _ B U I L D _T Y P E =[ Debug , Release ]

Rpertoire dinstallation
C M A K E _ I N S T A L L _ P R E F I X =[/ usr / local , C :\ Program Files ]

Production de blibliothque statique ou dynamique


C M A K E _ S H A R E D _ L I B S =[ OFF , ON ]

Visualisation du Makefile
C M A K E _ V E R B O S E _ M A K E F I L E = ON

41 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Paramtres pr-dfinis dans le CMakeLists.txt


# cmake version
c m a k e _ m i n i m u m _ r e q u i r e d ( VERSION 2.8.10 FATAL_ERROR )

if ( DEFINED C M A K E _ B U I L D _ T Y P E )
set ( CM A K E _ B U I L D _ T YP E $ { C M A K E _ B U I L D _ T Y P E } CACHE STRING "
Choose the type of build , options are : None Debug
Release RelW ithDebIn fo MinSizeRel .")
else ()
set ( CM A K E _ B U I L D _ T YP E Debug CACHE STRING " Choose the type
of build , options are : None Debug Release Rel WithDebI nfo
MinSizeRel .")
endif ()

# define project name and langage


project ( MyProject CXX )

# define executable names


set ( EXE MyProgram )

# define directories
set ( SRC $ { C M A KE _ S O U R C E _ D I R }/ src )
a d d _ s u bd i r e c t or y ( $ { SRC })
42 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Action...
cadiou@moon :~/ project / build$ ccmake ..

43 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

... modifications en ligne de commande


cadiou@moon :~/ project / build$ ccmake - D C M A K E _ B U I L D _ T Y P E =
Release - D C M A K E _ I N S T A L L _ P R E F I X =.. ..

44 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Modification de la variable dinstallation

Par dfaut
C M A K E _ I N S T A L L _ P R E F I X =/ usr / local

dfini en chemin absolu


Dfinir une variable spcifique, pr-dfinie, modifiable en ligne de
commande, par exemple en ajoutant
set ( M Y _ O W N _ I N S T A L L _ P R E F I X ".." CACHE PATH " Prefix prepended
to install directories ")
SET ( C M A K E _ I N S T A L L _ P R E F I X " $ { M Y _ O W N _ I N S T A L L _ P R E F I X }" CACHE
INTERNAL " Prefix prepended to install directories " FORCE
)

dans le fichier CMakeLists.txt du projet.

45 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Action...
cadiou@moon :~/ project / build$ ccmake ..

46 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

... en ligne de commande


cadiou@moon :~/ project / build$ ccmake - D M Y _ O W N _ I N S T A L L _ P R E F I X =
other ..

47 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Liste des paramtres


cadiou@moon :~/ project / build$ ccmake ..
[t]

48 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

49 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Compilation conditionnelle

1 # include < iostream >


2
3 int main ()
4 {
5 # ifdef NL
6 std :: cout << " Hoi , wereld ! \ n " ;
7 # elif TK
8 std :: cout << " Selam Dnya ! \ n " ;
9 # else
10 std :: cout << " Hello , world ! \ n " ;
11 # endif
12 }

50 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Compilation manuelle

cadiou@moon :~/ project / src$ g ++ prog . cpp


cadiou@moon :~/ project / src$ ./ a . out
Hello , world !

cadiou@moon :~/ project / src$ g ++ - DTK prog . cpp


cadiou@moon :~/ project / src$ ./ a . out
Selam Dnya !

51 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

avec CMake
Ajouter un test
# parameters
include ( CMakeFunction . txt )
option ( MULTI_LANG " Multiple language " OFF )
set ( LanguageVal ues " anglais ")
if ( MULTI_LANG )
set ( Lan guageVal ues " anglais ; turc ; neerlandais " CACHE STRING
" List of possible languages ")
choice ( Language " $ { La nguageVa lues }" " Language chosen by
the user at
CMake configure time ")
endif ()
message ( STATUS " Language = $ { Language } ")

if (" $ { Language }" STREQUAL " turc ")


a dd _d ef i ni ti on s ( - DTK )
endif ()
if (" $ { Language }" STREQUAL " neerlandais ")
a dd _d ef i ni ti on s ( - DNL )
endif ()

52 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Fonction pour slectionner un choix

function ( choice varname choices documentation )


if (" $ { varname }" STREQUAL "" OR " $ { choices }" STREQUAL "")
message ( FATAL_ERROR " choice function requires varname
and choices values ")
endif ()

set ( default_index $ { ARGV3 })


if ( NOT default_index )
set ( default_index 0)
endif ()

list ( GET choices $ { default_index } default_value )

set ( $ { varname } $ { default_value } CACHE STRING $ {


documentation })
set_property ( CACHE $ { varname } PROPERTY STRINGS $ { choices })
endfunction ()

53 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Exemple
cadiou@moon :~/ project / build$ ccmake ..

54 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

55 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

56 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

57 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

58 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

59 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Remarques

Construire un excutable via CMake savre utile dans le cas de


projet avec de nombreuses dpendances, de nombreuses options,
ventuellement en compilation conditionnelle.
CMake facilite le portage multi-plateformes en dcouplant les
sources, les instructions de construction et la ralisation de
lexcutable.
Sur une mme plateforme, cela facilite la construction de diffrents
excutables, suivant les compilateurs disponibles ou les options
applicatives souhaites par lutilisateur.
CTest permet lautomatisation des tests unitaires au moment de la
construction.

60 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Table des matires

1 Contexte

2 Exemple simple

3 Exemple avec lien

4 Paramtres

5 CTest

6 Conclusion

61 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

CTest

CTest utilise le mme fichier CMakeLists.txt


(comme les tests dfinis dans le Makefile)

CTest organise la vrification des tests unitaires. Il permet de retourner


la valeur 0 lorsque le test est effectu avec succs et renvoie une autre
information dans le cas contraire. Le programme test peut tre
un binaire
un script
...
Raliser des tests unitaires participe dune dmarche dintgration
continue et permet de valider la non-rgression du code au cours des
dveloppements. Ils doivent tre conus avant lintgration dans le code.

62 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Syntaxe
Se rajoute aisment au fichier CMakeLists.txt
ENABL E_TESTIN G ()

ADD_TEST ( testname te stexecuta ble args )

project/
src/
prog.cpp
test/
prog_syntaxe.cpp
ref_test_uk.log
test_uk.sh

63 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Exemple

Teste la conformit des rsultats sur un cas simple.

Modification du code :
1 # include < iostream >
2
3 int main ()
4 {
5 std :: cout << " Hello , word !\ n " ;
6 }

Le rsultat est-il modifi par cette volution du code ?

64 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

CMakeLists.txt la racine du projet

# cmake version
c m a k e _ m i n i m u m _ r e q u i r e d ( VERSION 2.8.10 FATAL_ERROR )

# define project name and langage


project ( MyProject CXX )
include ( CTest )
enabl e_testin g ()

# define executable names


set ( EXE MyProgram )

# define directories
set ( SRC $ { C M A KE _ S O U R C E _ D I R }/ src )
set ( TESTS $ { C M A K E _ S O U R C E _ DI R }/ test )
a d d _ s u bd i r e c t or y ( $ { SRC })
a d d _ s u bd i r e c t or y ( $ { TESTS })

65 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

CMakeLists.txt associ aux sources

# set up the source files compilation

# add the source files


set ( SRC
prog . cpp
)

# define the executable in terms of the source files


add_e xecutabl e ( $ { EXE } $ { SRC })

# how to install this executable


install ( TARGETS $ { EXE } RUNTIME DESTINATION bin )

66 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

CMakeLists.txt associ aux tests (1/2)


# set up the source files compilation

# add the source files


set ( TEST_FILES
test_uk . sh
ref_test_uk . log
)

# copy into build directory


foreach ( file $ { TEST_FILES })
a d d _ c u s t o m _ c o m m a n d (#
OUTPUT " $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R }/ $ { file }"
COMMAND cmake -E copy " $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R }/ $ { file
}" " $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R }/ $ { file }"
DEPENDS " $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R }/ $ { file }"
)
list ( APPEND file_dest " $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R }/ $ { file
}")
endforeach ( file )

67 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

CMakeLists.txt associ aux tests (2/2)

# define the executable in terms of the source files


add_e xecutabl e ( test_syntaxe prog_syntaxe . cpp )
s e t _ t a r g e t _ p r o p e r t i e s ( test_syntaxe PROPERTIES
L IN KE R_ LA N GU AG E CXX )

# add test
a d d _ c u st o m _ t a r g e t ( test_uk . sh ALL DEPENDS $ { file_dest })

add_test ( NAME test_syntaxe COMMAND ./ test_syntaxe )

add_test ( NAME test_uk COMMAND ./ test_uk . sh )

68 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

CMake/CTest

cadiou@moon :~/ project$ mkdir build ; cd build


cadiou@moon :~/ project / build$ ccmake ..
cadiou@moon :~/ project / build$ make
canning dependencies of target MyProgram
[ 33%] Building CXX object src / CMakeFiles / MyProgram . dir / prog
. cpp . o
Linking CXX executable MyProgram
[ 33%] Built target MyProgram
Scanning dependencies of target test_syntaxe
[ 66%] Building CXX object test / CMakeFiles / test_syntaxe . dir /
prog_syntaxe . cpp . o
Linking CXX executable test_syntaxe
[ 66%] Built target test_syntaxe
Scanning dependencies of target test_uk . sh
[100%] Generating test_uk . sh
[100%] Built target test_uk . sh
cadiou@moon :~/ project / build$ make test

69 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Tests valids (programme inchang)

cadiou@moon :~/ project / build$ make test


Running tests ...
Test project ~/ project / build
Start 1: test_syntaxe
1/2 Test #1: test_syntaxe . . . . . . . . . . . . . . . . . . . . . Passed
0.00 sec
Start 2: test_uk
2/2 Test #2: test_uk . . . . . . . . . . . . . . . . . . . . . . . . . . Passed
0.01 sec

100% tests passed , 0 tests failed out of 2

Total Test time ( real ) = 0.01 sec

70 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

... avec les modifications du programme

cadiou@moon :~/ project / build$ make test


Running tests ...
Test project ~/ project / build
Start 1: test_syntaxe
1/2 Test #1: test_syntaxe . . . . . . . . . . . . . . . . . . . . . Passed
0.00 sec
Start 2: test_uk
2/2 Test #2: test_uk . . . . . . . . . . . . . . . . . . . . . . . . . . * * * Failed
0.01 sec

50% tests passed , 1 tests failed out of 2

Total Test time ( real ) = 0.01 sec

The following tests FAILED :


2 - test_uk ( Failed )
Errors while running CTest

71 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Contenu du rpertoire build


project/build/
CMakeCache.txt
CMakeFiles/
cmake_install.cmake
CTestTestfile.cmake
DartConfiguration.tcl
Makefile
src/
test/
Testing/
Temporary/
CTestCostData.txt
LastTestsFailed.log
LastTest.log
72 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Contenu du rpertoire build


command : "~/ project / build / test / test_uk . sh "
Directory : ~/ project / build / test
" test_uk " start time : Mar 09 10:30 CET
Output :
----------------------------------------------------------
run test uk ...
1 c1
< Hello , world !
---
> Hello , word !
... done
< end of output >
Test time = 0.01 sec
----------------------------------------------------------
Test Failed .
" test_uk " end time : Mar 09 10:30 CET
" test_uk " time elapsed : 00:00:00
----------------------------------------------------------

End testing : Mar 09 10:30 CET

73 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Remarques

Les programmes de test sont diffrents du code.


Ils peuvent tre crits dans un autre langage.
Ils servent vrifier et valider le code.
Ils est prfrable de les crire (ou tout au moins les concevoir) avant
le dveloppement prvu.
Ils peuvent tester une application du code sur un cas simple, pour
vrifier la conformit du rsultat, la vitesse dexcution, etc.
Les tests archivent les rsultats de rference.

74 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Table des matires

1 Contexte

2 Exemple simple

3 Exemple avec lien

4 Paramtres

5 CTest

6 Conclusion

75 / 76
Contexte Exemple simple Exemple avec lien Paramtres CTest Conclusion

Conclusion

CMake/CTest sont des alternatives intressantes aux Makefiles

La construction de lexcutable ninterfre pas avec les sources (il est


facile dexclure le rpertoire build dun suivi sous git par exemple)
Dans le cadre de dveloppements pour une application de calcul
scientifique, il est souvent intressant dadopter une dmarche agile,
impliquant au minimum une automatisation des tapes suivantes :
un suivi des versions
une mthode de construction de lexcutable facilitant le portage par
la recherche automatique des dpendances
une mthode dintgration continue validant la non-rgression du
code, orient sur les applications

76 / 76

Vous aimerez peut-être aussi