[ précédent ] [ Table des matières ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ suivant ]


Guide du nouveau responsable Debian
Chapitre 3 - Modification du code source


La place manque pour entrer dans tous les détails de modification des sources amont, mais voici quelques étapes fondamentales et problèmes qui reviennent souvent.


3.1 Configuration de quilt

Le programme quilt fournit la méthode fondamentale pour enregistrer les modifications du code source pour l'empaquetage Debian. Puisque de légères modifications au paramétrage par défaut sont souhaitables pour l'empaquetage Debian, configurez ~/.quiltrc comme suit : [11]

     d=. ; while [ ! -d "$d/debian" -a `readlink -e $d` != / ]; do d="$d/.."; done
     if [ -d "$d/debian" ] && [ -z "$QUILT_PATCHES" ]; then
         # Cas d'empaquetage Debian avec $QUILT_PATCHES non configuré
         QUILT_PATCHES=debian/patches
         QUILT_PATCH_OPTS="--unified-reject-files"
         QUILT_DIFF_ARGS="-p ab --no-timestamps --no-index --color=auto"
         QUILT_REFRESH_ARGS="-p ab --no-timestamps --no-index"
         QUILT_COLORS="diff_hdr=1;32:diff_add=1;34:diff_rem=1;31:diff_hunk=1;33:diff_ctx=35:diff_cctx=33"
         if ! [ -d $d/debian/patches ]; then mkdir $d/debian/patches; fi
     fi

Voir quilt(1) et /usr/share/doc/quilt/quilt.html pour apprendre à utiliser quilt.


3.2 Correction de bogue amont

