<!doctype debiandoc system [
<!-- entity % manuals-version-def system "manuals-version"-->
<!--%manuals-version-def;-->
]>
<debiandoc><book>

<titlepag>
<title>Le manuel de l'intérieur de dpkg</title>
<author>
  <name>Klee Dienes</name>
  <email>klee@mit.edu</email>
</author>
<version>Version 1.5 --- janvier 2001</version>
<abstract>
Ce manuel décrit la structure interne de <prgn>dpkg</prgn>, le système de
gestion des paquets.
</abstract>

<copyright>
<copyrightsummary>
Copyright &copy;1997 Klee Dienes &lt;klee@mit.edu&gt;
</copyrightsummary>
<p>
Ce manuel est du logiciel libre; vous pouvez le redistribuer
gratuitement et/ou le modifier sous les conditions de la «&nbsp;GNU General
Public License&nbsp;» telle que publiée 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 même la garantie implicite d'une possible 
commercialisation ou d'une adéquation avec la satisfaction d'un but précis. 
Consultez la «&nbsp;;GNU General Public License&nbsp;» pour plus de détails.

<p>
Vous devriez avoir reçu une copie de la GNU General Public License avec
votre système 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 conséquentes modifications 
faites par Klee Dienes <email>klee@debian.org</email>.

<p>
Ce chapitre contient quelques généralités à 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é prévenu.

<p>
<prgn>automake</prgn> possède 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 très utile qui construit
automatiquement un fichier <file>aclocal.m4</file> à partir du fichier 
<file>configure.in</file> de façon à inclure les macros appropriées.

<p>
Ceci n'affecte rien d'autre que la recompilation des fichiers 
<file>Makefile.in</file> à partir des sources.

<p>
La principale différence notable est probablement le fait qu'au lieu
d'utiliser des noms de fichiers propriétaires, il accepte maintenant
<em>configure --sharedstatedir</em> et <em>configure --localstatedir</em>.
Pour faire de ces options des options par défaut 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 façon de trouver
l'«&nbsp;architecture&nbsp;» pour <prgn>dpkg</prgn>, i.e. pour qu'il soit un peu
plus intelligent. Je l'ai modifié pour qu'il utilise les types systèmes 
«&nbsp;host&nbsp;», «&nbsp;build&nbsp;» et «&nbsp;target&nbsp;» au lieu de 
déterminer seulement l'architecture. Le type de CPU cible est vérifié dans
«&nbsp;archtable&nbsp;» 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
déterminer 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 spécifier l'architecture, vous devriez maintenant utiliser 
<em>--target=</em>, plutôt que <em>--with-arch</em>,
qui n'était de toute façon qu'un «&nbsp;hack&nbsp;». Le vieux <em/--with-arch/
est toujours là, mais il est quelque peu moins fonctionnel.
J'ai aussi déplacé 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 compilés avec une librairie partagée
<em>libdpkg</em> sans trop de difficultés (en fait, c'est l'option par
défaut). Vous n'avez pas besoin d'installer libtool pour utiliser cette
fonctionnalité (cela fonctionne comme autoconf), et d'une manière générale,
cela ne devrait pas être souvent nécessaire.

<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
façon à ce que les gens puissent construire <prgn>dpkg</prgn>
sans eux (particulièrement utile pour ceux qui font des portages).

<p>
Une cible <em/make debian/ a été ajoutée, qui compile les fichiers
Debian à partir d'un répertoire courant (cela fait d'abord un 
<em/make dist/). Maintenant tout ce dont nous avons besoin c'est d'un
dpkg-source modifié de façon à 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 très 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 «&nbsp;dist&nbsp;» sont aussi utiles pour construire une 
«&nbsp;distribution&nbsp;» de l'outil dpkg. Notez que du fait que automake 
inclut automatiquement les dépendances dans les Makefiles dans une
distribution, si vous voulez modifier les fichiers C , il est conseillé
de récupérer et d'installer automake, et ensuite de le relancer dans le
répertoire de base de la distribution de dpkg, de façon à ce que la
génération automatique des dépendances soit remise en marche, et de façon
à ce que toute dépendance qui change soit prise en compte. Les cibles
«&nbsp;make maintainer-clean&nbsp;» enlèveront tous les fichiers qui sont 
créés 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 (après avoir installé les
utilitaires appropriés, bien sûr) : 
<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 créés par Galen
Hazelwood qui internationalisent dpkg en utilisant GNU gettext - voyez
le fichier «&nbsp;NOTES.intl&nbsp;» pour plus d'information.

<p>
Les autres modifications mineures sont :

<list>
<item>
Le numéro de version est maintenant déterminé par debian/changelog, et non
à partir du nom du répertoire.
<item>
La création de version.h est maintenant gérée 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 «&nbsp;sed&nbsp;» qui insére les définitions des répertoires
appropriées -- il accepte maintenant le changement des répertoires de dpkg 
(on peut installer dans /usr/local).

<item>
Les fichiers «&nbsp;COPYING&nbsp;» (1 petite modification mineure) et 
«&nbsp;INSTALL&nbsp;» ont été mis à jour à partir de ceux distribués avec 
<em>automake-1.1l</em>.
<item>
Du fait que la librairie partagée <em>libdpkg</em> est maintenant installée,
j'ai aussi fait installer par défaut 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, généreux dans ses rapports d'erreur. La grande
majorité des chaînes de caractères produites sont d'une manière ou d'une
autre des messages d'erreur. Et si vous pensez que vous vous êtes égarés 
dans le Ministère des Ministères Redondants,
vous auriez absolument raison. Beaucoup des messages d'erreurs
dans dpkg.pot sont dupliqués et utilisés à différents endroits dans
le programme.

