Changes between Version 1 and Version 2 of AntResume
- Timestamp:
- Jun 21, 2006, 11:40:40 AM (18 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
AntResume
v1 v2 1 1 = Ant versus Make = 2 2 3 ---+++(Jean-Noël Albert / Avril 2005 / Groupe de développeurs du LAL) 4 ---+++présentation 3 === (Jean-Noël Albert / Avril 2005 / Groupe de développeurs du LAL) === 4 5 == présentation == 5 6 6 7 Make et Ant sont tous deux des systèmes pour la construction d'application. 7 8 8 9 Make : 9 10 10 * est un standard UNIX 11 * est orienté “tâche à accomplir” 11 12 tandis 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…_ 13 * vise la portabilité 14 * est orienté “enchaînement de taches” 15 * est extensible 16 * est écrit en Java et donc très bien adapté aux développements Java 17 18 == Make == 19 ''c'est l'histoire d'un make…'' 18 20 19 21 Make 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. 27 Exemple : pour construire le programme _hello_ à partir du source _hello.c_, il suffit de lancer la commande : 28 29 % *make hello* 30 31 32 Make 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. 22 * 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 ; 23 * plus une variante GNU : GNU Make ou GMake 24 * la plus riche en extensions ; 25 * la plus utilisée par les développeurs ; 26 * adoptée par Linux. 27 28 == L'approche Make == 29 === Principe : on décrit le but à atteindre, et non pas la façon d'y parvenir. === 30 Exemple : pour construire le programme ''hello'' à partir du source ''hello.c'', il suffit de lancer la commande : 31 32 % '''make hello''' 33 34 35 Make 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 36 34 37 Résultat : 35 <verbatim> 38 39 {{{ 36 40 cc hello.c -o hello 37 </verbatim> 41 }}} 38 42 Et le programme hello est construit. Ca marcherait aussi avec un fichier source en Fortran, en C++ etc. 39 43 40 44 Si on relance la même commande : 41 45 42 % *make hello*43 <verbatim> 46 % '''make hello''' 47 {{{ 44 48 make: `hello' is up to date. 45 </verbatim> 46 47 Il n'y a rien à faire, puisque l'application hello vient d'être compilée et que la source _hello.c_n'a pas changé.49 }}} 50 51 Il n'y a rien à faire, puisque l'application hello vient d'être compilée et que la source 'hello.c'' n'a pas changé. 48 52 Si on modifie le fichier source : 49 53 50 % *touch hello.c*51 52 % *make hello*53 54 <verbatim> 54 % '''touch hello.c''' 55 56 % '''make hello''' 57 58 {{{ 55 59 cc hello.c -o hello 56 </verbatim> 60 }}} 57 61 58 62 Make détecte que le fichier source est plus récent que l'application compilée et la reconstruit. … … 62 66 Si 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 67 64 ---+++ Makefile 65 Pour 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).68 == Makefile == 69 Pour 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 70 67 71 Le fichier de description contient une liste de “buts à atteindre” (appelés le plus souvent “cible”) et les moyens d'y parvenir. … … 69 73 Lorsqu'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. 70 74 Exemple d'un fichier Makefile simple : 71 <verbatim> 75 {{{ 72 76 hello : hello.c 73 77 … … 75 79 clean : 76 80 rm hello hello.o *~ 77 </verbatim> 81 }}} 78 82 79 83 Pour construire l'application : 80 84 81 % *make*82 <verbatim> 85 % '''make''' 86 {{{ 83 87 cc -c -o hello.o hello.c 84 88 cc hello.o -o hello 85 </verbatim> 89 }}} 86 90 87 91 Make exécute le premier objectif du fichier (hello). … … 90 94 91 95 Exemple très simplifié : 92 <verbatim> 96 {{{ 93 97 hello : hello.o 94 98 95 99 hello.o : hello.c 96 </verbatim> 100 }}} 97 101 98 102 Un but peut ne correspondre à aucun fichier, comme "clean" dans l'exemple précédent. Dans ce cas, il sera toujours accompli. … … 100 104 Exemple : suppression des fichiers compilés : 101 105 102 % *make clean*103 <verbatim> 106 % '''make clean''' 107 {{{ 104 108 rm 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 ; 116 Exemple : 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 109 }}} 110 111 == Principaux inconvénients == 112 113 * 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. 114 * 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. 115 * 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, … 116 * portage difficile - principales difficultés : les options de CC ; 117 * GMake introduit des blocs if … else … pour tenir compte des plates-formes 118 * ne simplifie pas la compréhension des fichiers Makefile ; 119 * nécessite d'installer GMake (on peut aller le chercher sur le site GNU). 120 * Portage difficile vers Windows (80-90 % des postes de travail) 121 * principale difficulté : les noms de fichiers Windows sont incompatibles avec les noms de fichiers UNIX Exemple : 122 * UNIX : /usr/bin/cc 123 * Windows : C:\Windows\system32\cc.exe 124 * une possibilité : '''Cygwin''' (portage des commandes UNIX sous Windows) - représente les fichiers Windows avec la syntaxe UNIX - utilise GMake 125 * Exemple : /c/Windows/system32/cc.exe (le ".exe" est alors optionnel) 126 * problème : les applications natives de Windows (comme par exemple Java) ne reconnaissent pas les noms UNIX. 127 128 == Ant == 129 123 130 La construction de l'application se fait en indiquant une succession d'opérations à réaliser. 124 131 125 Ant utilise un fichier *build.xml*.132 Ant utilise un fichier '''build.xml'''. 126 133 127 134 Une tâche peut dépendre d'une ou de plusieurs autres tâches. … … 131 138 132 139 Ant assure qu'une tache ne sera accomplie qu'une seule fois dans le processus de construction : 133 134 140 * ceci évite des situations de bouclage apparaissant avec Make lorsqu'une cible intermédiaire est en prémisse de plusieurs autres cibles 141 * cas typiques : génération de fichiers à partir de sources qui ne sont pas des fichiers (base de données, …) 135 142 136 143 Plutô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 * … 144 * compiler les fichiers sources 145 * construire une librairie 146 * construire la documentation 147 * créer des répertoires 148 * supprimer des fichiers de travail 149 * … 150 143 151 Ant 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 152 153 == Java, Make & Ant == 154 145 155 Les 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 156 … … 152 162 153 163 Ant permet de résoudre la plupart de ces difficultés en trois taches : 154 <verbatim> 164 {{{ 155 165 <javac srcdir="sources/" destdir="classes/" /> 156 166 <jar destfile="lib/hello.jar" basedir="classes/" /> 157 167 <javadoc packagenames="demo" sourcepath="sources/" destdir="docs/" /> 158 </verbatim> 168 }}} 159 169 160 170 L'exemple complet : 161 <verbatim> 171 {{{ 162 172 <?xml version="1.0"?> 163 173 <project name="Hello" default="build" basedir="."> … … 186 196 187 197 </project> 188 </verbatim> 198 }}} 189 199 190 200 191 201 La construction de l'application : 192 202 193 % *ant*194 <verbatim> 203 % '''ant''' 204 {{{ 195 205 Buildfile: build.xml 196 206 … … 201 211 BUILD SUCCESSFUL 202 212 Total time: 3 seconds 203 </verbatim> 213 }}} 204 214 205 215 L'élimination des fichiers intermédiaires (par exemple, après l'installation du projet) 206 216 207 % ant *clean*208 <verbatim> 217 % ant '''clean''' 218 {{{ 209 219 Buildfile: build.xml 210 220 … … 214 224 BUILD SUCCESSFUL 215 225 Total time: 1 second 216 </verbatim> 217 218 ---+++ Portabilité 226 }}} 227 228 == Portabilité == 219 229 Ant est écrit en Java, donc portable. 220 230 221 231 Exemple : exécution du même script Ant sous Windows/XP et Cygwin : 222 232 223 $ *ant doc*224 <verbatim> 233 $ '''ant doc''' 234 {{{ 225 235 Buildfile: build.xml 226 236 … … 240 250 BUILD SUCCESSFUL 241 251 Total time: 9 seconds 242 </verbatim> 252 }}} 243 253 244 254