Normalement, les programmes s'installent d'eux-mêmes dans les sous-répertoires
/usr/local. Mais les paquets Debian ne doivent pas utiliser ce répertoire, car
il est réservé à l'usage privé de l'administrateur système (ou de
l'utilisateur). Cela signifie que vous devez examinez le système de création
de votre programme, en général en commençant par le Makefile. C'est le script
que make(1)
utilisera pour automatiser la création du programme.
Pour plus de détails sur les Makefile, regardez fichier « rules », Section 4.4.
Notez que si votre programme utilise GNU automake(1)
et/ou
autoconf(1)
, ce qui signifie que les sources incluent des fichiers
Makefile.am et/ou Makefile.in, respectivement, vous devrez modifier ces
fichiers, parce que chaque appel d'automake va écraser les Makefile.in avec des
informations générées à partir des Makefile.am, et que chaque appel de
./configure fera de même avec les fichiers Makefile, avec des données des
Makefile.in. Éditer les fichiers Makefile.am requiert des connaissances sur
automake, que vous pouvez apprendre dans la section info d'automake, alors
qu'éditer les fichiers Makefile.in est globalement identique à l'édition de
fichiers Makefile, si ce n'est qu'il faut faire attention à toutes les
variables, à savoir toute chaîne entourée de « @ », comme par exemple
@CFLAGS@ ou @LN_S@, qui sont remplacées par des valeurs réelles à chaque appel
d'autoconf.
Notez qu'il n'y a pas la place ici pour entrer dans tous les détails sur les modifications, mais voici quelques-uns des problèmes qui reviennent souvent.
La plupart des programmes ont une certaine manière de s'installer dans la structure de répertoire de votre système, de sorte que leurs exécutables sont inclus dans votre $PATH, et que vous trouvez leurs documentation et pages de manuel aux places habituelles. Cependant, si vous faisiez cela, le programme serait installé au milieu de tout ce qui est déjà sur votre système. Les outils de création de paquet auraient plus de difficultés pour décider ce qui appartient ou non à votre paquet.
Dès lors vous devez faire autre chose : installer le programme dans un sous-répertoire temporaire à partir duquel les outils du responsable vont construire un paquet .deb fonctionnel. Tout ce qui est contenu dans ce répertoire sera installé sur le système de l'utilisateur quand il installe votre paquet, la seule différence est que dpkg installera les fichiers dans le répertoire racine.
Ce répertoire temporaire est d'ordinaire créé sous votre répertoire debian/
dans l'arbre des sources décomprimées. Il est normalement nommé
debian/tmp
ou debian/nom_du_paquet
.
Gardez à l'esprit que bien que vous deviez faire en sorte que le programme s'installe sous debian/nom_du_paquet, il doit continuer à s'exécuter correctement quand il est installé sous le répertoire racine, c'est-à-dire quand il est installé à partir du paquet .deb. Aussi vous ne devez pas laisser le système de création coder en dur dans les fichiers du paquet des chaînes de caractères comme /home/me/deb/gentoo-0.9.12/usr/share/gentoo.
Avec des programmes utilisant GNU autoconf, ceci est relativement facile. La plupart de ces programmes ont des fichiers makefile sont par défaut configurés de manière à permettre l'installation dans un répertoire quelconque, en gardant à l'esprit que /usr (par exemple) est le préfixe standard. Quand il détecte que votre programme utilise autoconf, dh_make va mettre en place des commandes pour le faire automatiquement, et vous pouvez tout aussi bien passer à la section suivante. Mais avec d'autres programmes, vous devrez plus que probablement examiner et éditer les Makefiles.
Voici les parties concernées du Makefile de gentoo :
# Where to put binary on 'make install'? BIN = /usr/local/bin # Where to put icons on 'make install'? ICONS = /usr/local/lib/gentoo/
Nous voyons que les fichiers sont configurés pour s'installer sous
/usr/local/
. Changez ces chemins en :
# Where to put binary on 'make install'? BIN = $(DESTDIR)/usr/bin # Where to put icons on '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 positions exactes des exécutables, icônes, documentations, etc, sont spécifiées dans le Standard de la Hiérarchie de Fichiers (voir /usr/share/doc/debian/debian-policy/fhs/). Je vous recommande de le consulter et de lire les sections relatives à votre paquet.
Dès lors, nous devrions installer l'exécutable sous /usr/bin plutôt que /usr/local/bin, la page de manuel sous /usr/share/man/man1 plutôt que sous /usr/local/man/man1, etc. Notez qu'il n'y a pas de page de manuel mentionnée dans le fichier makefile, mais comme les Normes Debian requièrent que chaque programme en ait une, nous en créerons une plus tard et l'installerons sous /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 pouvez avoir à éditer des fichiers sources C réels pour les faire utiliser les positions correctes. Mais où et que chercher ? Vous pouvez trouver où en lançant :
grep -rn usr/local/lib *.[ch]
Grep va récursivement parcourir l'arbre des sources et vous dire le nom des fichiers et le numéro de ligne où il trouve une occurrence.
Éditez ces fichiers et à ces lignes remplacez /usr/local/* par /usr/* -- et c'est à peu près tout. Soyez attentif à ne pas casser le reste du code ! :-)
Après quoi vous devriez trouver la cible d'installation (cherchez une ligne qui commence avec « 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. Auparavant, la cible d'installation de gentoo disait :
install: gentoo install ./gentoo $(BIN) install icons/* $(ICONS) install gentoorc-example $(HOME)/.gentoorc
Après votre modification elle dit :
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 commandes dans la règle. Le fichier makefile originel ne l'avait pas parce que habituellement /usr/local/bin et les autres répertoires existent déjà sur le système dans lequel « make install » est exécuté. Cependant, comme nous installerons dans nos propres répertoires vides (ou même non-existants), nous aurons à créer chacun de ces répertoires.
Nous pouvons ajouter d'autres choses à 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
Le lecteur attentif notera que j'ai changé « gentoo » en « gentoo-target » dans la ligne « install: ». C'est ce qu'on appelle une correction de bogue sans rapport :-).
Chaque fois que vous faites des modifications qui ne sont pas spécifiquement liées à Debian, envoyez les au responsable amont pour qu'elles puissent être incluses dans la version suivante du programme et que tout le monde puisse en bénéficier. 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.
Il y a souvent un problème commun : 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, nous devons la changer en une bibliothèque qui existe dans Debian, et qui sert à la même chose.
Ainsi, s'il y a une ligne dans le Makefile (ou Makefile.in) de votre programme qui dit quelque chose comme ceci (et votre programme ne compile pas) :
LIBS = -lcurses -lquelquechose -lautrechose
Changez la en ceci, et cela marchera probablement :
LIBS = -lncurses -lquelquechose -lautrechose
(L'auteur réalise que ceci n'est pas le meilleur exemple dans la mesure où notre paquet libncurses est maintenant livrées avec un lien symbolique libcurses.o, mais il n'en a pas trouvé de meilleur. Toutes suggestions bienvenues :-).
Guide du nouveau responsable Debian
version 1.2, 6 avril 2002.joy-mg@debian.org
frederic.dumont@easynet.be