122
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´ eseaux Calcul et DevLog Johan Moreau IRCAD 27 septembre 2010 Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 1 / 98

Outils de construction pour la recherche

Embed Size (px)

Citation preview

Page 1: Outils de construction pour la recherche

ENVOL - Outils de constructionformation pour le dEveloppemeNt et la ValOrisation des Logiciels en

environnement de rechercheOrganisation 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

Page 2: Outils de construction pour la recherche

Le document :

Cette presentation a ete faite avec des outils opensource et libre dansle but de presenter des outils de construction d’applications eux-aussiopensource.

N’hesitez pas a m’envoyer vos remarques ou corrections surjohan.moreau sur gmail.com

Ce document est distribue sous licence Creative CommonsAttribution-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

Page 3: Outils de construction pour la recherche

Sommaire

Sommaire

Le but de cette presentation est de decouvrir les outils de constructiond’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

Page 4: Outils de construction pour la recherche

La construction d’application

1. La construction d’application

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 4 / 98

Page 5: Outils de construction pour la recherche

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

Page 6: Outils de construction pour la recherche

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 Build”1 ou ”Build automation”2.

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 6 / 98

Page 7: Outils de construction pour la recherche

La construction d’application Quelques rappels ...

Preprocesseur 3

Il s’agit d’une etape permettant des transformations sur un codesource.

Dans le monde C/C++, la commande du preprocesseur la plusrepandue est ”include” qui a pour but de recopier le contenu du fichierindique en parametre. (A noter la difference avec les ”package” enjava, import en Python et co)

On peut aussi utiliser le preprocesseur pour faire des ”macros” via”define” en C/C++ par exemple, de compilation conditionnelle, de lameta-programmation, etc ...

A noter que les conventions de codage demande souvent de limiterl’usage du preprocesseur (retours d’erreurs du compilateur)

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 7 / 98

Page 8: Outils de construction pour la recherche

La construction d’application Quelques rappels ...

Compilation 5

Il s’agit d’une etape traduisant un code d’un langage vers du code enlangage machine (reel ou virtuel)

Le langage machine est soit directement interprete par la machine soitinterprete par une ”machine virtuelle”4. Dans ce dernier cas on peutciter 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

Page 9: Outils de construction pour la recherche

La construction d’application Quelques rappels ...

Edition des liens 6

L’edition des liens est un processus qui permet de creer des fichiersexecutables ou des bibliotheques dynamiques ou statiques, a partir defichiers objets.

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 9 / 98

Page 10: Outils de construction pour la recherche

La construction d’application Quelques rappels ...

Un peu de compilation donc ... Exemple en C sous UNIX

Il faut deja organiser un peu ses fichiers, par exemplePour C/C++, speration des declarations et implementationsPour Java, regroupement par package...

Ensuite organiser son code :#ifdef DEBUG pour C par exemple (a activer sur la ligne decommande : gcc -DDEBUG=1 fichier.c)Pour Java, regroupement par package...

cc : Supprime les commentaires, effectue les inclusions et lesmacros,...

cc1 : Converti le code C en assembleur

as : Assemblage des fichiers assembleurs, genere les fichiers objets

ld : Determine les adresses memoires des symboles et lie les fichiersobjets entre eux

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 10 / 98

Page 11: Outils de construction pour la recherche

La construction d’application Quelques rappels ...

La construction dans le monde reel

Cette suite semble fixe et standard et donc totalement automatisable !Mais en realite :

Plusieurs langages avec chacun ses specificites

Des variantes dans les langages (gtk vs Qt par exemple)

Problemes du multiplateforme/architecture/distribution

Grand nombre de fichiers 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

Page 12: Outils de construction pour la recherche

La construction d’application Quelques rappels ...

La construction d’applications C/C++

Cette presentation n’illustrera que les principes les plus courants de laconstruction d’applications C/C++

On ne parlera que tres peu des systemes embarques dans les IDE

On laissera les problemes lies aux compilateurs de cotes

On ne parlera que tres peu des outils/besoins post-compilation (testunitaires, ”packaging”, etc ...)

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 12 / 98

Page 13: Outils de construction pour la recherche

La construction d’application Quelques rappels ...