Si vous trouvez une erreur dans le fichier Makefile amont comme suit, où « install: gentoo » aurait dû être « install: gentoo-target » :

     install: gentoo
             install ./gentoo $(BIN)
             install icons/* $(ICONS)
             install gentoorc-example $(HOME)/.gentoorc

Corrigez l'erreur et enregistrez la modification avec la commande quilt sous fix-gentoo-target.patch : [12]

     $ mkdir debian/patches
     $ quilt new fix-gentoo-target.patch
     $ quilt add Makefile

Modifiez le fichier Makefile comme suit :

     install: gentoo-target
             install ./gentoo $(BIN)
             install icons/* $(ICONS)
             install gentoorc-example $(HOME)/.gentoorc

Demandez à quilt de créer debian/patches/fix-gentoo-target.patch et ajoutez sa description :

     $ quilt refresh
     $ quilt header -e
     ... description du correctif

3.3 Installation des fichiers à leur emplacement

Normalement, les programmes s'installent d'eux-mêmes dans le sous-répertoire /usr/local. Puisqu'il est réservé à l'usage privé de l'administrateur système (ou de l'utilisateur), les paquets Debian ne doivent pas utiliser ce répertoire, mais devraient utiliser le sous-répertoire /usr/bin conformément à la norme de hiérarchie des fichiers (FHS, /usr/share/doc/debian-policy/fhs/fhs-2.3.html).

Habituellement, make(1) est utilisé pour automatiser la construction du programme et l'exécution de « make install » installe les programmes directement à l'endroit voulu par la cible install du fichier Makefile. Pour permettre à Debian de fournir des paquets binaires, le système de construction installe les programmes dans l'image de l'arborescence de fichiers créé dans un répertoire temporaire plutôt que dans la destination réelle.

Ces deux différences entre (1) l'installation normale du programme et (2) l'empaquetage Debian peuvent être abordées de façon transparente par le paquet debhelper à l'aide des commandes dh_auto_configure et dh_auto_install si les conditions suivantes sont vérifiées :

Les programmes qui utilisent GNU autoconf suivent automatiquement la norme GNU et leur empaquetage est presque automatique. Avec ceci et d'autres paramètres, le paquet debhelper est estimé fonctionner pour 90 % des paquets sans modification intrusive à leur système de construction. L'empaquetage n'est donc pas aussi compliqué qu'il y parait.

Si vous devez modifier le fichier Makefile, vous devriez vous assurer qu'il gère la variable $(DESTDIR). La variable $(DESTDIR) n'y est pas configurée et précède chaque chemin de fichier utilisé par le programme d'installation. Le script d'empaquetage configurera $(DESTDIR) en tant que répertoire temporaire.

Le répertoire temporaire utilisé par la commande dh_auto_install est choisi en tant que debian/paquet pour les paquets binaires simples. [13] Le contenu du répertoire temporaire sera copié sur le système de l'utilisateur qui installera votre paquet, la seule différence est que dpkg placera ces fichiers dans le répertoire racine.

Gardez à l'esprit que même si le programme s'installe dans debian/paquet, il doit continuer à s'exécuter correctement quand il est installé dans le répertoire racine, c'est-à-dire quand il est installé à partir du paquet .deb. Vous ne devez donc pas laisser le système de construction coder en dur des chaînes de caractères comme /home/moi/deb/paquet-version/usr/share/paquet dans les fichiers du paquet.

Voici les parties concernées du Makefile de gentoo [14] :

     # Emplacement des binaires lors du 'make install'
     BIN     = /usr/local/bin
     
     # Emplacement des icônes lors du 'make install'
     ICONS   = /usr/local/share/gentoo

Les fichiers sont configurés pour s'installer sous /usr/local/. Changez ces chemins en :

     # Emplacement des binaires lors du 'make install'
     BIN     = $(DESTDIR)/usr/bin
     
     # Emplacement des icônes lors du 'make install'
     ICONS   = $(DESTDIR)/usr/share/gentoo

Mais pourquoi dans ce répertoire, et pas dans un autre ? Parce que Debian n'installe jamais de fichiers sous /usr/local — cet arbre est réservé à l'usage de l'administrateur système. Sur un système Debian, de tels fichiers doivent plutôt aller sous /usr.

Les emplacements exacts des exécutables, icônes, documentation, etc., sont spécifiées dans la norme de hiérarchie des fichiers (voir /usr/share/doc/debian-policy/fhs/). Vous devriez la consulter et lire les sections relatives à votre paquet.

Dès lors, l'exécutable devrait être installé sous /usr/bin plutôt que sous /usr/local/bin, la page de manuel sous /usr/share/man/man1 plutôt que sous /usr/local/man/man1, etc. Remarquez qu'il n'y a pas de page de manuel mentionnée dans le fichier Makefile de gentoo, mais comme la Charte Debian demande que chaque programme en ait une, il faudra en créer une plus tard et l'installer dans /usr/share/man/man1.

Certains programmes n'utilisent pas les variables des fichiers Makefile pour définir des chemins comme ceux-ci. Cela signifie que vous risquez de devoir modifier de vrais fichiers sources C pour qu'ils utilisent les emplacements corrects. Mais où, et que chercher exactement ? Vous pouvez le découvrir avec :

     $ grep -nr -e 'usr/local/lib' --include='*.[c|h]' .

grep va parcourir récursivement l'arbre des sources et donner le nom des fichiers et le numéro des lignes où il trouve une occurrence.

Modifiez ces fichiers et à ces lignes, remplacez usr/local/lib par usr/lib :

     $ vim '+argdo %s/usr\/local\/lib/usr\/lib/gce|update' +q \
           $(find . -type f -name '*.[c|h]')

Soyez attentif à ne pas casser le reste du code ! :-)

Ensuite, vous devriez trouver la cible d'installation (cherchez une ligne qui commence par install:, d'ordinaire cela fonctionne) et renommez toutes les références aux répertoires autres que ceux définis au début du Makefile.

Après la correction du bogue amont, la cible « install » de gentoo est sous la forme :

     install: gentoo-target
             install ./gentoo $(BIN)
             install icons/* $(ICONS)
             install gentoorc-example $(HOME)/.gentoorc

Corrigez l'erreur et enregistrez la modification avec la commande quilt sous debian/patches/install.patch :

     $ quilt new install.patch
     $ quilt add Makefile

Pour le paquet Debian, il faut modifier comme suit avec l'éditeur :

     install: gentoo-target
             install -d $(BIN) $(ICONS) $(DESTDIR)/etc
             install ./gentoo $(BIN)
             install -m644 icons/* $(ICONS)
             install -m644 gentoorc-example $(DESTDIR)/etc/gentoorc

Vous aurez sûrement remarqué qu'il y a maintenant une commande « install -d » avant les autres dans la règle. Elle n'existait pas dans Le fichier Makefile originel parce qu'habituellement /usr/local/bin et les autres répertoires existent déjà sur le système dans lequel « make install » est exécuté. Cependant, puisque dans notre cas les répertoires d'installation sont vides (ou même inexistants), chacun de ces répertoires doit être créé.

D'autres choses peuvent être ajoutés à la fin de la règle, comme l'installation de la documentation additionnelle que l'auteur amont oublie parfois :

             install -d $(DESTDIR)/usr/share/doc/gentoo/html
             cp -a docs/* $(DESTDIR)/usr/share/doc/gentoo/html

Après avoir soigneusement vérifié que tout est bon, demandez à quilt de rafraîchir le correctif pour créer debian/patches/install.patch et ajoutez sa description.

     $ quilt refresh
     $ quilt header -e
     ... description du correctif

Vous avez maintenant un ensemble de correctifs.

  1. correction d'un bogue amont : debian/patches/fix-gentoo-target.patch ;

  1. modification spécifique à l'empaquetage Debian : debian/patches/install.patch ;

Chaque fois que vous faites des modifications qui ne sont pas spécifiquement liées à Debian comme debian/patches/fix-gentoo-target.patch, envoyez-les au responsable amont pour qu'elles puissent être incluses dans la version suivante du programme et que tout le monde puisse en profiter. Souvenez-vous aussi de ne pas rendre vos corrections spécifiques à Debian ou Linux (ou même Unix !) avant de les envoyer — faites-les portables. Cela rendra vos corrections beaucoup plus faciles à appliquer.

Remarquez que vous ne devez pas envoyer les fichiers debian/* en amont.


3.4 Bibliothèques différentes

Il y a un autre problème courant : des bibliothèques sont souvent différentes d'une plate-forme à l'autre. Par exemple, Makefile peut contenir une référence à une bibliothèque qui n'existe pas sur les systèmes Debian. Dans ce cas, changez-la en une bibliothèque qui existe dans Debian, et qui sert à la même chose.

Ainsi, si une ligne de Makefile (ou Makefile.in) du programme indique quelque chose comme ceci (et que le programme ne compile pas) [15] :

     LIBS = -lcurses -lquelquechose -lautrechose

Il suffit de le corriger dans debian/patches/ncurse.patch en modifiant curses en ncurses :

     $ quilt new ncurse.patch
     $ quilt add Makefile
     $ sed -i -e "s/-lcurses/-lncurses/g" Makefile
     $ quilt refresh
     $ quilt header -e
     ... description du correctif

[ précédent ] [ Table des matières ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ suivant ]


Guide du nouveau responsable Debian

version 1.2.25, 2010-12-22 12:44:34 UTC

Josip Rodin joy-mg@debian.org

Traduction par Frédéric Dumont frederic.dumont@easynet.be
Mohammed Adnène Trojette adn+deb@diwi.org
David Prévot david@tilapin.org
et les membres de la liste debian-l10n-french@lists.debian.org