%manuals-version-def; ]> internals.info Le manuel de l'intérieur de dpkg Klee Dienes Version &manuals-version; (dpkg &dpkg-version;) Ce manuel décrit la structure interne du Copyright

Copyright ©1997 Klee Dienes 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 publiée par la Free Software Foundation; soit version 2, soit (à votre convenance) n'importe quelle version suivante.

Ceci est distribué dans l'espoir d'être utile, mais sans aucune garantie; sans même la garantie implicite de commerciabilité ni de satisfaire à aucun objet. Voyez la GNU General Public License pour plus de détails. Vous devriez avoir reçu une copie de la GNU General Public License avec votre système Debian GNU/Linux, dans /usr/share/common-licenses/GPL, ou avec le COPYING. Sinon, écrivez à la Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Notes de Compilation

Automake

Ce chapitre a été écrit par Tom Lees <tom&at;lpsg.demon.co.uk> le mardi 4 Mars 1997 à 21:34:57 +0000, et comprend de conséquentes modifications faites par Klee Dienes <klee&at;debian.org>

Ce chapitre contient des notes générales à propos de la conversion à La version courante d'automake utilisée est la version elle supporte emacs lisp correctement elle supporte libtool correctement elle contient l'utilitaire aclocal

L'utilitaire ftp://ftp.cygnus.com/pub/tromey

Ceci n'affecte rien d'autre que la recompilation des fichiers La principale différence notable est probablement le fait qu'au lieu d'utiliser des noms de fichiers propriétaires, il supporte maintenant ./configure --localstatedir=/etc --sharedstatedir=/var/lib.

J'ai aussi personnalisé les macros canonisatrices que l'on trouve dans Il utilise automake autoconf aclocal autoheader gettextize libtoolize

Si vous voulez modifier n'importe lequel des sources, je recommande que vous fassiez ce qui suit d'abord (après avoir installé les utilitaires appropriés, bien sûr):- make maintainer-clean aclocal autoheader autoconf gettextize libtoolize (ne laissez pas automake le lancer, car cela ferait qu'il n'inclurait pas les fichiers libtool dans les cibles dist) for i in COPYING INSTALL; do ln -s /usr/share/automake/$i .; done automake

J'ai aussi incorporé les patches fait à l'origine par Galen Hazelwood pour internationaliser dpkg en utilisant GNU gettext - voyez le fichier "NOTES.intl" pour plus d'information à propos de ceci.

Les autres modifications mineures sont: Le numéro de version est maintenant déterminé par debian/changelog, et non à partir du nom du répertoire. La creation de version.h est maintenant gérée par le script configure, et non le Makefile. include/dpkg.h est maintenant généré à partir de include/dpkg.h.in par un script sed, en insérant les définitions des répertoires appropriées - de façon à ce que maintenant cela supporte le changement des répertoires dpkg (on peut installer dans /usr/local) Les fichiers COPYING (1 petite modification mineure) et INSTALL ont été mis à jour à partir de ceux distribués avec automake-1.1l Du fait que la librairie partagée libdpkg est maintenant installée, j'ai aussi fait installer dpkg.h et dpkg-db.h dans /usr/include par include/Makefile par défaut Questions: Dois je utiliser

Internationalisation

Cette section a été écrite par Galen Hazelwood.

Dpkg est, pour le moins, généreux dans ses rapports d'erreur. La vaste majorité des chaînes de caractères produites sont des messages d'erreur d'une manière ou d'une autre. 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 points dans le programme.

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 au 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 sont donc aussi laissés tels quels. (J'en ai quand même marqués quelques uns parmi les plus verbeux pour traduction.)

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

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é.

Modifications: 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 ne supporte pas. 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. Les Makefiles de dpkg, dpkg-deb, md5sum, split, et dselect cherchent maintenant des fichiers d'entête (headers) dans ../intl, et essayent de lier avec toute librairie d'internationalisation que configure trouve. Ils définissent aussi maintenant LOCALEDIR dans CFLAGS. include/dpkg.h a tous les éléments NLS nécessaires, et le seul fichier qui ne l'inclue pas (md5sum/md5sum.c) les a directement dedans. 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 là: ohshite("error reading from " BACKEND " pipe"); où BACKEND est défini comme "dpkg-deb". Comme xgettext ne peut pas gérer cela, j'ai changé cette utilisation dans tous les cas pour quelque chose comme: ohshite(_("error reading from dpkg-deb pipe"); Ce n'est pas très sympa pour Ian, je sais. Mais que puis je faire?

L'intérieur du code
Définitions des structures versionrevision

struct versionrevision @{ unsigned long epoch; char *version; char *revision; @};

La structure

Les fonctions Les tables de traduction de l'analyse syntaxique

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 courantes sont:

const struct namevalue booleaninfos[];

Associe des chaînes booléennes ( const struct namevalue priorityinfos[];

Associe les chaînes de priorité à des valeurs de type nécessaire important standard recommandé optionnel extra contribution autre inconnu Ce dernier code est obsolète, mais il est accepté comme alias de const struct namevalue statusinfos[]; Associe une chaîne de statuts de paquets à des valeurs de type const struct namevalue eflaginfos[]; const struct namevalue wantinfos[]; const struct nickname nicknames[]; Associe des champs de contrôle obsolètes à leurs versions courantes. Les fonctions d'analyse syntaxique void parseerr (FILE *file, const char *filename, int lno, FILE *warnto, int *warncount, const struct pkginfo *pigp, int warnonly, const char *fmt, ...); Renvoie une erreur d'analyse syntaxique d'un flot de données de contrôle. Cherche dans const char *illegal_packagename (const char *p, const char **ep) Vérifie le nom de paquet dans int informativeversion(const struct versionrevision *version)

Renvoie true si et seulement si void varbufversion (struct varbuf *vb, const struct versionrevision *version, enum versiondisplayepochwhen vdew); Ecrit une version lisible par un humain de n'inclue jamais l'epoch inclue la chaîne epoch si non nul inclue toujours la chaîne epoch const char *versiondescribe (const struct versionrevision *version, enum versiondisplayepochwhen vdew);

Renvoie une version lisible par un humain de const char *parseversion (struct versionrevision *rversion, const char *string);

Fait l'analyse syntaxique du contenu de void parsemustfield (FILE *file, const char *filename, int lno, FILE *warnto, int *warncount, const struct pkginfo *pigp, int warnonly, char **value, const char *what); const char *skip_slash_dotslash (const char *p); 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)