A long time ago, in a galaxy far far away... 9

Jusqu’a la fin 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 ConsideredHarmful”7.

Depuis de nombreux outils essayent d’ameliorer de processus 8.

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 13 / 98

Page 14: Outils de construction pour la recherche

La construction d’application Les ”Makefile”

La syntaxe du Makefile

Le fichier Makefile est compose de plusieurs regles de la forme :

cible : dependances

<TAB> commandes

cible : dependances

<TAB> commandes

Chaque commande est precedee d’une tabulation :

Makefile

prog : main.o functions .ogcc −o prog main.o functions .o

main.o : main.c functions .hgcc −c main.c

functions .o : functions .c functions .hgcc −c functions .c

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 14 / 98

Page 15: Outils de construction pour la recherche

La construction d’application Les ”Makefile”

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 Makefile alors cetteregle est a son tour evaluee

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 15 / 98

Page 16: Outils de construction pour la recherche

La construction d’application Les ”Makefile”

Les cibles classiques

all

Generation de toutes les cibles

.PHONY

Les dependances de cette cible sont toujours regenerees

clean

Suppression des fichiers intermediaires

Mproper / distclean

”clean” + suppression des fichiers cibles

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 16 / 98

Page 17: Outils de construction pour la recherche

La construction d’application Les ”Makefile”

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 suffixe

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 17 / 98

Page 18: Outils de construction pour la recherche

La construction d’application Les ”Makefile”

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

Page 19: Outils de construction pour la recherche

La construction d’application Les limitations et les solutions

Quels reproches au Make ancestral ?

Pas vraiment portable/multiplateforme : base sur des scripts shell etdes proprietes du systeme de fichiers. De plus les evolutions desdescandants (GNU Make, ...) ont des implementations particulierespour les fonctions manquantes (if-then-else par exemple).

Difficulte a monter en charge : L’evolution du code qui est necessairedans les gros projets s’articule souvent autour de changementd’arborescence ou de renommage de partie de code. Ceci entraine denombreux changements manuels dans les Makefile.

Le langage du Makefile ajoute une complexite qui n’a pas de raisond’etre. De plus il est relativement limite.

Les verifications d’evolutions de code sont superficielles.

Il n’y pas de systeme de detection implicite de dependances

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 19 / 98

Page 20: Outils de construction pour la recherche

La construction d’application Les limitations et les solutions

Quels reproches au Make ancestral ?

Pas vraiment portable/multiplateforme : base sur des scripts shell etdes proprietes du systeme de fichiers. De plus les evolutions desdescandants (GNU Make, ...) ont des implementations particulierespour les fonctions manquantes (if-then-else par exemple).

Difficulte a monter en charge : L’evolution du code qui est necessairedans les gros projets s’articule souvent autour de changementd’arborescence ou de renommage de partie de code. Ceci entraine denombreux changements manuels dans les Makefile.

Le langage du Makefile ajoute une complexite qui n’a pas de raisond’etre. De plus il est relativement limite.

Les verifications d’evolutions de code sont superficielles.

Il n’y pas de systeme de detection implicite de dependances

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 19 / 98

Page 21: Outils de construction pour la recherche

La construction d’application Les limitations et les solutions

Quels reproches au Make ancestral ?

Pas vraiment portable/multiplateforme : base sur des scripts shell etdes proprietes du systeme de fichiers. De plus les evolutions desdescandants (GNU Make, ...) ont des implementations particulierespour les fonctions manquantes (if-then-else par exemple).

Difficulte a monter en charge : L’evolution du code qui est necessairedans les gros projets s’articule souvent autour de changementd’arborescence ou de renommage de partie de code. Ceci entraine denombreux changements manuels dans les Makefile.

Le langage du Makefile ajoute une complexite qui n’a pas de raisond’etre. De plus il est relativement limite.

Les verifications d’evolutions de code sont superficielles.

Il n’y pas de systeme de detection implicite de dependances

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 19 / 98

Page 22: Outils de construction pour la recherche

La construction d’application Les limitations et les solutions

Quels reproches au Make ancestral ?

Pas vraiment portable/multiplateforme : base sur des scripts shell etdes proprietes du systeme de fichiers. De plus les evolutions desdescandants (GNU Make, ...) ont des implementations particulierespour les fonctions manquantes (if-then-else par exemple).

