ENVOL - Outils de construction formation pour le developpement et la ValOrisation des Logiciels en environnement de recherche Organisation par le projet PLUME et les réseaux Calcul et DevLog Johan Moreau IRCAD 27 septembre 2010 Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 1 / 98
Le document : Cette présentation a été faite avec des outils opensource et libre dans le but de présenter des outils de construction d applications eux-aussi opensource. N hésitez pas à m envoyer vos remarques ou corrections sur johan.moreau sur gmail.com Ce document est distribué sous licence Creative Commons Attribution-ShareAlike 2.0 La session : Des séquences de slides emmelées avec des exemples de codes Des questions (et je l espère des réponses) à tout moment Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 2 / 98
Sommaire Sommaire Le but de cette présentation est de découvrir 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
La construction d application 1. La construction d application Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 4 / 98
La construction d application Sommaire La construction d application Quelques rappels et remarques Les Makefile Les limitations et les solutions Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 5 / 98
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 (préprocesseur, compilation, éditions des liens, etc.) contribuant, à partir de données sources, à la production d un (ensemble) logiciel. Les termes anglais sont Software Build 1 ou Build automation 2. 1. http ://en.wikipedia.org/wiki/software build 2. http ://en.wikipedia.org/wiki/build automation Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 6 / 98
La construction d application Quelques rappels... Préprocesseur 3 Il s agit d une étape permettant des transformations sur un code source. Dans le monde C/C++, la commande du préprocesseur la plus répandue est include qui a pour but de recopier le contenu du fichier indiqué en paramêtre. (A noter la différence avec les package en java, import en Python et co) On peut aussi utiliser le préprocesseur pour faire des macros via define 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 préprocesseur (retours d erreurs du compilateur) 3. http ://fr.wikipedia.org/wiki/pr%c3%a9processeur Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 7 / 98
La construction d application Quelques rappels... Compilation 5 Il s agit d une étape traduisant un code d un langage vers du code en langage machine (réel ou virtuel) Le langage machine est soit directement interprété par la machine soit interprété par une machine virtuelle 4. Dans ce dernier cas on peut citer Java ou DotNet. Les phases (traditionelles) : analyses lexicale, syntaxique puis sémantique, génération du code intermédiaire puis optimisation, génération du code objet 4. Le terme ici désigne un programme informatique interprétant ce code 5. http ://fr.wikipedia.org/wiki/compilateur Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 8 / 98
La construction d application Quelques rappels... Edition des liens 6 L édition des liens est un processus qui permet de créer des fichiers exécutables ou des bibliothèques dynamiques ou statiques, à partir de fichiers objets. 6. http ://en.wikipedia.org/wiki/linker %28computing%29 Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 9 / 98
La construction d application Quelques rappels... Un peu de compilation donc... Exemple en C sous UNIX Il faut déjà organiser un peu ses fichiers, par exemple Pour C/C++, spération des déclarations et implémentations Pour Java, regroupement par package... Ensuite organiser son code : #ifdef DEBUG pour C par exemple (à activer sur la ligne de commande : gcc -DDEBUG=1 fichier.c) Pour Java, regroupement par package... cc : Supprime les commentaires, effectue les inclusions et les macros,... cc1 : Converti le code C en assembleur as : Assemblage des fichiers assembleurs, génère les fichiers objets ld : Détermine les adresses mémoires des symboles et lie les fichiers objets entre eux Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 10 / 98
La construction d application Quelques rappels... La construction dans le monde réel Cette suite semble fixe et standard et donc totalement automatisable! Mais en réalité : Plusieurs langages avec chacun ses spécificités Des variantes dans les langages (gtk vs Qt par exemple) Problèmes du multiplateforme/architecture/distribution Grand nombre de fichiers et de cibles Il faut des outils pour assister le développeur dans cette phase. Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 11 / 98
La construction d application Quelques rappels... La construction d applications C/C++ Cette présentation n illustrera que les principes les plus courants de la construction d applications C/C++ On ne parlera que très peu des systèmes embarqués dans les IDE On laissera les problèmes liés aux compilateurs de côtés On ne parlera que très peu des outils/besoins post-compilation (test unitaires, packaging, etc...) Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 12 / 98
La construction d application Quelques rappels... A long time ago, in a galaxy far far away... 9 Jusqu à la fin des années 70, les programmes étaient petits. En 1977, le Dr Stuart I Feldman (Bell Labs) invente l outil Make L outil rencontre un succès immédiat. En 1997, Peter Miller ecrit l article : Recursive Make Considered Harmful 7. Depuis de nombreux outils essayent d améliorer de processus 8. 7. http ://aegis.sourceforge.net/auug97.pdf 8. http ://en.wikipedia.org/wiki/list of build automation software 9. http ://en.wikipedia.org/wiki/star Wars opening crawl Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 13 / 98
La construction d application La syntaxe du Makefile Les Makefile Le fichier Makefile est composé de plusieurs règles de la forme : cible : dépendances <TAB> commandes cible : dépendances <TAB> commandes Chaque commande est précédée d une tabulation : Makefile prog : main. o f u n c t i o n s. o gcc o prog main. o f u n c t i o n s. o main. o : main. c f u n c t i o n s. h gcc c main. c f u n c t i o n s. o : f u n c t i o n s. c f u n c t i o n s. h gcc c f u n c t i o n s. c Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 14 / 98
La construction d application Les Makefile Les évaluations de règles Lors de l utilisation de la commande make cible Evaluation de la règle dont la cible est passée en argument à make Evaluation de la première règle rencontrée (s il n y a pas d argument) Les dépendances sont analysées Si une dépendance n est pas à jour on tente de la résoudre Si cette dépendance est cible d une autre règle du Makefile alors cette règle est à son tour évaluée Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 15 / 98
La construction d application Les Makefile Les cibles classiques all Génération de toutes les cibles.phony Les dépendances de cette cible sont toujours regénérées clean Suppression des fichiers intermédiaires Mproper / distclean clean + suppression des fichiers cibles Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 16 / 98
La construction d application Les Makefile Les variables Déclaration de variables via NOM=VALEUR. Les variables traditionnelles : CFLAGS : options du compilatuer C (CXXFLAGS pour C++) LDFLAGS : options de l éditeur de liens... Les variables internes : $@ : la cible $< : la 1ère dépendance $ˆ : la liste des dépendances $* : le nom de la cible sans suffixe Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 17 / 98
La construction d application Les Makefile Et plus encore... Les conditionnelles : ifeq... else... endif La recherche de dépendances : Utilisation de la variable VPATH/vpath (VPATH = src :../headers) Les appels imbriqués : cd $(SRC DIR) && $(MAKE) $@ Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 18 / 98
La construction d application Quels reproches au Make ancestral? Les limitations et les solutions Pas vraiment portable/multiplateforme : basé sur des scripts shell et des propriétés du système de fichiers. De plus les évolutions des descandants (GNU Make,...) ont des implémentations particulières pour les fonctions manquantes (if-then-else par exemple). Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 19 / 98
La construction d application Les limitations et les solutions Quels reproches au Make ancestral? Pas vraiment portable/multiplateforme : basé sur des scripts shell et des propriétés du système de fichiers. De plus les évolutions des descandants (GNU Make,...) ont des implémentations particulières pour les fonctions manquantes (if-then-else par exemple). Difficulté à monter en charge : L évolution du code qui est nécessaire 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 Makefile. Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 19 / 98
La construction d application Les limitations et les solutions Quels reproches au Make ancestral? Pas vraiment portable/multiplateforme : basé sur des scripts shell et des propriétés du système de fichiers. De plus les évolutions des descandants (GNU Make,...) ont des implémentations particulières pour les fonctions manquantes (if-then-else par exemple). Difficulté à monter en charge : L évolution du code qui est nécessaire 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 Makefile. Le langage du Makefile ajoute une complexité qui n a pas de raison d être. De plus il est relativement limité. Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 19 / 98
La construction d application Les limitations et les solutions Quels reproches au Make ancestral? Pas vraiment portable/multiplateforme : basé sur des scripts shell et des propriétés du système de fichiers. De plus les évolutions des descandants (GNU Make,...) ont des implémentations particulières pour les fonctions manquantes (if-then-else par exemple). Difficulté à monter en charge : L évolution du code qui est nécessaire 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 Makefile. Le langage du Makefile ajoute une complexité qui n a pas de raison d être. De plus il est relativement limité. Les vérifications d évolutions de code sont superficielles. Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 19 / 98
La construction d application Les limitations et les solutions Quels reproches au Make ancestral? Pas vraiment portable/multiplateforme : basé sur des scripts shell et des propriétés du système de fichiers. De plus les évolutions des descandants (GNU Make,...) ont des implémentations particulières pour les fonctions manquantes (if-then-else par exemple). Difficulté à monter en charge : L évolution du code qui est nécessaire 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 Makefile. Le langage du Makefile ajoute une complexité qui n a pas de raison d être. De plus il est relativement limité. Les vérifications d évolutions de code sont superficielles. Il n y pas de système de détection implicite de dépendances Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 19 / 98
La construction d application Ce qui a changé aussi... Les limitations et les solutions Précédement : Compiler votre code Faire la liaison avec les librairies (statiques/dynamiques) Distribuer sous forme de sources ou de binaires Maintenant, en plus : Exécuter les tests unitaires (voir fonctionnels) Faire un Installeur (msi, deb, rpm, installshield,...) Gérer les problématiques d internationalisation Générer la documentation développeur et utilisateur, les métriques,... A ceci s ajoute une tendance depuis 2000 : l intégration continue Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 20 / 98
La construction d application Les limitations et les solutions La notion d intégration continue 10 L idée : vérifier à chaque modification de code source que le résultat des modifications ne produit pas de régression du logiciel (donc l éxécutable, mais aussi la documentation, les métriques,...) Ceci implique donc une construction rapide flexible standardisée (un minimum d outils) identique pour toutes les cibles (OS, architecture,...) A partir de là, nous pouvons imaginer la production de livrables, de versions journalières( nightly build ), des déploiements automatiques, la génération automatique de l historique (release notes), etc... 10. http ://fr.wikipedia.org/wiki/int%c3%a9gration continue Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 21 / 98
La construction d application Les limitations et les solutions Evolution forte au milieu des années 90 Apparition des méthodes agiles Développement du marché Web Augmentation des langages et plateformes Croissance de l opensource L ensemble de ces facteurs pousse à avoir un système optimum pour la construction d application. Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 22 / 98
La construction d application Les limitations et les solutions Vraiment un problème nouveau? Début des années 90 : imake pour XFree86 Cygnus et les gcc configure script pour les outils GNU autoconf C est cette dernière initiative qui fût la bonne. Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 23 / 98
La construction d application Les limitations et les solutions La réponse du monde libre Création d autoconf en 1991 par David J. MacKenzie : apparition du script configure et des fichiers Makefile.in Utilisation de m4 et adoption des conventions issues de GNU Puis passage au configure.in Enfin, 1994-09-19 First CVS commit 11 Le choix qui a été fait ici a été de s appuyer sur les fonctionnalités présentes sur le système en les testant (la partie configure), 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 développeurs (IDE). 11. http ://www.gnu.org/software/hello/manual/automake/timeline.html Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 24 / 98
La construction d application Les limitations et les solutions Les autres réponses 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 12. http ://en.wikipedia.org/wiki/not Invented Here Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 25 / 98
La construction d application Les limitations et les solutions Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 26 / 98
GNU Autotools 2. GNU Autotools Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 27 / 98
GNU Autotools Sommaire GNU Autotools Les bases de GNU Autotools GNU Autotools dans le détail La gestion des bilbiothèques Conclusion Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 28 / 98
GNU Autotools Les bases de GNU Autotools Les références Les sources d informations qui ont été utilisées 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/configure/ http ://fsmsh.com/2754 Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 29 / 98
GNU Autotools Les bases de GNU Autotools GNU Autotools Licence GPL, créé en 1992 Ecrit en shell + m4 Combinaison d outils Génération automatique de makefile Makefiles génériques, paramétrables Configurés automatiquement selon la plateforme Bonne portabilité des développements Construction simple et transparente pour l utilisateur :./configure,make,make install Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 30 / 98
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
GNU Autotools On peut simplifier un peu... Les bases de GNU Autotools On peut simplifier les 1ères étapes : autoreconf La séquence serait donc : Création du configure.ac Création des Makefile.am Lancement de autoreconf install Lancement de configure Lancement de make Lnacement de make install Bon allez, on se lance... Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 32 / 98
Notre petit Hello World GNU Autotools Les bases de GNU Autotools src/ main.c #i n c l u d e <s t d i o. h> i n t main ( i n t argc, char argv [ ] ) { p r i n t f ( H e l l o World \n ) ; return 0 ; } Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 33 / 98
GNU Autotools Les bases de GNU Autotools Les 3 fichiers à éditer configure.ac AC_INIT([amhello], [1.0], [bug-report@address]) AM_INIT_AUTOMAKE([foreign -Wall -Werror]) AC_PROG_CC AC_CONFIG_HEADERS([config.h]) AC_CONFIG_FILES([Makefile src/makefile]) AC_OUTPUT Makefile.am SUBDIRS = src src/ Makefile.am bin_programs = hello hello_sources = main.c Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 34 / 98
GNU Autotools GNU Autotools dans le détail Notre configure.ac configure.ac AC_INIT([amhello], [1.0], [bug-report@address]) AM_INIT_AUTOMAKE([foreign -Wall -Werror]) AC_PROG_CC AC_CONFIG_HEADERS([config.h]) AC_CONFIG_FILES([Makefile src/makefile]) AC_OUTPUT Initialisation Autoconf (nom, version, @ de support,...) Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 35 / 98
GNU Autotools GNU Autotools dans le détail Notre configure.ac configure.ac AC_INIT([amhello], [1.0], [bug-report@address]) AM_INIT_AUTOMAKE([foreign -Wall -Werror]) AC_PROG_CC AC_CONFIG_HEADERS([config.h]) AC_CONFIG_FILES([Makefile src/makefile]) AC_OUTPUT Initialisation Autoconf (nom, version, @ de support,...) Initialisation Automake (remonte les erreurs,...) Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 35 / 98
GNU Autotools GNU Autotools dans le détail Notre configure.ac configure.ac AC_INIT([amhello], [1.0], [bug-report@address]) AM_INIT_AUTOMAKE([foreign -Wall -Werror]) AC_PROG_CC AC_CONFIG_HEADERS([config.h]) AC_CONFIG_FILES([Makefile src/makefile]) AC_OUTPUT Initialisation Autoconf (nom, version, @ de support,...) Initialisation Automake (remonte les erreurs,...) Utilisation du compilateur C Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 35 / 98
GNU Autotools GNU Autotools dans le détail Notre configure.ac configure.ac AC_INIT([amhello], [1.0], [bug-report@address]) AM_INIT_AUTOMAKE([foreign -Wall -Werror]) AC_PROG_CC AC_CONFIG_HEADERS([config.h]) AC_CONFIG_FILES([Makefile src/makefile]) AC_OUTPUT Initialisation Autoconf (nom, version, @ de support,...) Initialisation Automake (remonte les erreurs,...) Utilisation du compilateur C Déclare config.h pour les entêtes Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 35 / 98
GNU Autotools GNU Autotools dans le détail Notre configure.ac configure.ac AC_INIT([amhello], [1.0], [bug-report@address]) AM_INIT_AUTOMAKE([foreign -Wall -Werror]) AC_PROG_CC AC_CONFIG_HEADERS([config.h]) AC_CONFIG_FILES([Makefile src/makefile]) AC_OUTPUT Initialisation Autoconf (nom, version, @ de support,...) Initialisation Automake (remonte les erreurs,...) Utilisation du compilateur C Déclare config.h pour les entêtes Déclare Makefile et src/ Makefile Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 35 / 98
GNU Autotools GNU Autotools dans le détail Notre configure.ac configure.ac AC_INIT([amhello], [1.0], [bug-report@address]) AM_INIT_AUTOMAKE([foreign -Wall -Werror]) AC_PROG_CC AC_CONFIG_HEADERS([config.h]) AC_CONFIG_FILES([Makefile src/makefile]) AC_OUTPUT Initialisation Autoconf (nom, version, @ de support,...) Initialisation Automake (remonte les erreurs,...) Utilisation du compilateur C Déclare config.h pour les entêtes Déclare Makefile et src/ Makefile Génère les fichiers spécifiés Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 35 / 98
GNU Autotools GNU Autotools dans le détail configure.ac en version plus complète configure.ac # Prelude. AC_INIT([amhello], [1.0], [bug-report@address]) AM_INIT_AUTOMAKE([foreign -Wall -Werror]) # Vérifications pour les programmes AC_PROG_CC # Vérifications pour les bibliothèques # Vérifications pour les entêtes # Vérifications pour les typedefs, les structures, les options de compilateurs # Génération de fichiers AC_CONFIG_HEADERS([config.h]) AC_CONFIG_FILES([Makefile src/makefile]) AC_OUTPUT Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 36 / 98
GNU Autotools GNU Autotools dans le détail Exemples de vérifications (et affectations) de programmes AC_PROG_CC, AC_PROG_CXX, AC_PROG_F77,... Vérifications pour les compilateurs Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 37 / 98
GNU Autotools GNU Autotools dans le détail Exemples de vérifications (et affectations) de programmes AC_PROG_CC, AC_PROG_CXX, AC_PROG_F77,... Vérifications pour les compilateurs AC_PROG_SED, AC_PROG_YACC, AC_PROG_LEX,... Vérifications pour les utilitaires Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 37 / 98
GNU Autotools GNU Autotools dans le détail Exemples de vérifications (et affectations) de programmes AC_PROG_CC, AC_PROG_CXX, AC_PROG_F77,... Vérifications pour les compilateurs AC_PROG_SED, AC_PROG_YACC, AC_PROG_LEX,... Vérifications pour les utilitaires AC_CHECK_PROGS(VAR, PROGS, [VAL-IF-NOT-FOUND]) VAR est positionné sur le 1er PROGS trouvé, si rien n est trouvé 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
GNU Autotools Les macros utiles dans autoconf GNU Autotools dans le détail AC_MSG_ERROR(ERROR-DESCRIPTION, [EXIT-STATUS]) Affiche ERROR-DESCRIPTION (config.log) et arrête configure. AC_MSG_WARN(ERROR-DESCRIPTION) Pareil, mais n arrête pas Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 38 / 98
GNU Autotools Les macros utiles dans autoconf GNU Autotools dans le détail AC_MSG_ERROR(ERROR-DESCRIPTION, [EXIT-STATUS]) Affiche ERROR-DESCRIPTION (config.log) et arrête configure. AC_MSG_WARN(ERROR-DESCRIPTION) Pareil, mais n arrête pas AC_DEFINE(VARIABLE, VALUE, DESCRIPTION) Ajoute les informations dans config.h. /* DESCRIPTION */ #define VARIABLE VALUE Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 38 / 98
GNU Autotools Les macros utiles dans autoconf GNU Autotools dans le détail AC_MSG_ERROR(ERROR-DESCRIPTION, [EXIT-STATUS]) Affiche ERROR-DESCRIPTION (config.log) et arrête configure. AC_MSG_WARN(ERROR-DESCRIPTION) Pareil, mais n arrête pas AC_DEFINE(VARIABLE, VALUE, DESCRIPTION) Ajoute les informations dans config.h. /* DESCRIPTION */ #define VARIABLE VALUE AC_SUBST(VARIABLE, [VALUE]) Fixe $(VARIABLE) comme VALUE dans Makefile. AC_SUBST([FOO], [foo]) FOO=foo AC_SUBST([FOO]) Les 3 écritures sont équivalentes AC_SUBST([FOO]) FOO=foo Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 38 / 98
GNU Autotools Vérification pour les bibliothèques GNU Autotools dans le détail AC_CHECK_LIB(LIBRARY, FUNCT, [ACT-IF-FOUND], [ACT-IF-NOT]) Vérifie si la LIBRARY existe et si elle contient FUNCT. Si oui, éxecute ACT-IF-FOUND sinon ACT-IF-NOT. Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 39 / 98
GNU Autotools Vérification pour les bibliothèques GNU Autotools dans le détail AC_CHECK_LIB(LIBRARY, FUNCT, [ACT-IF-FOUND], [ACT-IF-NOT]) Vérifie si la LIBRARY existe et si elle contient FUNCT. Si oui, éxecute ACT-IF-FOUND sinon ACT-IF-NOT. AC_CHECK_LIB([efence], [malloc], [EFENCELIB=-lefence]) AC_SUBST([EFENCELIB]) $(EFENCELIB) pourra être utilisé plus tard Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 39 / 98
GNU Autotools Vérification pour les entêtes GNU Autotools dans le détail AC_CHECK_HEADERS(HEADERS...) Vérifie la présence de HEADERS et positionne #define HAVE_HEADER_H pour chacun. Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 40 / 98
GNU Autotools Vérification pour les entêtes GNU Autotools dans le détail AC_CHECK_HEADERS(HEADERS...) Vérifie la présence de HEADERS et positionne #define HAVE_HEADER_H pour chacun. AC_CHECK_HEADERS([sys/param.h unistd.h]) AC_CHECK_HEADERS([wchar.h]) #define HAVE_SYS_PARAM_H, HAVE_UNISTD_H, and HAVE_WCHAR_H. Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 40 / 98
GNU Autotools Vérification pour les entêtes GNU Autotools dans le détail AC_CHECK_HEADERS(HEADERS...) Vérifie la présence de HEADERS et positionne #define HAVE_HEADER_H pour chacun. AC_CHECK_HEADERS([sys/param.h unistd.h]) AC_CHECK_HEADERS([wchar.h]) #define HAVE_SYS_PARAM_H, HAVE_UNISTD_H, and HAVE_WCHAR_H. #i f HAVE UNISTD H # i n c l u d e <u n i s t d. h> #e n d i f Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 40 / 98
GNU Autotools Vérification pour les entêtes GNU Autotools dans le détail AC_CHECK_HEADERS(HEADERS...) Vérifie la présence de HEADERS et positionne #define HAVE_HEADER_H pour chacun. AC_CHECK_HEADERS([sys/param.h unistd.h]) AC_CHECK_HEADERS([wchar.h]) #define HAVE_SYS_PARAM_H, HAVE_UNISTD_H, and HAVE_WCHAR_H. #i f HAVE UNISTD H # i n c l u d e <u n i s t d. h> #e n d i f AC_CHECK_HEADER(HEADER, [ACT-IF-FOUND], [ACT-IF-NOT]) Utile pour vérifier uniquement les entêtes (sans les DEFINE) Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 40 / 98
GNU Autotools GNU Autotools dans le détail Les Makefile.am Makefile.am SUBDIRS = src src/ Makefile.am bin_programs = hello hello_sources = main.c SUBDIRS pour les sous-répertoire à prendre en compte bin PROGRAMS éxécutable à générer (à séparer par des espaces) target SOURCES... Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 41 / 98
La déclaration des cibles GNU Autotools GNU Autotools dans le détail Makefile.am lieu_type = cibles... Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 42 / 98
GNU Autotools GNU Autotools dans le détail La déclaration des cibles Makefile.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
GNU Autotools GNU Autotools dans le détail La déclaration des cibles Makefile.am lieu_type = cibles... les cibles seront installées 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
Les bibliothèques GNU Autotools La gestion des bibliothèques Ajouter AC_PROG_RANLIB dans configure.ac. Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 43 / 98
Les bibliothèques GNU Autotools La gestion des bibliothèques Ajouter AC_PROG_RANLIB dans configure.ac. Makefile.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 Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 43 / 98
Les bibliothèques GNU Autotools La gestion des bibliothèques Ajouter AC_PROG_RANLIB dans configure.ac. Makefile.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 bibliothèques seront installées dans $(libdir). Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 43 / 98
GNU Autotools La gestion des bibliothèques Les bibliothèques Ajouter AC_PROG_RANLIB dans configure.ac. Makefile.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 bibliothèques seront installées dans $(libdir). Le nom des bilbiothèques doivent correspondre à lib*.a. Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 43 / 98
GNU Autotools La gestion des bibliothèques Les bibliothèques Ajouter AC_PROG_RANLIB dans configure.ac. Makefile.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 bibliothèques seront installées dans $(libdir). Le nom des bilbiothèques doivent correspondre à lib*.a. Les entêtes publiques seront installées dans $(includedir). Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 43 / 98
GNU Autotools La gestion des bibliothèques Les bibliothèques Ajouter AC_PROG_RANLIB dans configure.ac. Makefile.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 bibliothèques seront installées dans $(libdir). Le nom des bilbiothèques doivent correspondre à lib*.a. Les entêtes publiques seront installées dans $(includedir). Les entêtes privées ne seront pas installées Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 43 / 98
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 dépendances et des découvertes des fichiers 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 supporté. Les pours : De loin, l outils le plus complet et puissant. L utilisation des arborescences de distribution est parfaite. Et donc la distribution (packaging) quasi-automatique. La documentation est très complète. Ils sont utilisés par des milliers de projets. 13. http ://esr.ibiblio.org/?p=1877 Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 44 / 98
GNU Autotools Conclusion Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 45 / 98
CMake 3. CMake Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 46 / 98
CMake Sommaire CMake Les bases de CMake La gestion des bibliothèques CMake dans le détail Conclusion Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 47 / 98
CMake Les bases de CMake Les références Les sources d informations qui ont été utilisées pour cette partie : http ://www.projet-plume.org/fr/fiche/cmake http ://fr.wikipedia.org/wiki/cmake http ://www.cmake.org/cmake/help/documentation.html http ://www.elpauer.org/stuff/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
CMake Les bases de CMake CMake Licence BSD Créé en 2000 Ecrit en C++, se compile avec make/g++ ou Visual C++ Syntaxe maison dans un fichier : CMakeLists.txt Outil binaire monolithique Multiplateforme (POSIX systems, Windows) Génération automatique de makefile en fonction de la plateforme Makefiles génériques, paramétrables Configurés automatiquement selon la plateforme Bonne portabilité des développements Génération 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
CMake Les bases de CMake Les projets qui utilisent CMake ITK, VTK, VXL, ParaView, Slicer, gdcm KDE 14 Second Life clang, LLVM... 14. http ://lwn.net/articles/188693/ Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 50 / 98
CMake Les bases de CMake Mode opératoire Créer et paramétrer un fichier CMakeLists.txt dans chaque répertoire 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 Génération des fichiers Makefile, ou.dsp, ou.sln,... Utilisables par les outils natifs L ensemble est mis en cache dans CMakeCache.txt (généré lors du 1er appel à cmake) : Configuration de la construction (variables et valeurs) En cas de problème : modification manuelle ou via ccmake Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 51 / 98
CMake Les bases de CMake Les 3 fichiers à éditer pour notre petit HelloWorld src/ main.c #i n c l u d e <s t d i o. h> i n t main ( i n t argc, char argv [ ] ) { p r i n t f ( H e l l o World \n ) ; return 0 ; } 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
CMake Un exemple de bibliothèque : libfoo La gestion des bibliothèques 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 répertoires est important. Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 53 / 98
CMake CMake dans le détail Les possibilités 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
Les structures de contrôles CMake CMake dans le détail 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
Composition : Macro CMake CMake dans le détail 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
Création de variables CMake CMake dans le détail Création de variables booléennes - 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
CMake CMake dans le détail Quelques remarques sur cmake... Pensez à utiliser : cmake help pour l aide glolabe cmake help COMMAND pour une aide détaillée : cmake help IF SET(CMAKE VERBOSE MAKEFILE on) Il est possible de passer des paramètres sur la ligne de commande : par exemple -G pour sélectionner le système de construction cible par exemple -D pour mettre des variables en cache $ cmake../foo -G Visual Studio 10 -DFOOBAR :BOOL=1 Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 58 / 98
La GUI : NCurses CMake CMake dans le détail Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 59 / 98
La GUI : Windows CMake CMake dans le détail Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 60 / 98
Les modules CMake CMake dans le détail CMake propose des modules FIND LIBRARY afin de trouver les librairies externes utiles pour votre construction : Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 61 / 98
Les modules, suite CMake CMake dans le détail 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
CMake CMake dans le détail Génération d un paquet Outil annexe : CPack, pour générer 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êtrage se fait dans CPackSourceConfig.cmake Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 63 / 98
CMake Conclusion Conclusion sur CMake Les contres : Syntaxe propre Flexibilité restreinte (bien pensé quand même!) Comme les GNU Autotools, ce n est pas un système de construction : C est un générateur de fichier de configuration pour les systèmes de construction Les pours : Communauté croissante (et KDE!) Très intéressant dans le contexte scientifique (imagerie) Vrai multiplateforme / pas uniquement POSIX Les ajouts : CPack, CDash, CTest Les Modules (+250 dans la dernière version) GUI de configuration Autoconfiguration (librairie partagée, debug, etc...) Outil très stable Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 64 / 98
CMake Conclusion Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 65 / 98
SCons 4. SCons Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 66 / 98
SCons Sommaire SCons Les bases de SCons La gestion des bibliothèques SCons dans le détail Exemple de spécialisation : SConspiracy Conclusion Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 67 / 98
SCons Les bases de SCons Les références Les sources d informations qui ont été utilisées pour cette partie : http ://www.projet-plume.org/fr/fiche/scons http ://fr.wikipedia.org/wiki/scons http ://www.scons.org/documentation.php Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 68 / 98
SCons Les bases de SCons SCons Licence MIT Créé en 2000 (suite au projet Cons en Perl) Ecrit en python Syntaxe python dans des fichiers SConstruct Outil interprété Multiplateforme (sur toutes les plateformes avec Python) Remplace make, nmake.exe, msbuild.exe, etc... Détection des outils de compilation, d édition des liens,... Génération des espaces de travail Microsoft 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
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
SCons Les bases de SCons Mode opératoire Créer et paramétrer un fichier SConstruct à la racine et des fichiers SConscript dans chaque répertoire du projet. Utiliser la commande scons scons L ensemble des informations intermédiaires est mis en cache dans le fichier.sconsign.dblite Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 71 / 98
SCons Les bases de SCons Les 3 fichiers à éditer pour notre petit HelloWorld src/ main.c #i n c l u d e <s t d i o. h> i n t main ( i n t argc, char argv [ ] ) { p r i n t f ( H e l l o World \n ) ; return 0 ; } SConstruct SConscript( src/sconscript ) src/ SConscript Program( hello, [ main.c ]) Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 72 / 98
SCons La gestion des bibliothèques Un exemple de bibliothèque : libfoo src/ SConscript Program( hello, [ main.c ], LIBS=[ foo ], LIBPATH=[../foo ], CPPPATH=[../foo ]) SConstruct SConscript ([ src/sconscript, foo/sconscript ]) L ordre des répertoires 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
SCons SCons dans le détail Les possibilités du SConscript Pour faire simple, quasiment tout est possible! C est un fichier qui est interprété en Python. Il est par exemple possible de définir des environnements de construction : SConstruct opt = Environment(CCFLAGS = -O2 ) dbg = Environment(CCFLAGS = -g ) opt.program( foo, foo.c ) dbg.program( bar, bar.c ) Al éxécution 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
SCons SCons dans le détail Afficher les variables ou copier l environnement SConstruct dict = Environment().Dictionary() keys = dict.keys() keys.sort() for key in keys: print "construction variable = %s, value = %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
SCons SCons dans le détail La reconstruction Timestamp comme Makefiles SConstruct Decider( timestamp-newer ) Decider( make ) Decider( timestamp-match ) Checksum md5 (méthode par défaut) SConstruct Decider( MD5 ) Combinaison des deux SConstruct Decider( MD5-timestamp ) Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 76 / 98
SCons SCons dans le détail Quelques remarques sur SCons Construction hors des sources SConstruct SConscript( src/sconscript, variant_dir= build ) Manipulation des listes SConstruct Program( program, Glob( *.c )) Déterminer 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
SCons SCons dans le détail Quelques compléments sur SCons Nettoyage des sources après construction : scons -c VariantDir pour avoir un répertoire de sources propre Possibilité de faire des compilations distribuées Possibilité de mettre le cache sur un partage réseau... Très grande possibilité d extension Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 78 / 98
SCons SConspiracy Un exemple d extension : SConspiracy Yams++ SConspiracy (racy) Construction d application C++ Multiplateforme Orientée composant En environnement contrôlé Open source, Licence BSD http ://code.google.com/p/sconspiracy/ Compatibilité avec Yams++ (ancêtre du projet) Remplace make, cmake,... Python 2.6, SCons >=1.3 pour la dernière version Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 79 / 98
SCons SConspiracy Les Buts Utilises les avantages de SCons en essayant d ajouter : Ajout/Configuration de projets souple et simple Respecter au maximum la philosophie DRY (Don t Repeat Yourself) Détection automatique de ce qui doit être compilé Obtenir un workflow de construction optimum Permettre facilement l ajout ou l évolution de fonctionnalité (plugins) Gestion uniforme et souple des bibliothèques externes Création de packages binaires utilisables sous forme de bibliothèques externes Gestion de multiples projets indépendants ou à composants communs Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 80 / 98
SCons SConspiracy Base de développement et projets Un ou plusieurs répertoires contenant des projets Arborescence non structurée Noms de projets uniques, composé par [}a-za-z0-9{]+ Un projet ne peut pas se trouver dans le répertoire d un autre projet Répertoire structuré (Sources + ressources + configuration- Nom du répertoire nom du projet Structure du répertoire prj/bin/build.options prj/include prj/src prj/rc build.options (équivalent à un SConstruct ou CMakeLists.txt) variable nécessaire : TYPE (shared, static, exec, bundle,...) variables optionnelles : VERSION, LIB, USE,... Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 81 / 98
SCons SConspiracy Exemple de build.options Exemple de fichier 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
SCons SConspiracy Exemple d utilisation de SConspiracy build.options - hello TYPE = exec LIB = [ sconspirator 0.1 ] build.options - hello hello/bin/build.options hello/src/program.cpp build.options - sconspirator TYPE = shared VERSION = 0.1 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
Application + libs SCons SConspiracy C Obj instance de A::Indenter Instance de B::Obj D Obj instance de A::Indenter Instance de B::Obj B Obj instance de A::Indenter Instance de A::Obj A Indenter Obj E Obj instance de A::Indenter Instance de D::Obj Instance de F::Obj F Obj instance de A::Indenter Instance de B::Obj App Instance de E::Obj Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 84 / 98
Application + libs + libext SCons SConspiracy A Indenter Obj B Obj instance de A::Indenter Instance de A::Obj Boost G Obj Shared_ptr sur une instance de A::Indenter Shared_ptr sur une Instance de B::Obj AppBoost Instance de E::Obj Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 85 / 98
Conclusion sur SCons SCons Conclusion Les contres : Si mal configuré, il peut-être lent sur des gros projets Nécessaire de le spécialiser à partir d une certaine taille de projet. Générateur d espace de travail pas aussi performant que CMake La recherche de librairie n a pas les ajouts de CMake Avoir Python d installé Les pours : Vraiment multiplateforme et extensible avec un langage connu Il ne produit pas des fichiers pour construire, il construit Permet d avoir des processus de construction maison, ce qui est nécessaire à partir d une certaine taille de projet/équipe Autoconfiguration (librairie partagée, warnings, etc...) Compléments extrêmement intéressants (scons-addons, SConspiracy, sbf, swtoolkit, scons-plusplus,...) Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 86 / 98
SCons Conclusion Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 87 / 98
Les autres 5. Les autres Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 88 / 98
Les autres Sommaire Les autres Ant Maven Qmake Et de nombreux autres Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 89 / 98
Les autres Ant Ant : Another Neat Tool 16 Ant 15 est sous licence Apache et a été créé en 2000. Le projet est hébergé par la fondation Apache et est écrit en Java. Il permet de faire l appel aux compilateurs, aux générateurs de documentation (Javadoc), aux générateurs de rapports, aux vérificateurs de style (checkstyle),... Il peut être utilisé avec C/C++ via des contributions au projet Il est devenu omnipresent dans le monde Java. 15. http ://www.projet-plume.org/fr/fiche/ant 16. http ://fr.wikipedia.org/wiki/apache Ant Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 90 / 98
Les autres Maven Maven 17 Maven est sous licence Apache et a été créé en 2002. En gros, il reprend tout ce que fait Ant, mais essaye d en simplifier la configuration pour les gros projets. Il essaye de standardiser les projets. Il apporte une très bonne gestion des dépendances. Il a une orientation réseau (si les sources ne sont pas là, 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 17. http ://fr.wikipedia.org/wiki/apache Maven Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 91 / 98
Les autres qmake qmake 19 Outil de construction fournit avec Qt A l origine TMake (un script Perl) Même architecture que TMake, difficile à maintenir Semble se faire petit à petit remplacer par CMake 18 18. http ://labs.qt.nokia.com/2009/10/14/to-make-or-not-to-make-qmake-andbeyond-redux/ 19. http ://doc.trolltech.com/4.6/qmake-manual.html Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 92 / 98
Les autres Et de nombreux autres Waf Il s agit d un fork de SCons. Waf 20 est portable, léger, n a que Python comme dépendance. Il propose un vrai langage (Python) pour la configuration. Il support les cibles traditionnelles (buid, clean, install,...) Il détermine les dépendances pour C/C++. Il supporte le langage D et OCaml. Il propose un mode daemon et un système de cache. Il est plus rapide que SCons dans certains cas 20. http ://en.wikipedia.org/wiki/waf Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 93 / 98
Les autres Et de nombreux autres MSBuild et NAnt Pour les environnements DotNET, 2 outils intéressant existent : MSBuild 21 a été introduit avec Visual 2005. Il permet de générer le code.net (C#, VB,...). Ses fichiers de configurations s écrivent 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 spécialisé pour.net et est fait en C#. 21. http ://fr.wikipedia.org/wiki/msbuild Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 94 / 98
Les autres Et de nombreux autres Et ce n est pas fini J en passe des dizaines : Gant Gradle Buildr Rant Rake... Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 95 / 98
Les autres Et de nombreux autres Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 96 / 98
Conclusion Conclusion Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 97 / 98
Conclusion Conclusion Synthèse : CMake et SCons sont très intéressants et performants. Autotools est complexe mais impeccable sur POSIX. Pour du pur Java, Ruby, Python, etc... Il existe des processus de construction spécialiséss. Conseils : Ne pas utiliser les systèmes intégrés des IDE. Etudier en fonction de vos besoins. On peut remettre en cause le choix de l outils, même si c est difficile. Vous pouvez gagner en efficacité et en visibilité sur votre projet. Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 98 / 98