<p>
Pour éviter de submerger complètement les traducteurs, j'ai pris des
décisions arbitraires sur les sortes de chaînes de caractères à
traduire. Toutes les chaînes envoyées à debug() sont laissées telles
quelles, sur la base du fait qu'elles sont destinées aux développeurs de
dpkg, et non à l'ensemble du public. La plupart des messages d'erreur
internes sont très cryptiques, et confondraient certainement les
traducteurs qui les verraient simplement posés là dans le fichier
dpkg.pot, et ils sont laissés tels quels. (J'en ai quand même
marqués quelques uns parmi les plus verbeux pour traduction.)

<p>
Si d'autres ne sont pas d'accord avec moi sur la nécessité
de traduire ces chaînes, c'est suffisamment facile de simplement
poursuivre et de les marquer plus tard.

<p>
J'ai ajouté le code de démarrage de gettext à la routine principale
de dselect, ce qui était nécessaire car beaucoup des chaînes
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, grâce au
programme gettextize. J'ai altéré les makefiles pour enlever le symbole
VERSION, qui est utilisé seulement dans les cibles que dpkg n'accepte pas. 
<item>
aclocal.m4 a été récupéré dans le paquet textutils, configure.in a été
altéré pour utiliser ces nouveaux tests, les symboles ont été ajoutés à
acconfig.h, et deux nouveaux répertoires ont été ajoutés dans
Makefile.in.
<item>
Les Makefiles de dpkg, dpkg-deb, md5sum, split, et dselect cherchent
maintenant des fichiers d'en-tête (headers) dans ../intl, et essayent
de lier avec toute librairie d'internationalisation que <em>configure</em>
trouve. Ils définissent aussi maintenant LOCALEDIR dans CFLAGS.
<item>
include/dpkg.h possède tous les éléments NLS nécessaires, 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
concaténation des chaînes constantes, il ne gère pas le cas où les
symboles préprocesseur sont utilisés en même 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 défini comme «&nbsp;dpkg-deb&nbsp;». xgettext n'acceptant pas cela,
j'ai modifié l'utilisation générale comme cela :
<example>
ohshite(_("error reading from dpkg-deb pipe");
</example>
Ce n'est pas très sympa pour Ian, je sais. Mais que puis je faire ?
</list>

</sect>

</chapt>

<chapt id=code>
<heading>L'intérieur du code</heading>

<sect id=defs>
<heading>Définitions 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 utilisée pour gérer une
spécification 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 utilisée pour associer un ensemble de chaînes
de caractères avec un ensemble correspondant d'entiers.

Les tables actuelles sont :

<p>
<example>
const struct namevalue booleaninfos[];
</example>

<p>
Associe des chaînes booléennes (<em/"yes"/,<em/"no"/) à leur valeur
binaire.


<sect2>
<heading>priorityinfos[]</heading>

<p>
<example>
const struct namevalue priorityinfos[];
</example>

<p>
Associe les chaînes 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 chaîne, bien que dépassée, est reconnue comme un alias.
</item>
</list>
</sect2>

<sect2>
<heading>statusinfos[]</heading>

<p>
<example>
const struct namevalue statusinfos[];
</example>

Associe une chaîne sur l'état des paquets à des valeurs de type <em/enum ???/.

Les chaînes sur l'état des paquets sont :

«&nbsp;not-installed&nbsp;»,  «&nbsp;unpacked&nbsp;», «&nbsp;half-configured&nbsp;», «&nbsp;installed&nbsp;»,
«&nbsp;half-installed&nbsp;», «&nbsp;config-files&nbsp;»,  «&nbsp;postinst-failed&nbsp;» et 
«&nbsp;removal-failed&nbsp;».
</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 contrôle dépassés à 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 données 
de contrôle. 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 présente dans le flot. Formate les arguments variables
suivant la chaîne <em/printf/-style dans <var/fmt/, en faisant précéder
le résultat de <var/filename/, <var/lno/, and <var/pigp/ (si non NULL).
Si <var/warnonly/ est égal à 0, écrit le résultat dans stderr et termine
avec un code d'erreur. Autrement, incrémente <var/warncount/ et
termine normalement.
</sect2>

<sect2>
<heading>illegal_packagename()</heading>

<p>
<em>
const char *illegal_packagename
(const char *p, const char **ep) 
</em>

Vérifie le nom de paquet dans <var/p/ que la syntaxe est correcte.
Renvoie NULL en cas de succès, en faisant pointer <em>*ep</em> après le
dernier caractère du nom de paquet, incluant tout espace blanc éventuel
(tel que défini 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 «&nbsp;true&nbsp;» si et seulement si <em/versionrevision/ n'est 
pas vide ; autrement renvoie «&nbsp;false&nbsp;».
</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 chaîne «&nbsp;epoch&nbsp;»
<item><tt/vdew_nonambig/ - inclut la chaîne «&nbsp;epoch&nbsp;» si non nul
<item><tt/vdew_always/ - inclut toujours la chaîne «&nbsp;epoch&nbsp;»
</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/"&lt;none&gt;"/. Les buffers statiques sont alloués à partir
d'un ensemble de 10 à la façon «&nbsp;round-robin&nbsp;» (ils seront
réutilisés après 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 réussit, renvoie NULL, sinon renvoie un pointeur
vers une chaîne 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>
