1 | <? // // File : portfileHOWTO.php // Version : $Id: portfileHOWTO.php,v 1.9 2002/12/06 07:15:40 michaelm Exp $ // Location : /projects/darwinports/portfileHOWTO.php // include_once("$DOCUMENT_ROOT/includes/od_lib.inc.php"); od_print_header("How to Write a DarwinPorts Portfile", "fr", "iso-8859-1", "", 0); ?> |
---|
2 | <h2> |
---|
3 | Comment écrire un Portfile pour Darwinports |
---|
4 | </h2> |
---|
5 | <pre><tt> |
---|
6 | Kevin Van Vechten | <a href="mailto:kevin@opendarwin.org">kevin@opendarwin.org</a> |
---|
7 | 8-Oct-2002 |
---|
8 | </tt></pre> |
---|
9 | <h3> |
---|
10 | Divers |
---|
11 | </h3> |
---|
12 | <p> |
---|
13 | DarwinPorts automatise les tâches usuelles requises pour le portage de logiciel sur Darwin. Les Portfiles contiennent les informations nécessaires pour que la compilation et l'installation de logiciels particuliers soient faites correctement sous Darwin. Le but de DarwinPorts est de pouvoir garder la syntaxe des Portfiles aussi simple que possible, tout en supportant les cas spéciaux requis par la compilation et l'installation de beaucoup de logiciel afin que tout se passe avec succès. |
---|
14 | </p> |
---|
15 | <p> |
---|
16 | Cet article décrit la constitution d'un simple Portfile, et explore les fonctions les plus communes à DarwinPorts. |
---|
17 | </p> |
---|
18 | <h3> |
---|
19 | Commencer |
---|
20 | </h3> |
---|
21 | <p> |
---|
22 | Pour pouvoir travailler avec DarwinPorts, vous devrez le télécharger et l'installer sur votre système. La <a href="http://opendarwin.org/projects/darwinports/fr/">page d'accueil</a> du projet DarwinPorts décrit comment se le procurer et l'installer. |
---|
23 | </p> |
---|
24 | <p> |
---|
25 | Comme vous vous intéressez à l'écriture d'un Portfile, changeons quelques options de configuration qui vous aidera au déboguage. Éditez le fichier <tt>/etc/ports/ports.conf</tt> afin que les changements suivants y soient incorporés (vous devrez passer par <tt>sudo</tt> pour pouvoir éditer ce fichier) : |
---|
26 | </p> |
---|
27 | <pre><tt> |
---|
28 | ports_debug yes |
---|
29 | ports_verbose yes |
---|
30 | </tt></pre> |
---|
31 | <p> |
---|
32 | Cela affichera des messages utiles pour le déboguage qui sont normalement omis lors de l'utilisation de DarwinPorts. |
---|
33 | </p> |
---|
34 | <p> |
---|
35 | DarwinPorts effectuera plusieurs tâches basiques prédéfinies, qui sont : |
---|
36 | </p> |
---|
37 | <a name="basictoc"></a> |
---|
38 | <h4> |
---|
39 | Sujets basiques |
---|
40 | </h4> |
---|
41 | <ul> |
---|
42 | <li><a href="#fetch">Récupération des sources</a></li> |
---|
43 | <li><a href="#checksum">Vérification du fichier téléchargé</a></li> |
---|
44 | <li><a href="#extract">Extraction des sources dans le répertoire de travail</a></li> |
---|
45 | <li><a href="#configure">Exécution d'un script Configure</a></li> |
---|
46 | <li><a href="#build">Compilation des sources</a></li> |
---|
47 | <li><a href="#install">Installation du programme dans le système</a></li> |
---|
48 | </ul> |
---|
49 | <a name="advancedtoc"></a> |
---|
50 | <h4> |
---|
51 | Sujets avancés |
---|
52 | </h4> |
---|
53 | <ul> |
---|
54 | <li><a href="#targets">Modifier des cibles</a></li> |
---|
55 | <li><a href="#variants">Variantes du Portfile</a></li> |
---|
56 | </ul> |
---|
57 | <a name="appendixtoc"></a> |
---|
58 | <h4> |
---|
59 | Annexe |
---|
60 | </h4> |
---|
61 | <ul> |
---|
62 | <li><a href="#portfilelist">Aperçu d'un Portfile</a></li> |
---|
63 | <li><a href="#contentslist">Liste de contents</a></li> |
---|
64 | </ul> |
---|
65 | <h3> |
---|
66 | <a name="fetch"></a>Récupération des sources |
---|
67 | </h3> |
---|
68 | <p> |
---|
69 | La première chose à faire est de choisir un logiciel à porter. Pour cet exemple, nous allons utiliser ircII, un client IRC populaire. Nous commencerons avec un Portfile simple, décrivant les attributs basiques d'ircII comme son nom, sa version et le site où nous pouvons télécharger les sources. Créez un répertoire de travail nommé <tt>ircii</tt> et créez à l'intérieur un fichier nommé <tt>Portfile</tt> ayant le contenu suivant : |
---|
70 | </p> |
---|
71 | <pre><tt> |
---|
72 | PortSystem 1.0 |
---|
73 | name ircii |
---|
74 | version 20020912 |
---|
75 | categories irc |
---|
76 | maintainers kevin@opendarwin.org |
---|
77 | master_sites ftp://ircftp.au.eterna.com.au/pub/ircII/ |
---|
78 | </tt></pre> |
---|
79 | <p> |
---|
80 | Un Portfile consiste en une suite de paires de type clé/valeur. Les clés <tt>name</tt> et <tt>version</tt> décrivent le nom et la version du logiciel. La clé <tt>categories</tt> est une liste des catégories auquel le logiciel peut appartenir de façon logique; c'est utilisé dans un but d'organisation. La première entrée dans <tt>categories</tt> devrait correspondre au nom du répertoire où doit résider le répertoire du port. La clé <tt>maintainers</tt> devrait, elle, contenir votre adresse email et la clé <tt>master_sites</tt> devrait quant à elle contenir une liste des sites où télécharger les sources. DarwinPorts utilise les termes "clés" et "options" indifféremment comme la plupart des clés sont utilisées comme des options d'une tâche particulière dans le processus du portage. |
---|
81 | </p> |
---|
82 | <p> |
---|
83 | Arrivé à ce point, le Portfile est assez complet pour permettre le téléchargement d'ircII. Par défaut, DarwinPorts ajoutera <tt>version</tt> à <tt>name</tt> et considérera que les sources sont au format <tt>.tar.gz</tt>. Depuis votre répertoire de travail, exécutez la commande suivante : |
---|
84 | </p> |
---|
85 | <pre><tt> |
---|
86 | % port checksum |
---|
87 | </tt></pre> |
---|
88 | <p> |
---|
89 | La commande <tt>port</tt> opère directement sur le <tt>Portfile</tt> du répertoire de travail actuel. Vous devriez voir la même chose que ce qui suit : |
---|
90 | </p> |
---|
91 | <!-- |
---|
92 | .........|.........|.........|.........|.........|.........|.........|.........| |
---|
93 | --> |
---|
94 | <pre><tt> |
---|
95 | DEBUG: Executing com.apple.main (ircii) |
---|
96 | DEBUG: Executing com.apple.fetch (ircii) |
---|
97 | ---> ircii-20020912.tar.gz doesn't seem to exist in /opt/local/var/db/dports/ |
---|
98 | distfiles |
---|
99 | ---> Attempting to fetch ircii-20020912.tar.gz from ftp:// |
---|
100 | ircftp.au.eterna.com.au/pub/ircII/ |
---|
101 | DEBUG: Executing com.apple.checksum (ircii) |
---|
102 | Error: No checksums statement in Portfile. File checksums are: |
---|
103 | ircii-20020912.tar.gz md5 2ae68c015698f58763a113e9bc6852cc |
---|
104 | Error: Target error: com.apple.checksum returned: No checksums statement in |
---|
105 | Portfile. |
---|
106 | </tt></pre> |
---|
107 | <h3> |
---|
108 | <a name="checksum"></a>Vérification du fichier téléchargé |
---|
109 | </h3> |
---|
110 | <p> |
---|
111 | Remarquez que DarwinPorts vérifiera dans un premier temps s'il existe une copie locale d'<tt>ircii-20020912.tar.gz</tt> mais il ne la trouvera pas, donc il la téléchargera depuis le site distant. La commande port ne se termine correctement car l'erreur : "No checksums statement in Portfile" est arrivée. Les Portfiles doivent contenir une somme de contrôle md5 de tous les fichiers distribués -- cela permet à DarwinPorts de vérifier l'exactitude et l'authenticité des sources. Pour plus de souplesse, une somme de contrôle md5 pour les fichiers téléchargés est affichée lorsque l'argument <tt>checksums</tt> n'est pas spécifié. Revenez en arrière et ajoutez ce qui suit à votre Portfile : |
---|
112 | </p> |
---|
113 | <pre><tt> |
---|
114 | checksums md5 2ae68c015698f58763a113e9bc6852cc |
---|
115 | </tt></pre> |
---|
116 | <h3> |
---|
117 | <a name="extract"></a>Extraction des sources dans le répertoire de travail |
---|
118 | </h3> |
---|
119 | <p> |
---|
120 | Maintenant que nous avons une somme de contrôle, nous pouvons vérifier nos sources. Procédons à l'extraction des sources dans notre répertoire de travail. Exécutez la commande suivante : |
---|
121 | </p> |
---|
122 | <pre><tt> |
---|
123 | % port extract |
---|
124 | </tt></pre> |
---|
125 | <p> |
---|
126 | Qui devrait afficher ce qui suit : |
---|
127 | </p> |
---|
128 | <!-- |
---|
129 | .........|.........|.........|.........|.........|.........|.........|.........| |
---|
130 | --> |
---|
131 | <pre><tt> |
---|
132 | DEBUG: Skipping completed com.apple.main (ircii) |
---|
133 | DEBUG: Skipping completed com.apple.fetch (ircii) |
---|
134 | DEBUG: Executing com.apple.checksum (ircii) |
---|
135 | ---> Checksum OK for ircii-20020912.tar.gz |
---|
136 | DEBUG: Executing com.apple.extract (ircii) |
---|
137 | ---> Extracting for ircii-20020912 |
---|
138 | ---> Extracting ircii-20020912.tar.gz ... DEBUG: Assembled command: 'cd /Users/ |
---|
139 | kevin/opendarwin/proj/darwinports/dports/irc/ircii/work && gzip -dc /opt/local/ |
---|
140 | var/db/dports/distfiles/ircii-20020912.tar.gz | tar -xf -' |
---|
141 | Done |
---|
142 | </tt></pre> |
---|
143 | <h3> |
---|
144 | <a name="configure"></a>Exécution d'un script Configure |
---|
145 | </h3> |
---|
146 | <p> |
---|
147 | Maintenant que les sources ont été extraites dans un répertoire nommé <tt>work</tt> placé dans le répertoire de travail actuel, nous pouvons configurer les sources afin de les compiler avec les options désirées. Par défaut, DarwinPorts assume que le logiciel que vous portez utilise un script configure autoconf, et toujours par défaut, DarwinPorts passera l'argument <tt>--prefix=${prefix}</tt> au script configure, spécifiant que ce logiciel devra s'installer dans la hiérarchie utilisée par DarwinPorts. |
---|
148 | </p> |
---|
149 | <p> |
---|
150 | Les options standards d'ircII semblent correctes pour une installation de base sur Darwin, donc nous passerons directement à la phase de compilation. |
---|
151 | </p> |
---|
152 | <h3> |
---|
153 | <a name="build"></a>Compilation des sources |
---|
154 | </h3> |
---|
155 | <p> |
---|
156 | Pour compiler, tapez ce qui suit : |
---|
157 | </p> |
---|
158 | <pre><tt> |
---|
159 | % port build |
---|
160 | </tt></pre> |
---|
161 | <p> |
---|
162 | Par défaut, la phase de compilation exécute l'utilitaire système make(1). (Cela peut être changé avec l'option <tt>build.type</tt> qui accepte les arguments tel que <tt>bsd</tt>, <tt>gnu</tt> ou <tt>pbx</tt>. Alternativement, l'option <tt>build.cmd</tt> peut être utilisée pour spécifier une commande de compilation arbitraire.) L'étape ci-dessus a commencé la compilation des sources, lorsqu'elle sera terminée, nous serons fin prêt pour installer le logiciel. |
---|
163 | </p> |
---|
164 | <h3> |
---|
165 | <a name="install"></a>Installation du programme dans le système |
---|
166 | </h3> |
---|
167 | <p> |
---|
168 | Les Portfiles doivent contenir une option <tt>contents</tt> qui spécifie quels sont les fichiers installés. DarwinPorts utilise cette information pour cataloguer quel fichier appartient à quel logiciel, car ensuite il peut être désinstaller ultérieurement. Chaque paramètre de <tt>contents</tt> est un chemin vers un fichier. Tous les chemins sont relatifs à la variable <tt>${prefix}</tt>. Comme moyen simple de déterminer exactement quels fichiers font partie d'ircII, utilisons la commande "find" pour composer un manifeste des fichiers dans la hiérarchie <tt>${prefix}</tt>. Après l'installation, nous allons réutiliser la commande "find" et utiliser les différences pour générer notre liste. |
---|
169 | </p> |
---|
170 | <p> |
---|
171 | En utilisant le format unidiff, nous allons comparer la liste des fichiers existants avec la nouvelle liste de fichiers, en prenant en compte juste les nouvelles lignes ajoutées. Comme les chemins sont supposés être relatifs à <tt>${prefix}</tt>, nous allons passer via <tt>sed</tt> et effacer le prefix (/opt/local/), et stocker le résultat dans un fichier nommé <tt>contents</tt> placé dans notre dossier hébergeant notre port. Nous pouvons faire tout cela via les commandes suivantes : |
---|
172 | </p> |
---|
173 | <!-- |
---|
174 | .........|.........|.........|.........|.........|.........|.........|.........| |
---|
175 | --> |
---|
176 | <pre><tt> |
---|
177 | % find /opt/local > /tmp/existing.files |
---|
178 | % sudo port install |
---|
179 | % find /opt/local > /tmp/more.files |
---|
180 | % diff -u /tmp/existing.files /tmp/more.files | grep ^\+\/ | \ |
---|
181 | sed -e 's|^\+/opt/local/*||g' > contents |
---|
182 | </tt></pre> |
---|
183 | <p> |
---|
184 | Maintenant que nous avons un fichier contents dans notre répertoire hébergeant notre port, nous devrions l'éditer afin de débuter avec <tt>contents {</tt> et de terminer avec un <tt>}</tt>. (C'est important de noter que tout autre processus utilisant la hiérarchie <tt>${prefix}</tt> peut interférer avec l'efficacité de la commande <tt>find</tt>. Vous devriez vérifier le fichier <tt>contents</tt> résultant afin de voir si tout les fichiers apparaissent à leur place, spécialement les fichiers temporaires de DarwinPorts comme <tt>/var/db/receipts/ircii-20020912.tmp</tt>.) Il est également important de s'assurer que dans le fichier contents les répertoires soient listés <i>après</i> les fichiers qui les contiennent afin que le processus de désinstallation fonctionne correctement. Ensuite nous devrions éditer le Portfile afin d'inclure notre fichier contents : |
---|
185 | </p> |
---|
186 | <pre><tt> |
---|
187 | include contents |
---|
188 | </tt></pre> |
---|
189 | <p> |
---|
190 | Si la liste des fichiers installés par le port ne s'étend pas au-delà d'une page de terminal de 80x24, l'option <tt>contents</tt> devrait être incluse dans le Portfile. Au lieu de <tt>include contents</tt>, nous utiliserons : |
---|
191 | </p> |
---|
192 | <pre><tt> |
---|
193 | contents bin/irc \ |
---|
194 | bin/irc-20020912 \ |
---|
195 | man/man1/irc.1 \ |
---|
196 | man/man1/ircbug.1 \ |
---|
197 | man/man1/ircII.1 \ |
---|
198 | man/man1 |
---|
199 | </pre> |
---|
200 | </tt> |
---|
201 | <p> |
---|
202 | À présent nous avons un portfile complet. Relancez l'étape d'installation pour ajouter ce port à votre propre registre : |
---|
203 | </p> |
---|
204 | <pre><tt> |
---|
205 | % sudo port install |
---|
206 | </tt></pre> |
---|
207 | Qui affichera : |
---|
208 | <pre><tt> |
---|
209 | DEBUG: Skipping completed com.apple.main (ircii) |
---|
210 | DEBUG: Skipping completed com.apple.fetch (ircii) |
---|
211 | DEBUG: Skipping completed com.apple.checksum (ircii) |
---|
212 | DEBUG: Skipping completed com.apple.extract (ircii) |
---|
213 | DEBUG: Skipping completed com.apple.patch (ircii) |
---|
214 | DEBUG: Skipping completed com.apple.configure (ircii) |
---|
215 | DEBUG: Skipping completed com.apple.build (ircii) |
---|
216 | DEBUG: Skipping completed com.apple.install (ircii) |
---|
217 | DEBUG: Executing com.apple.registry (ircii) |
---|
218 | ---> Adding ircii to registry, this may take a moment... |
---|
219 | </tt></pre> |
---|
220 | <h2> |
---|
221 | Sujets avancés |
---|
222 | </h2> |
---|
223 | <h3> |
---|
224 | <a name="targets"></a>Modifier des cibles |
---|
225 | </h3> |
---|
226 | <p> |
---|
227 | Il est possible de modifier la fonctionnalité d'une cible de compilation avec le code Tcl. Un exemple commun est le suivant, qui peut être utile pour un script sans script configure autoconf : |
---|
228 | </p> |
---|
229 | <pre><tt> |
---|
230 | configure {} |
---|
231 | </tt></pre> |
---|
232 | <p> |
---|
233 | Dans le Portfile, cela remplacera la fonctionnalité de la cible de configure, aussi nous sauterons cette étape. Il est également possible d'exécuter du code Tcl immédiatement avant ou après une cible standard. Cela peut être accompli de la manière suivante : |
---|
234 | </p> |
---|
235 | <!-- |
---|
236 | .........|.........|.........|.........|.........|.........|.........|.........| |
---|
237 | --> |
---|
238 | <pre><tt> |
---|
239 | post-configure { |
---|
240 | reinplace "s|change.this.to.a.server|irc.openprojects.net|g" \ |
---|
241 | "${workdir}/${worksrcdir}/config.h" |
---|
242 | } |
---|
243 | </tt></pre> |
---|
244 | <p> |
---|
245 | Cet exemple remplace l'occurrence de <tt>change.this.to.a.server</tt> avec <tt>irc.openprojects.net</tt> dans le fichier config.h qui a été généré pendant la phase précédant <tt>configure</tt>. Notez que c'est en quelque sorte un exemple inventé et voulu, car la même chose aurait pu être faite en spécifiant <tt>--with-default-server=irc.openprojects.net</tt> dans <tt>configure.args</tt>, mais l'approche est généralement utile lorsque de tels arguments ne sont pas présents. |
---|
246 | </p> |
---|
247 | <h3> |
---|
248 | <a name="variants"></a>Variantes du Portfile |
---|
249 | </h3> |
---|
250 | <p> |
---|
251 | Comme Darwin 6.0 a l'ipv6, il est possible de configurer le port avec l'option <tt>--with-ipv6</tt>. Cela peut être effectué en ajoutant l'option suivante dans le Portfile : |
---|
252 | </p> |
---|
253 | <pre><tt> |
---|
254 | configure.args --disable-ipv6 |
---|
255 | |
---|
256 | variant ipv6 { |
---|
257 | configure.args-append --enable-ipv6 |
---|
258 | } |
---|
259 | </tt></pre> |
---|
260 | <p> |
---|
261 | Maintenant la compilation par défaut n'inclura pas le support d'ipv6, mais si la variante ipv6 est voulue, ircII l'aura. Les options par elles-même devraient être considérées comme un facteur d'assignation. Comme les variantes peuvent être utilisées en combinaison avec d'autre, il est conseillé de les ajouter uniquement aux options au lieu de les écraser. Toutes les options peuvent avoir un suffixe avec <tt>-append</tt> ou <tt>-delete</tt> pour ajouter ou effacer un terme de la liste. Vous pouvez spécifier la compilation avec la variante ipv6 de la manière suivante : |
---|
262 | </p> |
---|
263 | <pre><tt> |
---|
264 | % port build +ipv6 |
---|
265 | </tt></pre> |
---|
266 | <h2> |
---|
267 | Annexe |
---|
268 | </h2> |
---|
269 | <h3> |
---|
270 | <a name="portfilelist"></a>Aperçu d'un Portfile |
---|
271 | </h3> |
---|
272 | <p> |
---|
273 | Ce qui suit est le listage complet du Portfile d'ircII : |
---|
274 | </p> |
---|
275 | <pre><tt> |
---|
276 | PortSystem 1.0 |
---|
277 | name ircii |
---|
278 | version 20020912 |
---|
279 | categories irc |
---|
280 | maintainers kevin@opendarwin.org |
---|
281 | master_sites ftp://ircftp.au.eterna.com.au/pub/ircII/ |
---|
282 | checksums md5 2ae68c015698f58763a113e9bc6852cc |
---|
283 | configure.args --disable-ipv6 |
---|
284 | include contents |
---|
285 | |
---|
286 | post-configure { |
---|
287 | reinplace "s|change.this.to.a.server|irc.openprojects.net|g" \ |
---|
288 | "${workdir}/${worksrcdir}/config.h" |
---|
289 | } |
---|
290 | |
---|
291 | variant ipv6 { |
---|
292 | configure.args-append --enable-ipv6 |
---|
293 | } |
---|
294 | </tt></pre> |
---|
295 | <h3> |
---|
296 | <a name="contentslist"></a>Liste de contents |
---|
297 | </h3> |
---|
298 | <p> |
---|
299 | Ce qui suit est un listage partiel du fichier contents d'ircII : |
---|
300 | </p> |
---|
301 | <pre><tt> |
---|
302 | contents { |
---|
303 | bin/irc |
---|
304 | bin/irc-20020912 |
---|
305 | ... omitted ... |
---|
306 | man/man1/irc.1 |
---|
307 | man/man1/ircbug.1 |
---|
308 | man/man1/ircII.1 |
---|
309 | man/man1 |
---|
310 | man |
---|
311 | ... omitted ... |
---|
312 | } |
---|
313 | </tt></pre> |
---|
314 | <? od_print_footer("en"); ?> |
---|