Difficulte a monter en charge : L’evolution du code qui est necessairedans les gros projets s’articule souvent autour de changementd’arborescence ou de renommage de partie de code. Ceci entraine denombreux changements manuels dans les Makefile.

Le langage du Makefile ajoute une complexite qui n’a pas de raisond’etre. De plus il est relativement limite.

Les verifications d’evolutions de code sont superficielles.

Il n’y pas de systeme de detection implicite de dependances

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 19 / 98

Page 23: Outils de construction pour la recherche

La construction d’application Les limitations et les solutions

Quels reproches au Make ancestral ?

Pas vraiment portable/multiplateforme : base sur des scripts shell etdes proprietes du systeme de fichiers. De plus les evolutions desdescandants (GNU Make, ...) ont des implementations particulierespour les fonctions manquantes (if-then-else par exemple).

Difficulte a monter en charge : L’evolution du code qui est necessairedans les gros projets s’articule souvent autour de changementd’arborescence ou de renommage de partie de code. Ceci entraine denombreux changements manuels dans les Makefile.

Le langage du Makefile ajoute une complexite qui n’a pas de raisond’etre. De plus il est relativement limite.

Les verifications d’evolutions de code sont superficielles.

Il n’y pas de systeme de detection implicite de dependances

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 19 / 98

Page 24: Outils de construction pour la recherche

La construction d’application Les limitations et les solutions

Ce qui a change aussi ...

Precedement :

Compiler votre codeFaire 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’internationalisationGenerer 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

Page 25: Outils de construction pour la recherche

La construction d’application Les limitations et les solutions

La notion d’integration continue 10

L’idee : verifier a chaque modification de code source que le resultat desmodifications ne produit pas de regression du logiciel (donc l’executable,mais aussi la documentation, les metriques, ...)Ceci implique donc une construction

rapide

flexible

standardisee (un minimum d’outils)

identique pour toutes les cibles (OS, architecture, ...)

A partir de la, nous pouvons imaginer la production de livrables, deversions journalieres(”nightly build”), des deploiements automatiques, lageneration automatique de l’historique (release notes), etc ...

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 21 / 98

Page 26: Outils de construction pour la recherche

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 laconstruction d’application.

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 22 / 98

Page 27: Outils de construction pour la recherche

La construction d’application Les limitations et les solutions

Vraiment un probleme nouveau ?

Debut des annees 90 :

imake pour XFree86

Cygnus et les ”gcc configure script” pour les outils GNU

autoconf

C’est cette derniere initiative qui fut la bonne.

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 23 / 98

Page 28: Outils de construction pour la recherche

La construction d’application Les limitations et les solutions

La reponse du monde libre

Creation d’autoconf en 1991 par David J. MacKenzie : apparition duscript ”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 ete fait ici a ete de s’appuyer sur les fonctionnalitespresentes sur le systeme en les testant (la partie configure), d’utiliser desoutils de construction traditionnels (make, ...) et d’installer le produit de lacompilation suivant des standards.De plus, il n’y aucun lien avec les environnements de travail desdeveloppeurs (IDE).

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 24 / 98

Page 29: Outils de construction pour la recherche

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

Page 30: Outils de construction pour la recherche

La construction d’application Les limitations et les solutions

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 26 / 98

Page 31: Outils de construction pour la recherche

GNU Autotools

2. GNU Autotools

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 27 / 98

Page 32: Outils de construction pour la recherche

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

Page 33: Outils de construction pour la recherche

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/configure/

http ://fsmsh.com/2754

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 29 / 98

Page 34: Outils de construction pour la recherche

GNU Autotools Les bases de GNU Autotools

GNU Autotools

Licence GPL, cree en 1992

Ecrit en shell + m4

Combinaison d’outils

Generation automatique de makefile

Makefiles generiques, parametrables

Configures automatiquement selon la plateforme

Bonne portabilite des developpements

Construction simple et transparente pour l’utilisateur :./configure,make,make install

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 30 / 98

Page 35: Outils de construction pour la recherche

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

Page 36: Outils de construction pour la recherche

GNU Autotools Les bases de GNU Autotools

