Le but de cette présentation est de découvrir les outils de construction d’applications dans le contexte d’un laboratoire de recherche : autoconf, cmake, scons
1. ENVOL - Outils de construction
formation pour le dEveloppemeNt et la ValOrisation des Logiciels en
environnement de recherche
Organisation par le projet PLUME et les reseaux Calcul et DevLog
Johan Moreau
IRCAD
27 septembre 2010
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 1 / 98
2. Le document :
Cette presentation a ete faite avec des outils opensource et libre dans
le but de presenter des outils de construction d'applications eux-aussi
opensource.
N'hesitez pas a m'envoyer vos remarques ou corrections sur
johan.moreau sur gmail.com
Ce document est distribue sous licence Creative Commons
Attribution-ShareAlike 2.0
La session :
Des sequences de slides emmelees avec des exemples de codes
Des questions (et je l'espere des reponses) a tout moment
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 2 / 98
3. Sommaire
Sommaire
Le but de cette presentation est de decouvrir les outils de construction
d'applications dans le contexte d'un laboratoire de recherche.
1. La construction d'application
2. Les GNU Autotools
3. CMake
4. SCons
5. QMake, MSBuild, Ant, Maven, ...
Conclusion
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 3 / 98
4. La construction d'application
1. La construction d'application
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 4 / 98
6. le
Les limitations et les solutions
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 5 / 98
7. La construction d'application Quelques rappels ...
Les processus de construction simple
On parle ici des logiciels permettant d'automatiser (ordonnancer et piloter)
l'ensemble des actions (preprocesseur, compilation, editions des liens, etc.)
contribuant, a partir de donnees sources, a la production d'un (ensemble)
logiciel.
Les termes anglais sont Software Build1 ou Build automation2.
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 6 / 98
8. La construction d'application Quelques rappels ...
Preprocesseur 3
Il s'agit d'une etape permettant des transformations sur un code
source.
Dans le monde C/C++, la commande du preprocesseur la plus
repandue est include qui a pour but de recopier le contenu du
9. chier
indique en param^etre. (A noter la dierence avec les package en
java, import en Python et co)
On peut aussi utiliser le preprocesseur pour faire des macros via
de
10. ne en C/C++ par exemple, de compilation conditionnelle, de la
meta-programmation, etc ...
A noter que les conventions de codage demande souvent de limiter
l'usage du preprocesseur (retours d'erreurs du compilateur)
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 7 / 98
11. La construction d'application Quelques rappels ...
Compilation 5
Il s'agit d'une etape traduisant un code d'un langage vers du code en
langage machine (reel ou virtuel)
Le langage machine est soit directement interprete par la machine soit
interprete par une machine virtuelle4. Dans ce dernier cas on peut
citer Java ou DotNet.
Les phases (traditionelles) :
analyses lexicale, syntaxique puis semantique,
generation du code intermediaire puis optimisation,
generation du code objet
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 8 / 98
12. La construction d'application Quelques rappels ...
Edition des liens 6
L'edition des liens est un processus qui permet de creer des
14. chiers objets.
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 9 / 98
15. La construction d'application Quelques rappels ...
Un peu de compilation donc ... Exemple en C sous UNIX
Il faut deja organiser un peu ses
16. chiers, par exemple
Pour C/C++, speration des declarations et implementations
Pour Java, regroupement par package
...
Ensuite organiser son code :
#ifdef DEBUG pour C par exemple (a activer sur la ligne de
commande : gcc -DDEBUG=1
17. chier.c)
Pour Java, regroupement par package
...
cc : Supprime les commentaires, eectue les inclusions et les
macros,...
cc1 : Converti le code C en assembleur
as : Assemblage des
22. xe et standard et donc totalement automatisable !
Mais en realite :
Plusieurs langages avec chacun ses speci
23. cites
Des variantes dans les langages (gtk vs Qt par exemple)
Problemes du multiplateforme/architecture/distribution
Grand nombre de
24. chiers et de cibles
Il faut des outils pour assister le developpeur dans cette phase.
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 11 / 98
25. La construction d'application Quelques rappels ...
La construction d'applications C/C++
Cette presentation n'illustrera que les principes les plus courants de la
construction d'applications C/C++
On ne parlera que tres peu des systemes embarques dans les IDE
On laissera les problemes lies aux compilateurs de c^otes
On ne parlera que tres peu des outils/besoins post-compilation (test
unitaires, packaging, etc ...)
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 12 / 98
27. n des annees 70, les programmes etaient petits.
En 1977, le Dr Stuart I Feldman (Bell Labs) invente l'outil Make
L'outil rencontre un succes immediat.
En 1997, Peter Miller ecrit l'article : Recursive Make Considered
Harmful7.
Depuis de nombreux outils essayent d'ameliorer de processus 8.
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 13 / 98
32. le est compose de plusieurs regles de la forme :
cible : dependances
TAB commandes
cible : dependances
TAB commandes
Chaque commande est precedee d'une tabulation :
Make
33. le
prog : main.o functions .o
gcc o prog main.o functions .o
main.o : main.c functions .h
gcc c main.c
functions .o : functions .c functions .h
gcc c functions .c
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 14 / 98
35. le
Les evaluations de regles
Lors de l'utilisation de la commande make cible
Evaluation de la regle dont la cible est passee en argument a make
Evaluation de la premiere regle rencontree (s'il n'y a pas d'argument)
Les dependances sont analysees
Si une dependance n'est pas a jour on tente de la resoudre
Si cette dependance est cible d'une autre regle du Make
36. le alors cette
regle est a son tour evaluee
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 15 / 98
42. le
Les variables
Declaration de variables via NOM=VALEUR. Les variables traditionnelles :
CFLAGS : options du compilatuer C (CXXFLAGS pour C++)
LDFLAGS : options de l'editeur de liens
...
Les variables internes :
$@ : la cible
$ : la 1ere dependance
$^ : la liste des dependances
$* : le nom de la cible sans suxe
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 17 / 98
44. le
Et plus encore ...
Les conditionnelles :
ifeq .... else .... endif
La recherche de dependances :
Utilisation de la variable VPATH/vpath (VPATH = src :../headers)
Les appels imbriques :
cd $(SRC DIR) $(MAKE) $@
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 18 / 98
45. La construction d'application Les limitations et les solutions
Quels reproches au Make ancestral ?
Pas vraiment portable/multiplateforme : base sur des scripts shell et
des proprietes du systeme de
46. chiers. De plus les evolutions des
descandants (GNU Make, ...) ont des implementations particulieres
pour les fonctions manquantes (if-then-else par exemple).
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 19 / 98
47. La construction d'application Les limitations et les solutions
Quels reproches au Make ancestral ?
Pas vraiment portable/multiplateforme : base sur des scripts shell et
des proprietes du systeme de
48. chiers. De plus les evolutions des
descandants (GNU Make, ...) ont des implementations particulieres
pour les fonctions manquantes (if-then-else par exemple).
Diculte a monter en charge : L'evolution du code qui est necessaire
dans les gros projets s'articule souvent autour de changement
d'arborescence ou de renommage de partie de code. Ceci entraine de
nombreux changements manuels dans les Make
49. le.
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 19 / 98
50. La construction d'application Les limitations et les solutions
Quels reproches au Make ancestral ?
Pas vraiment portable/multiplateforme : base sur des scripts shell et
des proprietes du systeme de
51. chiers. De plus les evolutions des
descandants (GNU Make, ...) ont des implementations particulieres
pour les fonctions manquantes (if-then-else par exemple).
Diculte a monter en charge : L'evolution du code qui est necessaire
dans les gros projets s'articule souvent autour de changement
d'arborescence ou de renommage de partie de code. Ceci entraine de
nombreux changements manuels dans les Make
53. le ajoute une complexite qui n'a pas de raison
d'^etre. De plus il est relativement limite.
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 19 / 98
54. La construction d'application Les limitations et les solutions
Quels reproches au Make ancestral ?
Pas vraiment portable/multiplateforme : base sur des scripts shell et
des proprietes du systeme de
55. chiers. De plus les evolutions des
descandants (GNU Make, ...) ont des implementations particulieres
pour les fonctions manquantes (if-then-else par exemple).
Diculte a monter en charge : L'evolution du code qui est necessaire
dans les gros projets s'articule souvent autour de changement
d'arborescence ou de renommage de partie de code. Ceci entraine de
nombreux changements manuels dans les Make
59. cielles.
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 19 / 98
60. La construction d'application Les limitations et les solutions
Quels reproches au Make ancestral ?
Pas vraiment portable/multiplateforme : base sur des scripts shell et
des proprietes du systeme de
61. chiers. De plus les evolutions des
descandants (GNU Make, ...) ont des implementations particulieres
pour les fonctions manquantes (if-then-else par exemple).
Diculte a monter en charge : L'evolution du code qui est necessaire
dans les gros projets s'articule souvent autour de changement
d'arborescence ou de renommage de partie de code. Ceci entraine de
nombreux changements manuels dans les Make
65. cielles.
Il n'y pas de systeme de detection implicite de dependances
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 19 / 98
66. La construction d'application Les limitations et les solutions
Ce qui a change aussi ...
Precedement :
Compiler votre code
Faire la liaison avec les librairies (statiques/dynamiques)
Distribuer sous forme de sources ou de binaires
Maintenant, en plus :
Executer les tests unitaires (voir fonctionnels)
Faire un Installeur (msi, deb, rpm, installshield, ...)
Gerer les problematiques d'internationalisation
Generer la documentation developpeur et utilisateur, les metriques, ...
A ceci s'ajoute une tendance depuis 2000 : l'integration continue
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 20 / 98
70. cations ne produit pas de regression du logiciel (donc l'executable,
mais aussi la documentation, les metriques, ...)
Ceci implique donc une construction
rapide
exible
standardisee (un minimum d'outils)
identique pour toutes les cibles (OS, architecture, ...)
A partir de la, nous pouvons imaginer la production de livrables, de
versions journalieres(nightly build), des deploiements automatiques, la
generation automatique de l'historique (release notes), etc ...
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 21 / 98
71. La construction d'application Les limitations et les solutions
Evolution forte au milieu des annees 90
Apparition des methodes agiles
Developpement du marche Web
Augmentation des langages et plateformes
Croissance de l'opensource
L'ensemble de ces facteurs pousse a avoir un systeme optimum pour la
construction d'application.
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 22 / 98
72. La construction d'application Les limitations et les solutions
Vraiment un probleme nouveau ?
Debut des annees 90 :
imake pour XFree86
Cygnus et les gcc con
73. gure script pour les outils GNU
autoconf
C'est cette derniere initiative qui f^ut la bonne.
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 23 / 98
74. La construction d'application Les limitations et les solutions
La reponse du monde libre
Creation d'autoconf en 1991 par David J. MacKenzie : apparition du
script con
79. n, 1994-09-19 First CVS commit11
Le choix qui a ete fait ici a ete de s'appuyer sur les fonctionnalites
presentes sur le systeme en les testant (la partie con
80. gure), d'utiliser des
outils de construction traditionnels (make, ...) et d'installer le produit de la
compilation suivant des standards.
De plus, il n'y aucun lien avec les environnements de travail des
developpeurs (IDE).
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 24 / 98
81. La construction d'application Les limitations et les solutions
Les autres reponses qui ont suivies
Ant, http://ant.apache.org
CMake, http://www.cmake.org
Jam/BJam, http://www.perforce.com/jam/jam.html
Maven, http://maven.apache.org
MSBuild, http://http://en.wikipedia.org/wiki/MSBuild
Qmake, http://en.wikipedia.org/wiki/Qmake
Scons, http://www.scons.org
Sconspiracy, http://code.google.com/p/sconspiracy
Waf, http://code.google.com/p/waf
Attention au syndrome du NIH : Not Invented Here 12
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 25 / 98
82. La construction d'application Les limitations et les solutions
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 26 / 98
83. GNU Autotools
2. GNU Autotools
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 27 / 98
84. GNU Autotools
Sommaire
GNU Autotools
Les bases de GNU Autotools
GNU Autotools dans le detail
La gestion des bilbiotheques
Conclusion
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 28 / 98
85. GNU Autotools Les bases de GNU Autotools
Les references
Les sources d'informations qui ont ete utilisees pour cette partie :
http ://www.gnu.org/software/autoconf/
http ://en.wikipedia.org/
http ://sourceware.org/autobook/
http ://www.lrde.epita.fr/ adl/autotools.html
http ://www.infres.enst.fr/ dax/polys/con
87. GNU Autotools Les bases de GNU Autotools
GNU Autotools
Licence GPL, cree en 1992
Ecrit en shell + m4
Combinaison d'outils
Generation automatique de make
92. GNU Autotools Les bases de GNU Autotools
GNU Autotools, un ensemble d'outils
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 31 / 98
98. gure
Lancement de make
Lnacement de make install
Bon allez, on se lance...
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 32 / 98
99. GNU Autotools Les bases de GNU Autotools
Notre petit Hello World
src/main.c
#include stdio.h
int main(int argc, char* argv [])
f
printf (Hello Worldnn);
return 0;
g
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 33 / 98
149. cations pour les compilateurs
AC_PROG_SED, AC_PROG_YACC, AC_PROG_LEX, ...
Veri
150. cations pour les utilitaires
AC_CHECK_PROGS(VAR, PROGS, [VAL-IF-NOT-FOUND])
VAR est positionne sur le 1er PROGS trouve, si rien n'est trouve alors
VAL-IF-NOT-FOUND.
AC_CHECK_PROGS([TAR], [tar gtar], [:])
if test $TAR = :; then
AC_MSG_ERROR([Ce paquet a besoin de tar.])
fi
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 37 / 98
151. GNU Autotools GNU Autotools dans le detail
Les macros utiles dans autoconf
AC_MSG_ERROR(ERROR-DESCRIPTION, [EXIT-STATUS])
Ache ERROR-DESCRIPTION (con
152. g.log) et arr^ete `configure'.
AC_MSG_WARN(ERROR-DESCRIPTION)
Pareil, mais n'arr^ete pas
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 38 / 98
153. GNU Autotools GNU Autotools dans le detail
Les macros utiles dans autoconf
AC_MSG_ERROR(ERROR-DESCRIPTION, [EXIT-STATUS])
Ache ERROR-DESCRIPTION (con
154. g.log) et arr^ete `configure'.
AC_MSG_WARN(ERROR-DESCRIPTION)
Pareil, mais n'arr^ete pas
AC_DEFINE(VARIABLE, VALUE, DESCRIPTION)
Ajoute les informations dans con
155. g.h.
/* DESCRIPTION */
#define VARIABLE VALUE
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 38 / 98
156. GNU Autotools GNU Autotools dans le detail
Les macros utiles dans autoconf
AC_MSG_ERROR(ERROR-DESCRIPTION, [EXIT-STATUS])
Ache ERROR-DESCRIPTION (con
157. g.log) et arr^ete `configure'.
AC_MSG_WARN(ERROR-DESCRIPTION)
Pareil, mais n'arr^ete pas
AC_DEFINE(VARIABLE, VALUE, DESCRIPTION)
Ajoute les informations dans con
158. g.h.
/* DESCRIPTION */
#define VARIABLE VALUE
AC_SUBST(VARIABLE, [VALUE])
Fixe $(VARIABLE) comme VALUE dans Make
159. le.
AC_SUBST([FOO], [foo]) FOO=foo
AC_SUBST([FOO])
AC_SUBST([FOO])
FOO=foo
Les 3 ecritures sont equivalentes
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 38 / 98
161. cation pour les bibliotheques
AC_CHECK_LIB(LIBRARY, FUNCT, [ACT-IF-FOUND], [ACT-IF-NOT])
Veri
162. e si la LIBRARY existe et si elle contient FUNCT. Si oui, execute
ACT-IF-FOUND sinon ACT-IF-NOT.
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 39 / 98
164. cation pour les bibliotheques
AC_CHECK_LIB(LIBRARY, FUNCT, [ACT-IF-FOUND], [ACT-IF-NOT])
Veri
165. e si la LIBRARY existe et si elle contient FUNCT. Si oui, execute
ACT-IF-FOUND sinon ACT-IF-NOT.
AC_CHECK_LIB([efence], [malloc], [EFENCELIB=-lefence])
AC_SUBST([EFENCELIB])
$(EFENCELIB) pourra ^etre utilise plus tard
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 39 / 98
168. e la presence de HEADERS et positionne #define
HAVE_HEADER_H pour chacun.
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 40 / 98
171. e la presence de HEADERS et positionne #define
HAVE_HEADER_H pour chacun.
AC_CHECK_HEADERS([sys/param.h unistd.h])
AC_CHECK_HEADERS([wchar.h])
#de
175. e la presence de HEADERS et positionne #define
HAVE_HEADER_H pour chacun.
AC_CHECK_HEADERS([sys/param.h unistd.h])
AC_CHECK_HEADERS([wchar.h])
#de
176. ne HAVE_SYS_PARAM_H, HAVE_UNISTD_H, and HAVE_WCHAR_H.
#if HAVE UNISTD H
# include unistd.h
#endif
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 40 / 98
179. e la presence de HEADERS et positionne #define
HAVE_HEADER_H pour chacun.
AC_CHECK_HEADERS([sys/param.h unistd.h])
AC_CHECK_HEADERS([wchar.h])
#de
180. ne HAVE_SYS_PARAM_H, HAVE_UNISTD_H, and HAVE_WCHAR_H.
#if HAVE UNISTD H
# include unistd.h
#endif
AC_CHECK_HEADER(HEADER, [ACT-IF-FOUND], [ACT-IF-NOT])
Utile pour veri
181. er uniquement les ent^etes (sans les DEFINE)
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 40 / 98
185. le.am
bin_PROGRAMS = hello
hello_SOURCES = main.c
SUBDIRS pour les sous-repertoire a prendre en compte
bin PROGRAMS executable a generer (a separer par des espaces)
target SOURCES ....
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 41 / 98
186. GNU Autotools GNU Autotools dans le detail
La declaration des cibles
Make
187. le.am
lieu_TYPE =
cibles ...
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 42 / 98
188. GNU Autotools GNU Autotools dans le detail
La declaration des cibles
Make
189. le.am
lieu_TYPE =
cibles ...
les cibles seront construites
commes (TYPE)
_PROGRAMS
_LIBRARIES
_LTLIBRARIES
_HEADERS
_SCRIPTS
_DATA
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 42 / 98
190. GNU Autotools GNU Autotools dans le detail
La declaration des cibles
Make
191. le.am
lieu_TYPE =
cibles ...
les cibles seront installees dans
(lieu)
bin_ $(bindir)
lib_ $(libdir)
les cibles seront construites
commes (TYPE)
_PROGRAMS
_LIBRARIES
_LTLIBRARIES
_HEADERS
_SCRIPTS
_DATA
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 42 / 98
192. GNU Autotools La gestion des bibliotheques
Les bibliotheques
Ajouter AC_PROG_RANLIB dans con
193. gure.ac.
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 43 / 98
194. GNU Autotools La gestion des bibliotheques
Les bibliotheques
Ajouter AC_PROG_RANLIB dans con
202. le.am
lib_LIBRARIES = libfoo.a libbar.a
libfoo_a_SOURCES = foo.c privfoo.h
libbar_a_SOURCES = bar.c privbar.h
include_HEADERS = foo.h bar.h
Ces bibliotheques seront installees dans $(libdir).
Le nom des bilbiotheques doivent correspondre a lib*.a.
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 43 / 98
203. GNU Autotools La gestion des bibliotheques
Les bibliotheques
Ajouter AC_PROG_RANLIB dans con
205. le.am
lib_LIBRARIES = libfoo.a libbar.a
libfoo_a_SOURCES = foo.c privfoo.h
libbar_a_SOURCES = bar.c privbar.h
include_HEADERS = foo.h bar.h
Ces bibliotheques seront installees dans $(libdir).
Le nom des bilbiotheques doivent correspondre a lib*.a.
Les ent^etes publiques seront installees dans $(includedir).
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 43 / 98
206. GNU Autotools La gestion des bibliotheques
Les bibliotheques
Ajouter AC_PROG_RANLIB dans con
208. le.am
lib_LIBRARIES = libfoo.a libbar.a
libfoo_a_SOURCES = foo.c privfoo.h
libbar_a_SOURCES = bar.c privbar.h
include_HEADERS = foo.h bar.h
Ces bibliotheques seront installees dans $(libdir).
Le nom des bilbiotheques doivent correspondre a lib*.a.
Les ent^etes publiques seront installees dans $(includedir).
Les ent^etes privees ne seront pas installees
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 43 / 98
209. GNU Autotools Conclusion
Conclusion sur les GNU Autotools
Les contres :
Pour beaucoup Autotools est synonyme d'Autohell 13 : de nombreuses
options et documentations.
La gestion des dependances et des decouvertes des
210. chiers est en
partie manuelle si elle n'est pas en arborescence traditionnelle.
L'utilisation de m4 est complexe.
Sous Win32/Win64, seul Cygwin/MinGW est supporte.
Les pours :
De loin, l'outils le plus complet et puissant.
L'utilisation des arborescences de distributionest parfaite. Et donc la
distribution (packaging) quasi-automatique.
La documentation est tres complete.
Ils sont utilises par des milliers de projets.
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 44 / 98
211. GNU Autotools Conclusion
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 45 / 98
212. CMake
3. CMake
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 46 / 98
213. CMake
Sommaire
CMake
Les bases de CMake
La gestion des bibliotheques
CMake dans le detail
Conclusion
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 47 / 98
214. CMake Les bases de CMake
Les references
Les sources d'informations qui ont ete utilisees pour cette partie :
http ://www.projet-plume.org/fr/
215. che/cmake
http ://fr.wikipedia.org/wiki/CMake
http ://www.cmake.org/cmake/help/documentation.html
http ://www.elpauer.org/stu/learning cmake.pdf
Mastering CMake - Published by Kitware, Inc. - ISBN 1-930934-09-2
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 48 / 98
216. CMake Les bases de CMake
CMake
Licence BSD
Cree en 2000
Ecrit en C++, se compile avec make/g++ ou Visual C++
Syntaxe maison dans un
217. chier : CMakeLists.txt
Outil binaire monolithique
Multiplateforme (POSIX systems, Windows)
Generation automatique de make
220. gures automatiquement selon la plateforme
Bonne portabilite des developpements
Generation des espaces de travail (Kdevelopp, XCode, MSVC, ...)
Petits extras : SWIG, Graphviz, CDash, CPack, CTest
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 49 / 98
221. CMake Les bases de CMake
Les projets qui utilisent CMake
ITK, VTK, VXL, ParaView, Slicer, gdcm
KDE 14
Second Life
clang, LLVM
...
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 50 / 98
222. CMake Les bases de CMake
Mode operatoire
Creer et parametrer un
223. chier CMakeLists.txt dans chaque repertoire
du projet.
Utiliser la commande cmake
Construction dans les sources du projet
cmake .
Construction hors des sources du projet
cmake path vers sources du projet
Generation des
225. le, ou .dsp, ou .sln, ...
Utilisables par les outils natifs
L'ensemble est mis en cache dans CMakeCache.txt (genere lors du 1er
appel a cmake) :
Con
226. guration de la construction (variables et valeurs)
En cas de probleme : modi
227. cation manuelle ou via ccmake
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 51 / 98
229. chiers a editer pour notre petit HelloWorld
src/main.c
#include stdio.h
int main(int argc, char* argv [])
f
printf (Hello Worldnn);
return 0;
g
CMakeLists.txt
PROJECT(hello)
SUBDIRS(src)
src/CMakeLists.txt
ADD_EXECUTABLE(hello main.c)
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 52 / 98
230. CMake La gestion des bibliotheques
Un exemple de bibliotheque : libfoo
src/CMakeLists.txt
INCLUDE_DIRECTORIES($CMAKE_SOURCE_DIR/foo)
LINK_DIRECTORIES($CMAKE_BINARY_DIR/foo)
ADD_EXECUTABLE(hello main.c)
TARGET_LINK_LIBRARIES(hello foo)
CMakeLists.txt
PROJECT(hello)
SUBDIRS(foo src)
foo/CMakeLists.txt
ADD_LIBRARY(foo STA-
TIC foo.c)
foo/CMakeLists.txt
ADD_LIBRARY(foo SHA-
RED foo.c)
Librairie statique (.a/.lib) ou librairie dynamique (.so/.dll/.dylib)
L'ordre des repertoires est important.
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 53 / 98
231. CMake CMake dans le detail
Les possibilites du CMakeLists.txt
Langage de script avec une syntaxe simple
Les commentaires avec : #
Les commandes en : COMMAND(arg1 arg2 ...)
Les listes en : A;B;C
Les variables en $VAR
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 54 / 98
232. CMake CMake dans le detail
Les structures de contr^oles
Conditionnelles
IF(CONDITION)
MESSAGE(Yes)
ELSE(CONDITION)
MESSAGE(No)
ENDIF(CONDITION)
Boucles
FOREACH(c A B C)
MESSAGE($c: $$c)
ENDFOREACH(c)
Macros
MACRO(MY_MACRO arg1 arg2)
SET($arg1 $$arg2)
ENDMACRO(MY_MACRO)
MY_MACRO(A B)
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 55 / 98
233. CMake CMake dans le detail
Composition : Macro
Composition de commandes existantes via l'utilisaiton de macros
MACRO (CREATE_EXECUTABLE NAME SOURCES LIBRARIES)
ADD_EXECUTABLE($NAME $SOURCES)
TARGET_LINK_LIBRARIES($NAME $LIBRARIES)
ENDMACRO(CREATE_EXECUTABLE)
ADD_LIBRARY(foo main.c)
CREATE_EXECUTABLE(hell main.c foo)
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 56 / 98
234. CMake CMake dans le detail
Creation de variables
Creation de variables booleennes - Utilisation en ligne de commande
OPTION(DEBUG Programme en mode DEBUG OFF)
IF(DEBUG)
SET_SOURCE_FILES_PROPERTIES(main.c COMPILE_FLAGS -DDEBUG)
ENDIF(DEBUG)
$ cmake -DDEBUG :BOOL=ON
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 57 / 98
235. CMake CMake dans le detail
Quelques remarques sur cmake ...
Pensez a utiliser :
cmake {help pour l'aide glolabe
cmake {help COMMAND pour une aide detaillee :
cmake {help IF
SET(CMAKE VERBOSE MAKEFILE on)
Il est possible de passer des parametres sur la ligne de commande :
par exemple -G pour selectionner le systeme de construction cible
par exemple -D pour mettre des variables en cache
$ cmake ../Foo -GVisual Studio 10 -DFOOBAR :BOOL=1
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 58 / 98
236. CMake CMake dans le detail
La GUI : NCurses
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 59 / 98
237. CMake CMake dans le detail
La GUI : Windows
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 60 / 98
238. CMake CMake dans le detail
Les modules
CMake propose des modules FIND LIBRARY a
239. n de trouver les librairies
externes utiles pour votre construction :
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 61 / 98
240. CMake CMake dans le detail
Les modules, suite
PROJECT( myProject )
FIND_PACKAGE ( PNG )
IF ( PNG_FOUND )
INCLUDE( $PNG_USE_FILE )
ENDIF( PNG_FOUND )
ADD_EXECUTABLE( myProject myProject.cxx )
TARGET_LINK_LIBRARIES ( myProject PNG)
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 62 / 98
241. CMake CMake dans le detail
Generation d'un paquet
Outil annexe : CPack, pour generer des paquets :
Linux RPM, deb et gzip
NSIS (pour Microsoft Windows)
Mac OS X packages (dmg + pkg)
Ajout de INCLUDE(CPack) dans le CMakeLists.txt de base. Puis :
cmake .
make package
make package source
Le param^etrage se fait dans CPackSourceCon
242. g.cmake
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 63 / 98
243. CMake Conclusion
Conclusion sur CMake
Les contres :
Syntaxe propre
Flexibilite restreinte (bien pense quand m^eme !)
Comme les GNU Autotools, ce n'est pas un systeme de construction :
C'est un generateur de
245. guration pour les systemes de
construction
Les pours :
Communaute croissante (et KDE!)
Tres interessant dans le contexte scienti
246. que (imagerie)
Vrai multiplateforme / pas uniquement POSIX
Les ajouts : CPack, CDash, CTest
Les Modules (+250 dans la derniere version)
GUI de con
248. guration (librairie partagee, debug, etc ...)
Outil tres stable
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 64 / 98
249. CMake Conclusion
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 65 / 98
250. SCons
4. SCons
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 66 / 98
251. SCons
Sommaire
SCons
Les bases de SCons
La gestion des bibliotheques
SCons dans le detail
Exemple de specialisation : SConspiracy
Conclusion
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 67 / 98
252. SCons Les bases de SCons
Les references
Les sources d'informations qui ont ete utilisees pour cette partie :
http ://www.projet-plume.org/fr/
254. SCons Les bases de SCons
SCons
Licence MIT
Cree en 2000 (suite au projet Cons en Perl)
Ecrit en python
Syntaxe python dans des
255. chiers SConstruct
Outil interprete
Multiplateforme (sur toutes les plateformes avec Python)
Remplace make, nmake.exe, msbuild.exe, etc ...
Detection des outils de compilation, d'edition des liens, ...
Generation des espaces de travailMicrosoft
Petits extras : SWIG, Graphviz, CDash, CPack, CTest
Support pour C, C++, D, Java, Fortran, Yacc, Tex, Qt, SWIG, ...
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 69 / 98
256. SCons Les bases de SCons
Les projets qui utilisent SCons
VMWare
Google Chrome
Doom3
Blender
NumPy/SciPy
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 70 / 98
257. SCons Les bases de SCons
Mode operatoire
Creer et parametrer un
259. chiers
SConscript dans chaque repertoire du projet.
Utiliser la commande scons
scons
L'ensemble des informations intermediaires est mis en cache dans le
262. chiers a editer pour notre petit HelloWorld
src/main.c
#include stdio.h
int main(int argc, char* argv [])
f
printf (Hello Worldnn);
return 0;
g
SConstruct
SConscript('src/SConscript')
src/SConscript
Program('hello', ['main.c'])
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 72 / 98
263. SCons La gestion des bibliotheques
Un exemple de bibliotheque : libfoo
src/SConscript
Program('hello', ['main.c'],
LIBS=['foo'], LIBPATH=['../foo'], CPPPATH=['../foo'])
SConstruct
SConscript (['src/SConscript','foo/SConscript'])
L'ordre des repertoires n'est pas important.
foo/SConscript
StaticLibrary('foo',['foo.c'])
foo/SConscript
SharedLibrary('foo',['foo.c'])
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 73 / 98
264. SCons SCons dans le detail
Les possibilites du SConscript
Pour faire simple, quasiment tout est possible ! C'est un
265. chier qui est
interprete en Python. Il est par exemple possible de de
266. nir des
environnements de construction :
SConstruct
opt = Environment(CCFLAGS = '-O2')
dbg = Environment(CCFLAGS = '-g')
opt.Program('foo', 'foo.c')
dbg.Program('bar', 'bar.c')
Al'execution
scons -Q
cc -o bar.o -c -g bar.c
cc -o bar bar.o
cc -o foo.o -c -O2 foo.c
cc -o foo foo.o Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 74 / 98
267. SCons SCons dans le detail
Acher les variables ou copier l'environnement
SConstruct
dict = Environment().Dictionary()
keys = dict.keys()
keys.sort()
for key in keys:
print construction variable = '%s', va-
lue = '%s' % (key, dict[key])
SConstruct
env = Environment(CC = 'gcc')
env.Program('foo', 'foo.c')
env.Clone(CCFLAGS = '-O2').Program('foo-opt', 'foo.c')
env.Clone(CCFLAGS = '-g').Program('foo-dbg', 'foo.c')
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 75 / 98
268. SCons SCons dans le detail
La reconstruction
Timestamp comme Make
269. les
SConstruct
Decider('timestamp-newer')
Decider('make')
Decider('timestamp-match')
Checksum md5 (methode par defaut)
SConstruct
Decider('MD5')
Combinaison des deux
SConstruct
Decider('MD5-timestamp')
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 76 / 98
270. SCons SCons dans le detail
Quelques remarques sur SCons
Construction hors des sources
SConstruct
SConscript('src/SConscript', variant_dir='build')
Manipulation des listes
SConstruct
Program('program', Glob('*.c'))
Determiner la localisation d'une librairie (et placer dans CPPPATH)
SConstruct
env = Environment()
env['CPPPATH'] = ['/lib/compat']
env.ParseConfig(pkg-config x11 -cflags -libs)
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 77 / 98
271. SCons SCons dans le detail
Quelques complements sur SCons
Nettoyage des sources apres construction : scons -c
VariantDir pour avoir un repertoire de sources propre
Possibilite de faire des compilations distribuees
Possibilite de mettre le cache sur un partage reseau
...
Tres grande possibilite d'extension
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 78 / 98
272. SCons SConspiracy
Un exemple d'extension : SConspiracy
Yams++ ) SConspiracy (racy)
Construction d'application
C++
Multiplateforme
Orientee composant
En environnement contr^ole
Open source, Licence BSD
http://code.google.com/p/sconspiracy/
Compatibilite avec Yams++ (anc^etre du projet)
Remplace make, cmake, ...
Python 2.6, SCons =1.3 pour la derniere version
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 79 / 98
273. SCons SConspiracy
Les Buts
Utilises les avantages de SCons en essayant d'ajouter :
Ajout/Con
274. guration de projets souple et simple
Respecter au maximum la philosophie DRY (Don't Repeat Yourself)
Detection automatique de ce qui doit ^etre compile
Obtenir un work
ow de construction optimum
Permettre facilement l'ajout ou l'evolution de fonctionnalite (plugins)
Gestion uniforme et souple des bibliotheques externes
Creation de packages binaires utilisables sous forme de bibliotheques
externes
Gestion de multiples projets independants ou a composants communs
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 80 / 98
275. SCons SConspiracy
Base de developpement et projets
Un ou plusieurs repertoires contenant des projets
Arborescence non structuree
Noms de projets uniques, compose par [ga-zA-Z0-9f]+
Un projet ne peut pas se trouver dans le repertoire d'un autre projet
Repertoire structure (Sources + ressources + con
276. guration-
Nom du repertoire ) nom du projet
Structure du repertoire
prj/bin/build.options
prj/include
prj/src
prj/rc
build.options (equivalent a un SConstruct ou CMakeLists.txt)
variable necessaire : TYPE (shared, static, exec, bundle, ...)
variables optionnelles : VERSION, LIB, USE, ...
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 81 / 98
278. chier build.options :
build.options
TYPE = 'shared'
VERSION = '0-4'
LIB = ['core','utils']
USE = ['boost', 'vtk']
Tout ceci est du code Python, comme pour SConstruct
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 82 / 98
279. SCons SConspiracy
Exemple d'utilisation de SConspiracy
build.options - 'hello'
TYPE = 'exec'
LIB = ['sconspirator 0.1']
build.options - 'sconspirator'
TYPE = 'shared'
VERSION = '0.1'
build.options - 'hello'
hello/bin/build.options
hello/src/program.cpp
build.options - 'sconspirator'
sconspirator/bin/build.options
sconspirator/include/SConspirator.hpp
sconspirator/src/SConspirator.cpp
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 83 / 98
280. SCons SConspiracy
Application + libs
Obj
A
instance de A::Indenter
Instance de B::Obj
Indenter
Obj
Obj
B
instance de A::Indenter
Instance de A::Obj
Obj
F
D
Obj
instance de A::Indenter
Instance de B::Obj
Obj
C
instance de A::Indenter
Instance de B::Obj
E
instance de A::Indenter
Instance de D::Obj
Instance de F::Obj
App
Instance de E::Obj
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 84 / 98
281. SCons SConspiracy
Application + libs + libext
A
Indenter
Obj
Obj
B
instance de A::Indenter
Instance de A::Obj
Obj
G
Shared_ptr sur une
instance de A::Indenter
Shared_ptr sur une
Instance de B::Obj
AppBoost
Instance de E::Obj
Boost
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 85 / 98
283. gure, il peut-^etre lent sur des gros projets
Necessaire de le specialisera partir d'une certaine taille de projet.
Generateur d'espace de travail pas aussi performant que CMake
La recherche de librairie n'a pas les ajouts de CMake
Avoir Python d'installe
Les pours :
Vraiment multiplateforme et extensible avec un langage connu
Il ne produit pas des
284. chiers pour construire, il construit
Permet d'avoir des processus de construction maison, ce qui est
necessaire a partir d'une certaine taille de projet/equipe
Autocon
285. guration (librairie partagee, warnings, etc ...)
Complements extr^emement interessants (scons-addons, SConspiracy,
sbf, swtoolkit, scons-plusplus, ...)
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 86 / 98
286. SCons Conclusion
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 87 / 98
287. Les autres
5. Les autres
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 88 / 98
288. Les autres
Sommaire
Les autres
Ant
Maven
Qmake
Et de nombreux autres
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 89 / 98
289. Les autres Ant
Ant : Another Neat Tool 16
Ant 15 est sous licence Apache et a ete cree en 2000.
Le projet est heberge par la fondation Apache et est ecrit en Java.
Il permet de faire l'appel aux compilateurs, aux generateurs de
documentation (Javadoc), aux generateurs de rapports, aux
veri
290. cateurs de style (checkstyle), ...
Il peut ^etre utilise avec C/C++ via des contributions au projet
Il est devenu omnipresent dans le monde Java.
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 90 / 98
291. Les autres Maven
Maven 17
Maven est sous licence Apache et a ete cree en 2002.
En gros, il reprend tout ce que fait Ant, mais essaye d'en simpli
293. guration pour les gros projets.
Il essaye de standardiser les projets.
Il apporte une tres bonne gestion des dependances.
Il a une orientation reseau (si les sources ne sont pas la, il va les
chercher)
Il n'y a plus de support pour C/C++ mais il en existe pour .Net
La version 3 devrait support Ruby et Groovy
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 91 / 98
294. Les autres qmake
qmake 19
Outil de construction fournit avec Qt
A l'origine TMake (un script Perl)
M^eme architecture que TMake, dicile a maintenir
Semble se faire petit a petit remplacer par CMake 18
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 92 / 98
295. Les autres Et de nombreux autres
Waf
Il s'agit d'un fork de SCons.
Waf 20 est portable, leger, n'a que Python comme dependance.
Il propose un vrai langage (Python) pour la con
296. guration.
Il support les cibles traditionnelles (buid, clean, install, ...)
Il determine les dependances pour C/C++.
Il supporte le langage D et OCaml.
Il propose un mode daemon et un systeme de cache.
Il est plus rapide que SCons dans certains cas
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 93 / 98
297. Les autres Et de nombreux autres
MSBuild et NAnt
Pour les environnements DotNET, 2 outils interessant existent :
MSBuild 21 a ete introduit avec Visual 2005. Il permet de generer le
code .Net (C#, VB, ...). Ses
299. gurations s'ecrivent en
XML. Il a pour but de remplacer l'outils nmake.exe
Le principal concurrent est NAnt. Il s'agit du pendant du projet Ant,
mais celui est plus specialise pour .Net et est fait en C#.
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 94 / 98
304. Conclusion
Conclusion
Synthese :
CMake et SCons sont tres interessants et performants.
Autotools est complexe mais impeccable sur POSIX.
Pour du pur Java, Ruby, Python, etc ... Il existe des processus de
construction specialisess.
Conseils :
Ne pas utiliser les systemes integres des IDE.
Etudier en fonction de vos besoins.
On peut remettre en cause le choix de l'outils, m^eme si c'est dicile.
Vous pouvez gagner en ecacite et en visibilite sur votre projet.
Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 98 / 98