COMPILATION et INSTALLATION D'UN PROGRAMME Date: 5 Octobre 99 Auteur : Zone de publication officielle : http://www.linux-france.org/article/debutant/ Dans ce micro-howto, je traite de la compilation et de l'installation d'un programme en tar.gz. Puisque je me considère encore comme Newbie, j'espère avoir su rester le plus simple et le plus clair possible afin de pouvoir etre compris par les plus nuls d'entre nous :) Préambule : Ma distribution est la RedHat 5.1 (noyau 2.0.35) Pour toutes infos complémentaires : Allons-y : Dans mon home (/home/hugo), j'ai l'archive compactée wmppp-1.3.0.tar.gz récupérée sur un site ftp. Elle contient un programme que je veux installer. Je commence par examiner le contenu de l'archive, sans l'extraire. Certaines archives ne contiennent en effet pas de répertoire : les fichiers s'y trouvent tels quels, en vrac, et seront extraits dans le répertoire courant. Moche. Pour cet examen préalable j'utilise la commande tar, l'option 't' qui liste le contenu d'une archive, l'option 'z' qui précise qu'elle est compactée (gzip), et trois v pour bien voir ce qui se passe : [hugo@Cassis] ~ > tar -tvvvzf ~/wmppp-1.3.0.tar.gz drwxr-xr-x root/root 0 1998-09-15 23:05 wmppp.app/ drwxr-xr-x root/root 0 1998-09-15 22:58 wmppp.app/wmgeneral/ -rw------- root/root 12715 1998-09-15 22:58 wmppp.app/wmgeneral/wmgeneral.c -rw------- root/root 3611 1998-09-15 22:58 wmppp.app/wmgeneral/misc.c -rw------- root/root 1110 1998-09-15 22:58 wmppp.app/wmgeneral/wmgeneral.h -rw------- root/root 165 1998-09-15 22:58 wmppp.app/wmgeneral/misc.h -rw------- root/root 3621 1998-09-15 22:58 wmppp.app/wmgeneral/list.c -rw------- root/root 1876 1998-09-15 22:58 wmppp.app/wmgeneral/list.h drwxr-xr-x root/root 0 1998-09-15 22:58 wmppp.app/wmppp/ -rw-r--r-- root/root 739 1998-09-15 22:58 wmppp.app/wmppp/Makefile -rw-r--r-- root/root 8151 1998-09-15 22:58 wmppp.app/wmppp/wmppp-master.xpm -rw-r--r-- root/root 23940 1998-09-15 22:58 wmppp.app/wmppp/wmppp.c -rw-r--r-- root/root 244 1998-09-15 22:58 wmppp.app/wmppp/getmodemspeed.c -rw-r--r-- root/root 201 1998-09-15 22:58 wmppp.app/wmppp/system.wmppprc drwxr-xr-x root/root 0 1998-09-15 22:58 wmppp.app/wmppp/example-scripts/ -rw------- root/daemon 78 1998-09-15 22:58 wmppp.app/wmppp/example-scripts/chap-secets -rw-r--r-- root/root 0 1998-09-15 22:58 wmppp.app/wmppp/example-scripts/connect-rrors -rwxr-xr-x root/daemon 4544 1998-09-15 22:58 wmppp.app/wmppp/example-scripts/getmodempeed -rwxr-xr-x root/daemon 48 1998-09-15 22:58 wmppp.app/wmppp/example-scripts/ip-down -rwxr-xr-x root/daemon 311 1998-09-15 22:58 wmppp.app/wmppp/example-scripts/ip-up -rw-r--r-- root/daemon 138 1998-09-15 22:58 wmppp.app/wmppp/example-scripts/options -rw------- root/daemon 77 1998-09-15 22:58 wmppp.app/wmppp/example-scripts/pap-secrts -rw------- root/daemon 115 1998-09-15 22:58 wmppp.app/wmppp/example-scripts/wmppp-cht -rwxr-xr-x root/daemon 84 1998-09-15 22:58 wmppp.app/wmppp/example-scripts/wmppp-ifown -rwxr-xr-x root/daemon 77 1998-09-15 22:58 wmppp.app/wmppp/example-scripts/wmppp-strt -rwxr-xr-x root/daemon 434 1998-09-15 22:58 wmppp.app/wmppp/example-scripts/wmppp-stp -rw-r--r-- root/root 193 1998-09-15 22:58 wmppp.app/wmppp/user.wmppprc -rw-r--r-- root/root 2647 1998-09-15 22:58 wmppp.app/BUGS -rw-r--r-- root/root 4666 1998-09-15 22:58 wmppp.app/CHANGES -rw-r--r-- root/root 17982 1998-09-15 22:58 wmppp.app/COPYING -rw-r--r-- root/root 5649 1998-09-15 23:04 wmppp.app/HINTS -rw-r--r-- root/root 2575 1998-09-15 23:05 wmppp.app/INSTALL -rw-r--r-- root/root 2222 1998-09-15 22:58 wmppp.app/README -rw-r--r-- root/root 442 1998-09-15 22:58 wmppp.app/TODO Tous les fichiers proposés se trouvent dans un répertoire, j'extrais donc directement (il me faudrait sinon créer un répertoire réservé à ces sources, m'y placer, et enfin extraire comme suit) : [hugo@Cassis] ~ > tar -xvzf ~/wmppp-1.3.0.tar.gz [ blabla ... la liste des fichiers ] Le "détarrage" de cette archive a donc créé un répertoire wmppp.app dans mon home. Un "tree ~/wmppp.app" sera peut-etre plus clair: [hugo@Cassis] ~ > tree ~/wmppp.app/ /home/hugo/wmppp.app/ |-- BUGS |-- CHANGES |-- COPYING |-- HINTS |-- INSTALL |-- README |-- TODO |-- wmgeneral | |-- list.c | |-- list.h | |-- misc.c | |-- misc.h | |-- wmgeneral.c | `-- wmgeneral.h `-- wmppp |-- Makefile |-- example-scripts | |-- chap-secrets | |-- connect-errors | |-- getmodemspeed | |-- ip-down | |-- ip-up | |-- options | |-- pap-secrets | |-- wmppp-chat | |-- wmppp-ifdown | |-- wmppp-start | `-- wmppp-stop |-- getmodemspeed.c |-- system.wmppprc |-- user.wmppprc |-- wmppp-master.xpm `-- wmppp.c 3 directories, 30 files Plaçons-nous donc dans le répertoire wmppp.app: [hugo@Cassis] ~ > cd wmppp.app/ [hugo@Cassis] ~/wmppp.app > Avec less, on va lire le fichier README et le fichier INSTALL. Autant ouvrir pour cela un nouveau xterm, qui permettra d'avoir deux fenêtres ouvertes, une pour exécuter les commandes nécessaires à l'installation et l'autre pour garder les instructions d'installation sous les yeux. Il suffit de faire: [hugo@Cassis] ~/wmppp.app > xterm & qui ouvre un nouvel xterm. La ligne de commande y apparaît, et nous nous trouvons d'ores et déjà dans le répertoire wmppp.app Dans la nouvelle fenêtre "xterm", faire "less README" puis lire toutes les infos. Tapez 'q' pour quitter puis "less INSTALL" D'après ce fichier INSTALL, après avoir détarré l'archive .tar.gz puis changé de répertoire vers wmppp.app, on doit lancer "make all". Soit, allons-z'y... ((il faudrait aussi traiter du cas des softs sous 'configure' ... un volontaire ?)) [hugo@Cassis] ~/wmppp.app > make all make: *** No rule to make target `all'. Stop. Oh oh, il semble qu'il y a un problème, le gestionnaire de projet 'make' a cherché un fichier appelé 'makefile' ou 'Makefile' afin d'y trouver une règle (une sorte de liste de consignes) appelée 'all' ... mais n'en a pas trouvé. En effet, on voit d'après le résultat de la commande tree ci-dessus que le fichier "Makefile" est dans le sous-répertoire /wmppp.app/wmppp. Il est donc normal que make ne l'ai pas trouvé. Et on remarque que le fichier INSTALL contient une erreur (que l'on pourrait signaler à son auteur s'il nous avait donné son e-mail). le problème qui se pose alors est de savoir si: on doit rester dans le répertoire wmppp.app et faire "make" en lui disant d'utiliser le fichier "wmppp/Makefile" ou si on doit se placer dans le sous répertoire wmppp pour faire le make tapons "man make" (man est ton ami :) dans la section OPTIONS, on lit: -f file Use file as a makefile. On va donc tenter la première solution, c.à.d rester dans le répertoire wmppp.app et taper: [hugo@Cassis] ~/wmppp.app > make -f wmppp/Makefile all make: *** No rule to make target `wmppp.o', needed by `wmppp'. Stop. Donc ça n'a pas fonctionné, il y a toujours un problème de règle :( Tentons donc la deuxième solution: [hugo@Cassis] ~/wmppp.app > cd wmppp [hugo@Cassis] ~/wmppp.app/wmppp > make all cc -g -c -O2 -Wall wmppp.c -o wmppp.o wmppp.c:159: stdlib.h: Aucun fichier ou répertoire de ce type. wmppp.c:160: stdio.h: Aucun fichier ou répertoire de ce type. wmppp.c:161: time.h: Aucun fichier ou répertoire de ce type. wmppp.c:162: string.h: Aucun fichier ou répertoire de ce type. wmppp.c:163: fcntl.h: Aucun fichier ou répertoire de ce type. wmppp.c:164: unistd.h: Aucun fichier ou répertoire de ce type. wmppp.c:165: ctype.h: Aucun fichier ou répertoire de ce type. wmppp.c:167: sys/wait.h: Aucun fichier ou répertoire de ce type. wmppp.c:168: sys/stat.h: Aucun fichier ou répertoire de ce type. wmppp.c:169: sys/param.h: Aucun fichier ou répertoire de ce type. wmppp.c:170: sys/types.h: Aucun fichier ou répertoire de ce type. wmppp.c:171: sys/ioctl.h: Aucun fichier ou répertoire de ce type. wmppp.c:172: sys/socket.h: Aucun fichier ou répertoire de ce type. wmppp.c:174: net/ppp_defs.h: Aucun fichier ou répertoire de ce type. wmppp.c:175: net/if_ppp.h: Aucun fichier ou répertoire de ce type. wmppp.c:177: X11/Xlib.h: Aucun fichier ou répertoire de ce type. wmppp.c:178: X11/xpm.h: Aucun fichier ou répertoire de ce type. wmppp.c:179: X11/extensions/shape.h: Aucun fichier ou répertoire de ce type. In file included from wmppp.c:182: ../wmgeneral/misc.h:4: unistd.h: Aucun fichier ou répertoire de ce type. make: *** [wmppp.o] Error 1 Alors là, c'est sur que ça va pas être facile :))) La première ligne montre que le compilateur a bien été lancé, donc la commande make a bien trouvé le Makefile et su quoi faire. Mais les lignes suivantes montrent qu'il manque tous les headers (les fichiers .h) qui décrivent les fonctions appelées par le programme que je veux compiler... Un petit article Usenet d'appel à l'aide s'impose-t-il ? Pour les faignants, oui mais pas pour les RedHatiens, as du rpm... Il nous manque des fichiers, ils doivent etre sur le CD de la distribution... On insère le cd, on le monte avec mount "/mnt/cdrom" et on tape la commande "rpm -qpl *" après s'etre placé dans le répertoire /mnt/cdrom/RedHat/RPMS. Cela donne la liste de tous les fichiers qui seraient copiés sur le disque si on installait tous les paquetages de la distribution (chose à ne pas faire !). Evidemment cette liste est très longue, donc il faut invoquer : 'rpm -qpl * | less' puis rechercher 'stdio.h'. Pour cela introduire '/stdio.h' suivi d'Entrée et chercher le paquetage (appuyer sur 'n' pour passer à l'occurrence suivante, 'q' pour quitter). Sous Debian invoquer 'apt-cache dump' Astuce permettant d'éviter de chercher sous less : je recherche des headers pour une appli devant tourner sous XFree. J'ai donc fait des rpm -qpl zzzz | grep stdio.h ou zzzz est le nom des paquetages de bibliothèques contenant "-devel" puis en recherchant dans les paquetages XFree86-devel. Après quelques minutes de bitouillages, j'ai trouvé qu'il fallait installer Glibc-devel et XFree86-devel. Bon allez, je le confesse, je ne suis pas un as du rpm, j'ai perdu trop de temps à chercher et j'ai fini par poster sur fcolc: Il existe une autre solution pour retrouver dans quel paquetage se trouve un fichier qui nous manque. Elle suppose qu'on a monté un CD-ROM contenant des fichiers rpm et qu'on s'est placé dans le répertoire qui contient ces rpm. Ce peut etre le CD de la distribution, ou un autre de provenance non douteuse. Solution de Julien Salgado : Il suffit de taper la ligne suivante: for i in *.rpm;do rpm -qlp $i|grep Xlib.h>/dev/null&&echo $i;done Je ne sais pas comment ça marche, mais ça a marché avec ma RedHat 5.1 :) Puis utiliser 'rpm -i NomDuPaquetage.rpm' afin d'installer. À ce moment tous les fichiers qui manquent sont installés, mais cela ne suffit pas :( le compilateur ne les trouve toujours pas. Il faut faire, en tant que root, "/sbin/ldconfig" alors le "make all" fonctionne: [hugo@Cassis] ~/wmppp.app/wmppp > make all cc -g -c -O2 -Wall wmppp.c -o wmppp.o cc -g -c -O2 -Wall ../wmgeneral/wmgeneral.c -o ../wmgeneral/wmgeneral.o cc -g -c -O2 -Wall ../wmgeneral/misc.c -o ../wmgeneral/misc.o cc -g -c -O2 -Wall ../wmgeneral/list.c -o ../wmgeneral/list.o cc -o wmppp wmppp.o ../wmgeneral/wmgeneral.o ../wmgeneral/misc.o ../wmgeneral/list.o -lXext -L/usr/X11R6/lib -lXpm -lXext -lX11 cc -O2 getmodemspeed.c -o getmodemspeed Effectuons un "tree" pour voir ce qui a été créé par le "make all": [hugo@Cassis] ~/wmppp.app > tree . |-- BUGS |-- CHANGES |-- COPYING |-- HINTS |-- INSTALL |-- README |-- TODO |-- wmgeneral | |-- list.c | |-- list.h | |-- list.o | |-- misc.c | |-- misc.h | |-- misc.o | |-- wmgeneral.c | |-- wmgeneral.h | `-- wmgeneral.o `-- wmppp |-- Makefile |-- example-scripts | |-- chap-secrets | |-- connect-errors | |-- getmodemspeed | |-- ip-down | |-- ip-up | |-- options | |-- pap-secrets | |-- wmppp-chat | |-- wmppp-ifdown | |-- wmppp-start | `-- wmppp-stop |-- getmodemspeed |-- getmodemspeed.c |-- system.wmppprc |-- user.wmppprc |-- wmppp |-- wmppp-master.xpm |-- wmppp.c `-- wmppp.o 3 directories, 36 files Six fichiers ont été créés, soient: dans wmppp.app/wmgeneral, il y avait list.c et list.h, misc.c et misc.h et wmgeneral.c et wmgeneral.h. Ont été créés list.o, misc.o et wmgeneral.o dans wmppp.app/wmppp les executables getmodemspeed et wmppp ont été créés ainsi que le fichier wmppp.o Selon le fichier README, il reste à se suider en root pour faire "make install" qui va terminer l'installation, pour comprendre ce qui va se passer, le plus simple est encore de regarder le makefile... Voyons le contenu de ce fichier /wmppp.app/wmppp/Makefile: LIBDIR = -L/usr/X11R6/lib LIBS = -lXpm -lXext -lX11 CFLAGS = -O2 OBJS = wmppp.o \ ../wmgeneral/wmgeneral.o \ ../wmgeneral/misc.o \ ../wmgeneral/list.o .c.o: cc -g -c $(CFLAGS) -Wall $< -o $*.o wmppp: $(OBJS) cc -o wmppp $^ -lXext $(LIBDIR) $(LIBS) all:: wmppp getmodemspeed clean:: for i in $(OBJS) ; do \ rm $$i; \ done rm wmppp getmodemspeed install:: cp -f wmppp /usr/local/bin/ chmod 755 /usr/local/bin/wmppp chown root:root /usr/local/bin/wmppp cp getmodemspeed /etc/ppp/ chmod 755 /etc/ppp/getmodemspeed chown root.root /etc/ppp/getmodemspeed cp -f user.wmppprc /etc/wmppprc chmod 644 /etc/wmppprc chown root.root /etc/wmppprc cp -f user.wmppprc $(HOME)/.wmppprc echo "WMPPP installation finished." On voit donc exactement ce que make install fait: * Copier les deux exécutables que l'on vient de compiler l'un dans /usr/local/bin et l'autre dans /etc/ppp * Donner les bons droits à ces deux fichiers * Puis copier les deux fichiers de config l'un dans /etc et l'autre dans le HOME de root * Afficher le message "Installation terminée". Donc avant de lancer le "make install", on peut prendre la précaution de sauvegarder les deux anciens fichiers de configuration. Si le programme que l'on vient de compiler constitue une mise à jour. Son installation risque alors d'écraser nos anciens fichiers de configuration. [root@Cassis] /home/hugo/wmppp.app/wmppp > make install cp -f wmppp /usr/local/bin/ chmod 755 /usr/local/bin/wmppp chown root:root /usr/local/bin/wmppp cp getmodemspeed /etc/ppp/ chmod 755 /etc/ppp/getmodemspeed chown root.root /etc/ppp/getmodemspeed cp -f user.wmppprc /etc/wmppprc chmod 644 /etc/wmppprc chown root.root /etc/wmppprc cp -f user.wmppprc /root/.wmppprc echo "WMPPP installation finished." WMPPP installation finished. L'installation est terminée, pour libérer de la place sur le disque, on peut maintenant supprimer le répertoire ~/wmppp.app [hugo@Cassis] ~ > rm -ri wmppp.app l'option i de rm permet d'avoir à confirmer la destruction de chaque fichier et donc d'être bien sur de ce qu'on fait. Ben voilà, c'est terminé. Hugues Fertin (a.k.a Hugolino)