On peut simplifier un peu...

On peut simplifier les 1eres etapes : autoreconf

La sequence serait donc :

Creation du ”configure.ac”Creation 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

Page 37: Outils de construction pour la recherche

GNU Autotools Les bases de GNU Autotools

Notre petit Hello World

src/ main.c

#include <stdio.h>int main(int argc , char* argv []){

printf (”Hello World\n”);return 0;}

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 33 / 98

Page 38: Outils de construction pour la recherche

GNU Autotools Les bases de GNU Autotools

Les 3 fichiers a editer

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

Page 39: Outils de construction pour la recherche

GNU Autotools GNU Autotools dans le detail

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

Declare config.h pour les entetes

Declare Makefile et src/ Makefile

Genere les fichiers specifies

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 35 / 98

Page 40: Outils de construction pour la recherche

GNU Autotools GNU Autotools dans le detail

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

Declare config.h pour les entetes

Declare Makefile et src/ Makefile

Genere les fichiers specifies

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 35 / 98

Page 41: Outils de construction pour la recherche

GNU Autotools GNU Autotools dans le detail

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

Declare config.h pour les entetes

Declare Makefile et src/ Makefile

Genere les fichiers specifies

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 35 / 98

Page 42: Outils de construction pour la recherche

GNU Autotools GNU Autotools dans le detail

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

Declare config.h pour les entetes

Declare Makefile et src/ Makefile

Genere les fichiers specifies

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 35 / 98

Page 43: Outils de construction pour la recherche

GNU Autotools GNU Autotools dans le detail

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

Declare config.h pour les entetes

Declare Makefile et src/ Makefile

Genere les fichiers specifies

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 35 / 98

Page 44: Outils de construction pour la recherche

GNU Autotools GNU Autotools dans le detail

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

Declare config.h pour les entetes

Declare Makefile et src/ Makefile

Genere les fichiers specifies

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 35 / 98

Page 45: Outils de construction pour la recherche

GNU Autotools GNU Autotools dans le detail

configure.ac en version plus complete

configure.ac

# Prelude.

AC_INIT([amhello], [1.0], [bug-report@address])

AM_INIT_AUTOMAKE([foreign -Wall -Werror])

# Verifications pour les programmesAC_PROG_CC

# Verifications pour les bibliotheques# Verifications pour les entetes# Verifications pour les typedefs, les structures, les options decompilateurs# Generation de fichiersAC_CONFIG_HEADERS([config.h])

AC_CONFIG_FILES([Makefile src/Makefile])

AC_OUTPUT

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 36 / 98

Page 46: Outils de construction pour la recherche

GNU Autotools GNU Autotools dans le detail

Exemples de verifications (et affectations) de programmes

AC_PROG_CC, AC_PROG_CXX, AC_PROG_F77, ...Verifications pour les compilateurs

AC_PROG_SED, AC_PROG_YACC, AC_PROG_LEX, ...Verifications 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 alorsVAL-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

Page 47: Outils de construction pour la recherche

GNU Autotools GNU Autotools dans le detail

Exemples de verifications (et affectations) de programmes

AC_PROG_CC, AC_PROG_CXX, AC_PROG_F77, ...Verifications pour les compilateurs

AC_PROG_SED, AC_PROG_YACC, AC_PROG_LEX, ...Verifications 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 alorsVAL-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

Page 48: Outils de construction pour la recherche

GNU Autotools GNU Autotools dans le detail

Exemples de verifications (et affectations) de programmes

AC_PROG_CC, AC_PROG_CXX, AC_PROG_F77, ...Verifications pour les compilateurs

AC_PROG_SED, AC_PROG_YACC, AC_PROG_LEX, ...Verifications 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 alorsVAL-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

Page 49: Outils de construction pour la recherche

GNU Autotools GNU Autotools dans le detail

Les macros utiles dans autoconf

AC_MSG_ERROR(ERROR-DESCRIPTION, [EXIT-STATUS])Affiche ERROR-DESCRIPTION (config.log) et arrete ‘configure’.

AC_MSG_WARN(ERROR-DESCRIPTION)Pareil, mais n’arrete 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])AC_SUBST([FOO])

FOO=foo

