1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573
|
<!doctype debiandoc system [
<!-- entity % manuals-version-def system "manuals-version"-->
<!--%manuals-version-def;-->
]>
<debiandoc><book>
<titlepag>
<title>Le manuel de l'intrieur de dpkg</title>
<author>
<name>Klee Dienes</name>
<email>klee@mit.edu</email>
</author>
<version>Version 1.5 --- janvier 2001</version>
<abstract>
Ce manuel dcrit la structure interne de <prgn>dpkg</prgn>, le systme de
gestion des paquets.
</abstract>
<copyright>
<copyrightsummary>
Copyright ©1997 Klee Dienes <klee@mit.edu>
</copyrightsummary>
<p>
Ce manuel est du logiciel libre; vous pouvez le redistribuer
gratuitement et/ou le modifier sous les conditions de la GNU General
Public License telle que publie par la Free Software Foundation ;
soit version 2, soit ( votre convenance) n'importe quelle version suivante.
<p>
Il est distribu dans l'espoir qu'il sera utile, mais <em>sans aucune
garantie</em>; sans mme la garantie implicite d'une possible
commercialisation ou d'une adquation avec la satisfaction d'un but prcis.
Consultez la ;GNU General Public License pour plus de dtails.
<p>
Vous devriez avoir reu une copie de la GNU General Public License avec
votre systme Debian, dans <file>/usr/share/common-licenses/GPL</file>,
ou dans le fichier <file>COPYING</file> du paquet source de
<prgn>dpkg</prgn>. Sinon, crivez la
Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA.
</copyright>
</titlepag>
<toc detail="sect">
<chapt id=build>
<heading>Notes de Compilation</heading>
<sect id=automake>
<heading>Automake</heading>
<p>
Ce chapitre a t crit par Tom Lees <email>tom@lpsg.demon.co.uk</email> le
mardi 4 Mars 1997 21:34:57 +0000, et comprend de consquentes modifications
faites par Klee Dienes <email>klee@debian.org</email>.
<p>
Ce chapitre contient quelques gnralits propos de la conversion
<prgn>automake</prgn>. Si vous avez l'intention de faire quoi que ce
soit avec <prgn>dpkg</prgn>, vous devriez probablement lire d'abord ce
fichier en entier. Vous avez t prvenu.
<p>
<prgn>automake</prgn> possde plusieurs avantages significatifs, parmi
lesquels :
<list>
<item>il accepte correctement emacs lisp ;
<item>il accepte correctement libtool ;
<item>il contient l'utilitaire <prgn>aclocal</prgn>.
</list>
<p>
L'utilitaire <prgn>aclocal</prgn> est un programme trs utile qui construit
automatiquement un fichier <file>aclocal.m4</file> partir du fichier
<file>configure.in</file> de faon inclure les macros appropries.
<p>
Ceci n'affecte rien d'autre que la recompilation des fichiers
<file>Makefile.in</file> partir des sources.
<p>
La principale diffrence notable est probablement le fait qu'au lieu
d'utiliser des noms de fichiers propritaires, il accepte maintenant
<em>configure --sharedstatedir</em> et <em>configure --localstatedir</em>.
Pour faire de ces options des options par dfaut pour Debian, vous
devriez utiliser <em>./configure --localstatedir=/etc --sharedstatedir=/var/lib</em>.
<p>
J'ai aussi accommod les macros canonisatrices que l'on trouve dans
<em>autoconf</em> pour inclure l'ancienne faon de trouver
l' architecture pour <prgn>dpkg</prgn>, i.e. pour qu'il soit un peu
plus intelligent. Je l'ai modifi pour qu'il utilise les types systmes
host , build et target au lieu de
dterminer seulement l'architecture. Le type de CPU cible est vrifi dans
archtable pour trouver l'architecture sur laquelle dpkg
va tourner.
<p>
Il utilise <em>gcc --print-libgcc-file-name</em> pour trouver si
possible l'architecture de compilation (c'est utilis ensuite pour
dterminer le format ELF ou <em>a.out</em>) ; il utilise si possible
aussi <em>dpkg --print-architecture</em> pour modifier le champ
<em>cpu</em> avant de passer l'alias de la cible config.sub. Si vous
voulez spcifier l'architecture, vous devriez maintenant utiliser
<em>--target=</em>, plutt que <em>--with-arch</em>,
qui n'tait de toute faon qu'un hack . Le vieux <em/--with-arch/
est toujours l, mais il est quelque peu moins fonctionnel.
J'ai aussi dplac les macros <em/DPKG_CACHED_/ dans dpkg.m4 pour rendre
un peu plus lisible le fichier configure.in.
<p>
J'ai aussi tout converti libtool (qu'on peut maintenant trouver dans
la distribution Debian). Cela signifie essentiellement que tous les
outils dpkg peuvent tre compils avec une librairie partage
<em>libdpkg</em> sans trop de difficults (en fait, c'est l'option par
dfaut). Vous n'avez pas besoin d'installer libtool pour utiliser cette
fonctionnalit (cela fonctionne comme autoconf), et d'une manire gnrale,
cela ne devrait pas tre souvent ncessaire.
<p>
Les nouvelles cibles <em>dist</em> construisent une distribution incluant
tous les fichiers construits avec <prgn>debiandoc2html</prgn>,
<prgn>debiandoc2ps</prgn>, etc., qui sont inclus dans la distribution de
faon ce que les gens puissent construire <prgn>dpkg</prgn>
sans eux (particulirement utile pour ceux qui font des portages).
<p>
Une cible <em/make debian/ a t ajoute, qui compile les fichiers
Debian partir d'un rpertoire courant (cela fait d'abord un
<em/make dist/). Maintenant tout ce dont nous avons besoin c'est d'un
dpkg-source modifi de faon ce que le fichier
<file/dpkg-1.4.0.8.tar.gz/ de la distribution GNU puisse tre utilis
comme une partie de la distribution Debian.
Je travaille l dessus, mais cela ne marche pas trs bien pour l'instant
(vous le trouverez dans les exemples).
<p>
J'ai enlev la cible <em/ make portable/ target - elle ne fait rien d'utile.
<p>
J'ai ajout les cibles <em/make uninstall/ pour aider les
utilisateurs non-Debian qui veulent simplement essayer certains paquets
Debian ; et les cibles dist sont aussi utiles pour construire une
distribution de l'outil dpkg. Notez que du fait que automake
inclut automatiquement les dpendances dans les Makefiles dans une
distribution, si vous voulez modifier les fichiers C , il est conseill
de rcuprer et d'installer automake, et ensuite de le relancer dans le
rpertoire de base de la distribution de dpkg, de faon ce que la
gnration automatique des dpendances soit remise en marche, et de faon
ce que toute dpendance qui change soit prise en compte. Les cibles
make maintainer-clean enlveront tous les fichiers qui sont
crs par les utilitaires suivants :
<list>
<item>automake
<item>autoconf
<item>aclocal
<item>autoheader
<item>gettextize
<item>libtoolize
</list>
<p>
Si vous voulez modifier quelque chose dans les sources, je vous recommande
de faire d'abord ce qui suit (aprs avoir install les
utilitaires appropris, bien sr) :
<list>
<item>
make maintainer-clean
<item>
aclocal
<item>
autoheader
<item>
autoconf
<item>
gettextize
<item>
libtoolize (ne laissez pas automake le lancer, sinon les fichiers libtool
ne seront pas inclus dans les cibles dist)
<item>
for i in COPYING INSTALL; do ln -s /usr/share/automake/$i .; done
<item>
automake
</list>
<p>
J'ai aussi incorpor les patches crs par Galen
Hazelwood qui internationalisent dpkg en utilisant GNU gettext - voyez
le fichier NOTES.intl pour plus d'information.
<p>
Les autres modifications mineures sont :
<list>
<item>
Le numro de version est maintenant dtermin par debian/changelog, et non
partir du nom du rpertoire.
<item>
La cration de version.h est maintenant gre par le script configure,
et non par le Makefile.
<item>
include/dpkg.h est maintenant produit partir de include/dpkg.h.in
par un script sed qui insre les dfinitions des rpertoires
appropries -- il accepte maintenant le changement des rpertoires de dpkg
(on peut installer dans /usr/local).
<item>
Les fichiers COPYING (1 petite modification mineure) et
INSTALL ont t mis jour partir de ceux distribus avec
<em>automake-1.1l</em>.
<item>
Du fait que la librairie partage <em>libdpkg</em> est maintenant installe,
j'ai aussi fait installer par dfaut dpkg.h et dpkg-db.h dans /usr/include par
include/Makefile.
</list>
Questions:
<list>
<item>
Dois je utiliser <em/localstatedir/ et <em/sharedstatedir/ au lieu de
<em/sysconfdir/ et <em/datadir/?
</list>
</sect>
<sect id=i18n>
<heading>Internationalisation</heading>
<p>
Cette section a t crite par Galen Hazelwood.
<p>
Dpkg est, pour le moins, gnreux dans ses rapports d'erreur. La grande
majorit des chanes de caractres produites sont d'une manire ou d'une
autre des messages d'erreur. Et si vous pensez que vous vous tes gars
dans le Ministre des Ministres Redondants,
vous auriez absolument raison. Beaucoup des messages d'erreurs
dans dpkg.pot sont dupliqus et utiliss diffrents endroits dans
le programme.
<p>
Pour viter de submerger compltement les traducteurs, j'ai pris des
dcisions arbitraires sur les sortes de chanes de caractres
traduire. Toutes les chanes envoyes debug() sont laisses telles
quelles, sur la base du fait qu'elles sont destines aux dveloppeurs de
dpkg, et non l'ensemble du public. La plupart des messages d'erreur
internes sont trs cryptiques, et confondraient certainement les
traducteurs qui les verraient simplement poss l dans le fichier
dpkg.pot, et ils sont laisss tels quels. (J'en ai quand mme
marqus quelques uns parmi les plus verbeux pour traduction.)
<p>
Si d'autres ne sont pas d'accord avec moi sur la ncessit
de traduire ces chanes, c'est suffisamment facile de simplement
poursuivre et de les marquer plus tard.
<p>
J'ai ajout le code de dmarrage de gettext la routine principale
de dselect, ce qui tait ncessaire car beaucoup des chanes
de lib sont traduites. Dselect est part cela inchang.
<p>
Modifications :
<list>
<item>
Les fichiers dans intl et po ont t pris de gettext 0.10.26, grce au
programme gettextize. J'ai altr les makefiles pour enlever le symbole
VERSION, qui est utilis seulement dans les cibles que dpkg n'accepte pas.
<item>
aclocal.m4 a t rcupr dans le paquet textutils, configure.in a t
altr pour utiliser ces nouveaux tests, les symboles ont t ajouts
acconfig.h, et deux nouveaux rpertoires ont t ajouts dans
Makefile.in.
<item>
Les Makefiles de dpkg, dpkg-deb, md5sum, split, et dselect cherchent
maintenant des fichiers d'en-tte (headers) dans ../intl, et essayent
de lier avec toute librairie d'internationalisation que <em>configure</em>
trouve. Ils dfinissent aussi maintenant LOCALEDIR dans CFLAGS.
<item>
include/dpkg.h possde tous les lments NLS ncessaires, et le seul
fichier qui ne les inclut pas (md5sum/md5sum.c) les comprend directement.
<item>
La modification la plus profonde est due un conflit entre xgettext
et le style de codage de dpkg. Bien que xgettext comprenne la
concatnation des chanes constantes, il ne gre pas le cas o les
symboles prprocesseur sont utiliss en mme temps. Le code de dpkg
utilise beaucoup cela, en particulier dans des cas comme celui-ci :
<example>
ohshite("error reading from " BACKEND " pipe");
</example>
o BACKEND est dfini comme dpkg-deb . xgettext n'acceptant pas cela,
j'ai modifi l'utilisation gnrale comme cela :
<example>
ohshite(_("error reading from dpkg-deb pipe");
</example>
Ce n'est pas trs sympa pour Ian, je sais. Mais que puis je faire ?
</list>
</sect>
</chapt>
<chapt id=code>
<heading>L'intrieur du code</heading>
<sect id=defs>
<heading>Dfinitions de structures</heading>
<sect1 id=versionrevision>
<heading>versionrevision</heading>
<p>
<example>
struct versionrevision {
unsigned long epoch;
char *version;
char *revision;
};
</example>
<p>
La structure <tt/versionrevision/ est utilise pour grer une
spcification de version Debian.
</sect1>
</sect>
<sect id=functions>
<heading>Les fonctions</heading>
<sect1 id=parsing>
<heading>Les tables de traduction de l'analyse syntaxique</heading>
<p>
Chacune de ces tables est utilise pour associer un ensemble de chanes
de caractres avec un ensemble correspondant d'entiers.
Les tables actuelles sont :
<p>
<example>
const struct namevalue booleaninfos[];
</example>
<p>
Associe des chanes boolennes (<em/"yes"/,<em/"no"/) leur valeur
binaire.
<sect2>
<heading>priorityinfos[]</heading>
<p>
<example>
const struct namevalue priorityinfos[];
</example>
<p>
Associe les chanes de priorit des valeurs de type
<em/enum pkgpriority/.
Les valeurs actuelles de priorit sont :
<list>
<item><em/required/ - required
<item><em/important/ - important
<item><em/standard/ - standard
<item><em/recommended/ - recommended
<item><em/optional/ - optional
<item><em/extra/ - extra
<item><em/contrib/ - contrib
<item><em/other/ - other
<item><em/unknown/ - unknown
<item><em/base/ -
Cette chane, bien que dpasse, est reconnue comme un alias.
</item>
</list>
</sect2>
<sect2>
<heading>statusinfos[]</heading>
<p>
<example>
const struct namevalue statusinfos[];
</example>
Associe une chane sur l'tat des paquets des valeurs de type <em/enum ???/.
Les chanes sur l'tat des paquets sont :
not-installed , unpacked , half-configured , installed ,
half-installed , config-files , postinst-failed et
removal-failed .
</sect2>
<sect2>
<heading>eflaginfos[]</heading>
<p>
<example>
const struct namevalue eflaginfos[];
</example>
</sect2>
<sect2>
<heading>wantinfos[]</heading>
<p>
<example>
const struct namevalue wantinfos[];
</example>
</sect2>
<sect2>
<heading>nicknames[]</heading>
<p>
<example>
const struct nickname nicknames[];
</example>
Associe des champs de contrle dpasss leurs versions actuelles.
</sect2>
</sect1>
<sect1 id=parsef>
<heading>Les fonctions d'analyse syntaxique</heading>
<sect2>
<heading>parseerr()</heading>
<p>
<example>
void parseerr
(FILE *file, const char *filename, int lno,
FILE *warnto, int *warncount, const struct pkginfo *pigp,
int warnonly, const char *fmt, ...);
</example>
Renvoie une erreur lors de l'analyse syntaxique d'un flot de donnes
de contrle. Cherche dans <em>file</em> un tat d'erreur, affiche un
message d'erreur dans stderr et termine avec un code d'erreur si une
erreur est prsente dans le flot. Formate les arguments variables
suivant la chane <em/printf/-style dans <var/fmt/, en faisant prcder
le rsultat de <var/filename/, <var/lno/, and <var/pigp/ (si non NULL).
Si <var/warnonly/ est gal 0, crit le rsultat dans stderr et termine
avec un code d'erreur. Autrement, incrmente <var/warncount/ et
termine normalement.
</sect2>
<sect2>
<heading>illegal_packagename()</heading>
<p>
<em>
const char *illegal_packagename
(const char *p, const char **ep)
</em>
Vrifie le nom de paquet dans <var/p/ que la syntaxe est correcte.
Renvoie NULL en cas de succs, en faisant pointer <em>*ep</em> aprs le
dernier caractre du nom de paquet, incluant tout espace blanc ventuel
(tel que dfini par isspace()). En cas d'erreur, renvoie le message
d'erreur comme un pointeur vers un buffer statique.
</sect2>
<sect2>
<heading>informativeversion()</heading>
<p>
<em>
int informativeversion(const struct versionrevision *version)
</em>
<p>
Renvoie true si et seulement si <em/versionrevision/ n'est
pas vide ; autrement renvoie false .
</sect2>
<sect2>
<heading>varbufversion()</heading>
<p>
<example>
void varbufversion
(struct varbuf *vb,
const struct versionrevision *version,
enum versiondisplayepochwhen vdew);
</example>
Rend lisible par un humain une version de <em>version</em> dans <em>vb</em>.
Les valeurs possibles de <em>vdew</em> sont :
<list>
<item><tt/vdew_never/ - n'inclut jamais la chane epoch
<item><tt/vdew_nonambig/ - inclut la chane epoch si non nul
<item><tt/vdew_always/ - inclut toujours la chane epoch
</list>
</sect2>
<sect2>
<heading>versiondescribe()</heading>
<p>
<example>
const char *versiondescribe
(const struct versionrevision *version,
enum versiondisplayepochwhen vdew);
</example>
<p>
Renvoie une version lisible par un humain de <em>version</em> comme un
pointeur vers un buffer statique. Si la structure de version est vide,
renvoie <em/"<none>"/. Les buffers statiques sont allous partir
d'un ensemble de 10 la faon round-robin (ils seront
rutiliss aprs 10 appels successifs <em/versiondescribe/).
</sect2>
<sect2>
<heading>parseversion()</heading>
<p>
<example>
const char *parseversion
(struct versionrevision *rversion, const char *string);
</example>
<p>
Fait l'analyse syntaxique du contenu de <var/string/ dans
<var/rversion/. Si cela russit, renvoie NULL, sinon renvoie un pointeur
vers une chane d'erreur statique.
</sect2>
<sect2>
<heading>parsemustfield()</heading>
<p>
<example>
void parsemustfield
(FILE *file, const char *filename, int lno,
FILE *warnto, int *warncount,
const struct pkginfo *pigp, int warnonly,
char **value, const char *what);
</example>
</sect2>
<sect2>
<heading>skip_slash_dotslash()</heading>
<p>
<example>
const char *skip_slash_dotslash (const char *p);
</example>
</sect2>
<sect2>
<heading>convert_string()</heading>
<p>
<example>
static int convert_string
(const char *filename, int lno, const char *what, int otherwise,
FILE *warnto, int *warncount, const struct pkginfo *pigp,
const char *startp, const struct namevalue *nvip,
const char **endpp)
</example>
</sect2>
</sect1>
</sect>
</chapt>
</book></debiandoc>
|