Changes between Initial Version and Version 1 of AntResume


Ignore:
Timestamp:
Jun 21, 2006, 11:22:29 AM (18 years ago)
Author:
Le Meur
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AntResume

    v1 v1  
     1= Ant versus Make =
     2
     3---+++(Jean-Noël Albert / Avril 2005 / Groupe de développeurs du LAL)
     4---+++présentation
     5
     6Make et Ant sont tous deux des systèmes pour la construction d'application.
     7
     8Make :
     9   * est un standard UNIX
     10   * est orienté “tâche à accomplir”
     11tandis que Ant :
     12   * vise la portabilité
     13   * est orienté “enchaînement de taches”
     14   * est extensible
     15   * est écrit en Java et donc très bien adapté aux développements Java
     16---+++ Make
     17_c'est l'histoire d'un make…_
     18
     19Make est devenu un standard au même titre que UNIX
     20   * il existe une implémentation de Make par variante de UNIX, globalement similaires, mais assez différentes dans les détails pour rendre difficile les portages ;
     21   * plus une variante GNU : GNU Make ou GMake
     22      * la plus riche en extensions ;
     23      * la plus utilisée par les développeurs ;
     24      * adoptée par Linux.
     25---+++ L'approche Make
     26---++++ Principe : on décrit le but à atteindre, et non pas la façon d'y parvenir.
     27Exemple : pour construire le programme _hello_ à partir du source _hello.c_, il suffit de lancer la commande :
     28
     29% *make hello*
     30
     31
     32Make procède automatiquement à la recherche des fichiers qui lui permettent d'atteindre le but demandé (la construction de _hello_). Il trouve un fichier _hello.c_. Il dispose d'une règle interne lui permettant de passer d'un fichier C à une application. Il lance la compilation et l'édition de liens C.
     33
     34Résultat :
     35<verbatim>
     36cc     hello.c   -o hello
     37</verbatim>
     38Et le programme hello est construit. Ca marcherait aussi avec un fichier source en Fortran, en C++ etc.
     39
     40Si on relance la même commande :
     41
     42% *make hello*
     43<verbatim>
     44make: `hello' is up to date.
     45</verbatim>
     46
     47Il n'y a rien à faire, puisque l'application hello vient d'être compilée et que la source _hello.c_ n'a pas changé.
     48Si on modifie le fichier source :
     49
     50% *touch hello.c*
     51
     52% *make hello*
     53
     54<verbatim>
     55cc     hello.c   -o hello
     56</verbatim>
     57
     58Make détecte que le fichier source est plus récent que l'application compilée et la reconstruit.
     59
     60Make se base sur la date des fichiers pour savoir quels fichiers reconstruire.
     61
     62Si l'application dépend de plusieurs sources, Make ne reconstruit que ce qui a changé. Il s'ensuit un _gain de temps_ (surtout avec C++ qui est long à compiler) ; et l'application est toujours en phase avec les développements.
     63
     64---+++ Makefile
     65Pour des applications plus compliquées, on utilise un fichier de description nommé *Makefile* (_makefile_ est également accepté – et selon la mouture de Make, d'autres fichiers sont reconnus et traités ; par exemple GMake utilise de préférence le fichier GNUmakefile, si celui-ci existe dans le répertoire).
     66
     67Le fichier de description contient une liste de “buts à atteindre” (appelés le plus souvent “cible”) et les moyens d'y parvenir.
     68
     69Lorsqu'un fichier Makefile existe dans le répertoire, Make le lit et exécute le premier “objectif”. Pour exécuter un autre objectif, on l'indique sur la ligne de commandes de Make.
     70Exemple d'un fichier Makefile simple :
     71<verbatim>
     72hello : hello.c
     73
     74# Supprime les fichiers compilés et les sauvegardes XEmacs
     75clean :
     76   rm hello hello.o *~
     77</verbatim>
     78
     79Pour construire l'application :
     80
     81% *make*
     82<verbatim>
     83cc    -c -o hello.o hello.c
     84cc   hello.o   -o hello
     85</verbatim>
     86
     87Make exécute le premier objectif du fichier (hello).
     88
     89Un but peut dépendre d'étapes intermédiaires (par exemple pour la construction de librairies).
     90
     91Exemple très simplifié :
     92<verbatim>
     93hello : hello.o
     94
     95hello.o : hello.c
     96</verbatim>
     97
     98Un but peut ne correspondre à aucun fichier, comme "clean" dans l'exemple précédent. Dans ce cas, il sera toujours accompli.
     99
     100Exemple : suppression des fichiers compilés :
     101
     102% *make clean*
     103<verbatim>
     104rm hello hello.o *~
     105</verbatim>
     106---+++ Principaux inconvénients
     107   * Lorsque les Makefiles deviennent compliqués, on ne sait pas toujours très bien quel va être le cheminement de Make, ni s'il va exécuter les étapes prévues, et dans quel ordre.
     108   * Pas très bien adapté à des projets comportant plusieurs répertoires – il faut souvent un fichier Makefile par répertoire, plus un fichier Makefile général pour reconstruire l'application pour chacun des répertoires.
     109   * Il faut souvent imposer à Make les opérations à réaliser, en fonction des saveurs de UNIX : options de compilations différentes d'une variante à l'autre, commandes différentes d'une plate-forme à l'autre, …
     110      * portage difficile - principales difficultés : les options de CC ;
     111      * GMake introduit des blocs if … else … pour tenir compte des plates-formes
     112         * ne simplifie pas la compréhension des fichiers Makefile ;
     113         * nécessite d'installer GMake (on peut aller le chercher sur le site GNU).
     114   * Portage difficile vers Windows (80-90 % des postes de travail)
     115      * principale difficulté : les noms de fichiers Windows sont incompatibles avec les noms de fichiers UNIX ;
     116Exemple :
     117         * UNIX : /usr/bin/cc
     118         * Windows : C:\Windows\system32\cc.exe
     119      * une possibilité : *Cygwin* (portage des commandes UNIX sous Windows) - représente les fichiers Windows avec la syntaxe UNIX - utilise GMake
     120         * Exemple : /c/Windows/system32/cc.exe   (le ".exe" est alors optionnel)
     121         * problème : les applications natives de Windows (comme par exemple Java) ne reconnaissent pas les noms UNIX.
     122---+++ Ant
     123La construction de l'application se fait en indiquant une succession d'opérations à réaliser.
     124
     125Ant utilise un fichier *build.xml*.
     126
     127Une tâche peut dépendre d'une ou de plusieurs autres tâches.
     128L'exécution d'une tâche peut dépendre de conditions, par exemple pour ne pas construire une partie du code qui dépend d'une librairie qui n'est pas installée (exemple : un interface d'accès au HPSS du CC IN2P3).
     129
     130Tout comme Make, Ant ne traite que les fichiers plus récents que les résultats à obtenir.
     131
     132Ant assure qu'une tache ne sera accomplie qu'une seule fois dans le processus de construction :
     133   * ceci évite des situations de bouclage apparaissant avec Make lorsqu'une cible intermédiaire est en prémisse de plusieurs autres cibles
     134      * cas typiques : génération de fichiers à partir de sources qui ne sont pas des fichiers (base de données, …)
     135
     136Plutôt que de laisser l'utilisateur indiquer les commandes à exécuter (rm, cc, …), Ant fournit un ensemble de taches permettant de réaliser les opérations escomptées :
     137   * compiler les fichiers sources
     138   * construire une librairie
     139   * construire la documentation
     140   * créer des répertoires
     141   * supprimer des fichiers de travail
     142   *    …
     143Ant intègre la notion d'opérations récursives sur un ensemble de fichiers et de répertoires. Il vise la portabilité et tente de masquer les opérations sur les fichiers. Il est bien adapté à Java.
     144---+++ Java, Make & Ant
     145Les projets Java sont naturellement organisés en packages, et les fichiers sources doivent être placés dans une hiérarchie de répertoires reproduisant la hiérarchie des packages.
     146
     147Le processus de compilation doit donc parcourir tous les répertoires - l'ordre n'est pas très important grâce au mécanisme de compilation incrémental de Java.
     148
     149Make ne pas très bien adapté à cette situation; il y aurait deux possibilités : tout recompiler à chaque fois (lourd) ou lancer Make sur chacun des répertoires (peu pratique).
     150
     151Mêmes difficultés pour construire la documentation (JavaDoc) : il faut passer en revue tous les répertoires.
     152
     153Ant permet de résoudre la plupart de ces difficultés en trois taches :
     154<verbatim>
     155<javac srcdir="sources/" destdir="classes/" />
     156<jar destfile="lib/hello.jar" basedir="classes/" />
     157<javadoc packagenames="demo" sourcepath="sources/" destdir="docs/" />
     158</verbatim>
     159
     160L'exemple complet :
     161<verbatim>
     162<?xml version="1.0"?>
     163<project name="Hello" default="build" basedir=".">
     164
     165  <target name="build">
     166    <javac srcdir="sources/" destdir="classes/" />
     167    <jar destfile="lib/hello.jar" basedir="classes/" />
     168  </target>
     169
     170  <target name="doc" depends="build">
     171    <javadoc packagenames="demo"
     172             sourcepath="sources/"
     173             destdir="docs/" />
     174  </target>
     175
     176  <target name="clean">
     177    <delete>
     178      <fileset dir="." defaultexcludes="no">
     179        <include name="**/*~"/>   <!-- XEmacs -->
     180        <include name="**/*.class"/>   <!-- Classes Java -->
     181        <include name="lib/*.jar"/>   <!-- Library Java -->
     182        <include name="docs/**/*" />   <!-- Javadoc -->
     183      </fileset>
     184    </delete>
     185   </target>
     186
     187</project>
     188</verbatim>
     189
     190
     191La construction de l'application :
     192
     193% *ant*
     194<verbatim>
     195Buildfile: build.xml
     196
     197build:
     198    [javac] Compiling 1 source file to /albert/Test/classes
     199      [jar] Building jar: /albert/Test/lib/hello.jar
     200
     201BUILD SUCCESSFUL
     202Total time: 3 seconds
     203</verbatim>
     204
     205L'élimination des fichiers intermédiaires (par exemple, après l'installation du projet)
     206
     207% ant *clean*
     208<verbatim>
     209Buildfile: build.xml
     210
     211clean:
     212   [delete] Deleting 2 files from /albert/Test
     213
     214BUILD SUCCESSFUL
     215Total time: 1 second
     216</verbatim>
     217
     218---+++ Portabilité
     219Ant est écrit en Java, donc portable.
     220
     221Exemple : exécution du même script Ant sous Windows/XP et Cygwin :
     222
     223$ *ant doc*
     224<verbatim>
     225Buildfile: build.xml
     226
     227build:
     228    [javac] Compiling 1 source file to D:\Projets\test\classes
     229      [jar] Building jar: D:\Projets\test\lib\hello.jar
     230doc:
     231  [javadoc] Generating Javadoc
     232  [javadoc] Javadoc execution
     233  [javadoc] Loading source files for package demo...
     234  [javadoc] Constructing Javadoc information...
     235  [javadoc] Standard Doclet version 1.5.0_01
     236  [javadoc] Building tree for all the packages and classes...
     237  [javadoc] Building index for all the packages and classes...
     238  [javadoc] Building index for all classes...
     239
     240BUILD SUCCESSFUL
     241Total time: 9 seconds
     242</verbatim>
     243
     244
     245Bien qu'on soit dans une émulation de l'environnement UNIX, les fichiers sont indiqués à Java en utilisant la notation native (le Java de Windows ne reconnaît pas la notation UNIX des fichiers…).
     246
     247Autre exemple sous le shell Windows natif :
     248
     249D:\Projets\test> *PATH D:\externals\Ant\apache-ant-1.6.2\bin;%PATH%*
     250
     251D:\Projets\test> *ant doc*
     252<verbatim>
     253Buildfile: build.xml
     254
     255build:
     256    [javac] Compiling 1 source file to D:\Projets\test\classes
     257      [jar] Building jar: D:\Projets\test\lib\hello.jar
     258  [javadoc] Generating Javadoc
     259  [javadoc] Javadoc execution
     260  [javadoc] Loading source files for package demo...
     261  [javadoc] Constructing Javadoc information...
     262  [javadoc] Standard Doclet version 1.5.0_01
     263  [javadoc] Building tree for all the packages and classes...
     264  [javadoc] Building index for all the packages and classes...
     265  [javadoc] Building index for all classes...
     266
     267BUILD SUCCESSFUL
     268Total time: 4 seconds
     269</verbatim>
     270---+++Extension
     271On peut ajouter des tâches en fournissant une archive Jar contenant les classes exécutant les nouvelles opérations et en définissant cette librairie dans le fichier *build.xml*.
     272
     273Il n'y a pas de reconstruction de Ant : le chargement des librairies Java est dynamique (-> à l'exécution).
     274
     275Cet aspect est utilisé par exemple pour le support de C++ et de Doxygen.
     276
     277Un exemple de fichier build.xml utilisant l'extension C++ :
     278<verbatim>
     279<?xml version="1.0"?>
     280<project name="Ant++" default="build" basedir=".">
     281
     282<taskdef resource="net/sf/antcontrib/antcontrib.properties"/>
     283<taskdef resource="cpptasks.tasks"/>
     284<typedef resource="cpptasks.types"/>
     285
     286<target name="build">
     287    <cc link="executable" outfile="demo.exe">
     288   <fileset dir=".">
     289     <include name="*.cc"/>
     290   </fileset>
     291   <syslibset libs="c,stdc++"/>
     292    </cc>
     293</target>
     294
     295</project>
     296</verbatim>
     297Exemple Linux :
     298
     299% *ant*
     300<verbatim>
     301Buildfile: build.xml
     302
     303build:
     304       [cc] 1 total files to be compiled.
     305       [cc] Starting link
     306
     307BUILD SUCCESSFUL
     308Total time: 2 seconds
     309</verbatim>
     310
     311% *./demo.exe*
     312<verbatim>
     313Hello, world !
     314</verbatim>
     315Sous Windows, on peut utiliser Cygwin pour avoir un compilateur C++.
     316
     317Le mécanisme pour écrire des tâches Ant est détaillé dans _Writing Your Own Task_.
     318---+++ Intégration
     319Ant est accepté par de nombreux IDE (_Integrated Development Environment_) : Eclipse, JBuilder, !VisualAge for Java, !WebSphere Studio.
     320---+++ Liens
     321   * Ant :         http://ant.apache.org/
     322   * Documentation Ant : http://ant.apache.org/manual/index.html
     323   * C++ / Ant :      http://sourceforge.net/projects/ant-contrib/
     324         Note :  il faut prendre aussi la distribution cpptasks
     325   * Doxygen / Ant :   http://www.sourceforge.net/projects/ant-doxygen
     326   * Cygwin :      http://cygwin.com/
     327   * GNU :         http://www.gnu.org/