Les 3 ecritures sont equivalentes

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 38 / 98

Page 50: Outils de construction pour la recherche

GNU Autotools GNU Autotools dans le detail

Les macros utiles dans autoconf

AC_MSG_ERROR(ERROR-DESCRIPTION, [EXIT-STATUS])Affiche ERROR-DESCRIPTION (config.log) et arrete ‘configure’.

AC_MSG_WARN(ERROR-DESCRIPTION)Pareil, mais n’arrete 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])AC_SUBST([FOO])

FOO=foo

Les 3 ecritures sont equivalentes

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 38 / 98

Page 51: Outils de construction pour la recherche

GNU Autotools GNU Autotools dans le detail

Les macros utiles dans autoconf

AC_MSG_ERROR(ERROR-DESCRIPTION, [EXIT-STATUS])Affiche ERROR-DESCRIPTION (config.log) et arrete ‘configure’.

AC_MSG_WARN(ERROR-DESCRIPTION)Pareil, mais n’arrete 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])AC_SUBST([FOO])

FOO=foo

Les 3 ecritures sont equivalentesJohan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 38 / 98

Page 52: Outils de construction pour la recherche

GNU Autotools GNU Autotools dans le detail

Verification pour les bibliotheques

AC_CHECK_LIB(LIBRARY, FUNCT, [ACT-IF-FOUND], [ACT-IF-NOT])

Verifie si la LIBRARY existe et si elle contient FUNCT. Si oui, executeACT-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

Page 53: Outils de construction pour la recherche

GNU Autotools GNU Autotools dans le detail

Verification pour les bibliotheques

AC_CHECK_LIB(LIBRARY, FUNCT, [ACT-IF-FOUND], [ACT-IF-NOT])

Verifie si la LIBRARY existe et si elle contient FUNCT. Si oui, executeACT-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

Page 54: Outils de construction pour la recherche

GNU Autotools GNU Autotools dans le detail

Verification pour les entetes

AC_CHECK_HEADERS(HEADERS...)Verifie 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])

#define 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 verifier uniquement les entetes (sans les DEFINE)

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 40 / 98

Page 55: Outils de construction pour la recherche

GNU Autotools GNU Autotools dans le detail

Verification pour les entetes

AC_CHECK_HEADERS(HEADERS...)Verifie 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])

#define 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 verifier uniquement les entetes (sans les DEFINE)

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 40 / 98

Page 56: Outils de construction pour la recherche

GNU Autotools GNU Autotools dans le detail

Verification pour les entetes

AC_CHECK_HEADERS(HEADERS...)Verifie 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])

#define 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 verifier uniquement les entetes (sans les DEFINE)

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 40 / 98

Page 57: Outils de construction pour la recherche

GNU Autotools GNU Autotools dans le detail

Verification pour les entetes

AC_CHECK_HEADERS(HEADERS...)Verifie 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])

#define 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 verifier uniquement les entetes (sans les DEFINE)

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 40 / 98

Page 58: Outils de construction pour la recherche

GNU Autotools GNU Autotools dans le detail

Les Makefile.am

Makefile.am

SUBDIRS = src

src/ Makefile.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

Page 59: Outils de construction pour la recherche

GNU Autotools GNU Autotools dans le detail

La declaration des cibles

Makefile.am

option_

lieu_TYPE =

cibles ...

les cibles seront installees dans(”lieu”)

bin_ $(bindir)

lib_ $(libdir)

les cibles seront construitescommes (”TYPE”)

_PROGRAMS

_LIBRARIES

_LTLIBRARIES

_HEADERS

_SCRIPTS

_DATA

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 42 / 98

Page 60: Outils de construction pour la recherche

GNU Autotools GNU Autotools dans le detail

La declaration des cibles

Makefile.am

option_

lieu_TYPE =

cibles ...

les cibles seront installees dans(”lieu”)

bin_ $(bindir)

lib_ $(libdir)

les cibles seront construitescommes (”TYPE”)

_PROGRAMS

_LIBRARIES

_LTLIBRARIES

_HEADERS

_SCRIPTS

_DATA

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 42 / 98

Page 61: Outils de construction pour la recherche

GNU Autotools GNU Autotools dans le detail

La declaration des cibles

Makefile.am

option_

lieu_TYPE =

cibles ...

les cibles seront installees dans(”lieu”)

bin_ $(bindir)

lib_ $(libdir)

les cibles seront construitescommes (”TYPE”)

_PROGRAMS

_LIBRARIES

_LTLIBRARIES

_HEADERS

_SCRIPTS

_DATA

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 42 / 98

Page 62: Outils de construction pour la recherche

GNU Autotools La gestion des bibliotheques

Les bibliotheques

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 bibliotheques seront installees dans $(libdir).

Le nom des bilbiotheques doivent correspondre a lib*.a.

Les entetes publiques seront installees dans $(includedir).

Les entetes privees ne seront pas installees

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 43 / 98

Page 63: Outils de construction pour la recherche

GNU Autotools La gestion des bibliotheques

Les bibliotheques

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 bibliotheques seront installees dans $(libdir).

Le nom des bilbiotheques doivent correspondre a lib*.a.

Les entetes publiques seront installees dans $(includedir).

Les entetes privees ne seront pas installees

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 43 / 98

Page 64: Outils de construction pour la recherche

GNU Autotools La gestion des bibliotheques

Les bibliotheques

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 bibliotheques seront installees dans $(libdir).

Le nom des bilbiotheques doivent correspondre a lib*.a.

Les entetes publiques seront installees dans $(includedir).

Les entetes privees ne seront pas installees

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 43 / 98

Page 65: Outils de construction pour la recherche

GNU Autotools La gestion des bibliotheques

Les bibliotheques

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 bibliotheques seront installees dans $(libdir).

Le nom des bilbiotheques doivent correspondre a lib*.a.

Les entetes publiques seront installees dans $(includedir).

Les entetes privees ne seront pas installees

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 43 / 98

Page 66: Outils de construction pour la recherche

GNU Autotools La gestion des bibliotheques

Les bibliotheques

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 bibliotheques seront installees dans $(libdir).

Le nom des bilbiotheques doivent correspondre a lib*.a.

Les entetes publiques seront installees dans $(includedir).

Les entetes privees ne seront pas installees

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 43 / 98

Page 67: Outils de construction pour la recherche

GNU Autotools La gestion des bibliotheques

Les bibliotheques

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 bibliotheques seront installees dans $(libdir).

Le nom des bilbiotheques doivent correspondre a lib*.a.

Les entetes publiques seront installees dans $(includedir).

Les entetes privees ne seront pas installees

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 43 / 98

Page 68: Outils de construction pour la recherche

GNU Autotools Conclusion

Conclusion sur les GNU Autotools

Les contres :

Pour beaucoup Autotools est synonyme d’Autohell 13 : de nombreusesoptions et documentations.

La gestion des dependances et des decouvertes des fichiers est enpartie 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 ”distribution”est parfaite. Et donc ladistribution (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

Page 69: Outils de construction pour la recherche

GNU Autotools Conclusion

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 45 / 98

Page 70: Outils de construction pour la recherche

CMake

3. CMake

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 46 / 98

Page 71: Outils de construction pour la recherche

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

Page 72: Outils de construction pour la recherche

CMake Les bases de CMake

Les references

Les sources d’informations qui ont ete utilisees 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

Page 73: Outils de construction pour la recherche

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 fichier : CMakeLists.txt

Outil binaire monolithique

Multiplateforme (POSIX systems, Windows)

Generation automatique de ”makefile” en fonction de la plateforme

Makefiles generiques, parametrables

Configures 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

Page 74: Outils de construction pour la recherche

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

Page 75: Outils de construction pour la recherche

CMake Les bases de CMake

Mode operatoire

Creer et parametrer un fichier CMakeLists.txt dans chaque repertoiredu projet.

Utiliser la commande cmakeConstruction dans les sources du projet

cmake .

Construction hors des sources du projet

cmake path vers sources du projet

Generation des fichiers Makefile, ou .dsp, ou .sln, ...

Utilisables par les outils natifs

L’ensemble est mis en cache dans CMakeCache.txt (genere lors du 1erappel a cmake) :

Configuration de la construction (variables et valeurs)

En cas de probleme : modification manuelle ou via ccmake

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 51 / 98

Page 76: Outils de construction pour la recherche

CMake Les bases de CMake

Les 3 fichiers a editer pour notre petit HelloWorld

src/ main.c

#include <stdio.h>int main(int argc , char* argv []){

printf (”Hello 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

Page 77: Outils de construction pour la recherche

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

Page 78: Outils de construction pour la recherche

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

Page 79: Outils de construction pour la recherche

CMake CMake dans le detail

Les structures de controles

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

Page 80: Outils de construction pour la recherche

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

Page 81: Outils de construction pour la recherche

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

Page 82: Outils de construction pour la recherche

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 -G”Visual Studio 10” -DFOOBAR :BOOL=1

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 58 / 98

Page 83: Outils de construction pour la recherche

CMake CMake dans le detail

La GUI : NCurses

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 59 / 98

Page 84: Outils de construction pour la recherche

CMake CMake dans le detail

La GUI : Windows

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 60 / 98

Page 85: Outils de construction pour la recherche

CMake CMake dans le detail

Les modules

CMake propose des modules FIND LIBRARY afin de trouver les librairiesexternes utiles pour votre construction :

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 61 / 98

Page 86: Outils de construction pour la recherche

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

Page 87: Outils de construction pour la recherche

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 parametrage se fait dans CPackSourceConfig.cmake

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 63 / 98

Page 88: Outils de construction pour la recherche

CMake Conclusion

Conclusion sur CMake

Les contres :

Syntaxe propre

Flexibilite restreinte (bien pense quand meme !)

Comme les GNU Autotools, ce n’est pas un systeme de construction :C’est un generateur de fichier de configuration pour les systemes deconstruction

Les pours :

Communaute croissante (et KDE !)

Tres interessant dans le contexte scientifique (imagerie)

Vrai multiplateforme / pas uniquement POSIX

Les ajouts : CPack, CDash, CTest

Les ”Modules” (+250 dans la derniere version)

GUI de configuration

Autoconfiguration (librairie partagee, debug, etc ...)

Outil tres stableJohan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 64 / 98

Page 89: Outils de construction pour la recherche

CMake Conclusion

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 65 / 98

Page 90: Outils de construction pour la recherche

SCons

4. SCons

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 66 / 98

Page 91: Outils de construction pour la recherche

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

Page 92: Outils de construction pour la recherche

SCons Les bases de SCons

Les references

Les sources d’informations qui ont ete utilisees 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

Page 93: Outils de construction pour la recherche

SCons Les bases de SCons

SCons

Licence MIT

Cree en 2000 (suite au projet Cons en Perl)

Ecrit en python

Syntaxe python dans des fichiers 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 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

Page 94: Outils de construction pour la recherche

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

Page 95: Outils de construction pour la recherche

SCons Les bases de SCons

Mode operatoire

Creer et parametrer un fichier SConstruct a la racine et des fichiersSConscript dans chaque repertoire du projet.

Utiliser la commande scons

scons

L’ensemble des informations intermediaires est mis en cache dans lefichier .sconsign.dblite

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 71 / 98

Page 96: Outils de construction pour la recherche

SCons Les bases de SCons

Les 3 fichiers a editer pour notre petit HelloWorld

src/ main.c

#include <stdio.h>int main(int argc , char* argv []){

printf (”Hello 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

Page 97: Outils de construction pour la recherche

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

Page 98: Outils de construction pour la recherche

SCons SCons dans le detail

Les possibilites du SConscript

Pour faire simple, quasiment tout est possible ! C’est un fichier qui estinterprete en Python. Il est par exemple possible de definir desenvironnements 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.oJohan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 74 / 98

Page 99: Outils de construction pour la recherche

SCons SCons dans le detail

Afficher 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

Page 100: Outils de construction pour la recherche

SCons SCons dans le detail

La reconstruction

Timestamp comme Makefiles

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

Page 101: Outils de construction pour la recherche

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

Page 102: Outils de construction pour la recherche

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

Page 103: Outils de construction pour la recherche

SCons SConspiracy

Un exemple d’extension : SConspiracy

Yams++ ⇒ SConspiracy (racy)

Construction d’application

C++MultiplateformeOrientee composantEn environnement controle

Open source, Licence BSD

http://code.google.com/p/sconspiracy/

Compatibilite avec Yams++ (ancetre 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

Page 104: Outils de construction pour la recherche

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)

Detection automatique de ce qui doit etre compile

Obtenir un workflow 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 bibliothequesexternes

Gestion de multiples projets independants ou a composants communs

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 80 / 98

Page 105: Outils de construction pour la recherche

SCons SConspiracy

Base de developpement et projets

Un ou plusieurs repertoires contenant des projets

Arborescence non structuree

Noms de projets uniques, compose par [}a-zA-Z0-9{]+

Un projet ne peut pas se trouver dans le repertoire d’un autre projet

Repertoire structure (Sources + ressources + configuration-

Nom du repertoire ⇒ nom du projet

Structure du repertoireprj/bin/build.optionsprj/includeprj/srcprj/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

Page 106: Outils de construction pour la recherche

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

Page 107: Outils de construction pour la recherche

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.optionshello/src/program.cpp

build.options - ’sconspirator’

sconspirator/bin/build.optionssconspirator/include/SConspirator.hppsconspirator/src/SConspirator.cpp

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 83 / 98

Page 108: Outils de construction pour la recherche

SCons SConspiracy

Application + libs

IndenterObj

A

instance de A::IndenterInstance de A::Obj

ObjB

instance de A::IndenterInstance de B::Obj

ObjF

instance de A::IndenterInstance de B::Obj

ObjC

instance de A::IndenterInstance de B::Obj

ObjD

instance de A::IndenterInstance de D::ObjInstance de F::Obj

ObjE

Instance de E::ObjApp

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 84 / 98

Page 109: Outils de construction pour la recherche

SCons SConspiracy

Application + libs + libext

IndenterObj

A

instance de A::IndenterInstance de A::Obj

ObjB

Shared_ptr sur une instance de A::IndenterShared_ptr sur une Instance de B::Obj

ObjG

Instance de E::ObjAppBoost

Boost

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 85 / 98

Page 110: Outils de construction pour la recherche

SCons Conclusion

Conclusion sur SCons

Les contres :

Si mal configure, il peut-etre lent sur des gros projets

Necessaire de le ”specialiser” a 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 fichiers pour construire, il construit

Permet d’avoir des processus de construction ”maison”, ce qui estnecessaire a partir d’une certaine taille de projet/equipe

Autoconfiguration (librairie partagee, warnings, etc ...)

Complements extremement interessants (scons-addons, SConspiracy,sbf, swtoolkit, scons-plusplus, ...)

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 86 / 98

Page 111: Outils de construction pour la recherche

SCons Conclusion

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 87 / 98

Page 112: Outils de construction pour la recherche

Les autres

5. Les autres

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 88 / 98

Page 113: Outils de construction pour la recherche

Les autres

Sommaire

Les autres

Ant

Maven

Qmake

Et de nombreux autres

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 89 / 98

Page 114: Outils de construction pour la recherche

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 dedocumentation (Javadoc), aux generateurs de rapports, auxverificateurs 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

Page 115: Outils de construction pour la recherche

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 simplifier laconfiguration 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 leschercher)

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

Page 116: Outils de construction pour la recherche

Les autres qmake

qmake 19

Outil de construction fournit avec Qt

A l’origine TMake (un script Perl)

Meme architecture que TMake, difficile a maintenir

Semble se faire petit a petit remplacer par CMake 18

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 92 / 98

Page 117: Outils de construction pour la recherche

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 configuration.

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

Page 118: Outils de construction pour la recherche

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 lecode .Net (C#, VB, ...). Ses fichiers de configurations s’ecrivent enXML. 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

Page 119: Outils de construction pour la recherche

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

Page 120: Outils de construction pour la recherche

Les autres Et de nombreux autres

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 96 / 98

Page 121: Outils de construction pour la recherche

Conclusion

Conclusion

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 97 / 98

Page 122: Outils de construction pour la recherche

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 deconstruction 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, meme si c’est difficile.

Vous pouvez gagner en efficacite et en visibilite sur votre projet.

Johan Moreau (IRCAD) ENVOL - Outils de construction 27 septembre 2010 98 / 98