Howtos GNU/Linux .: kozaki :. Howtos GNU/Linux

image Tux Makefilecompiler une appli

Pourquoi compiler une application ?

Plusieurs raisons possibles :

  • vous avez envie d'optimiser une application (pour votre CPU par exemple), ou d'installer une version ultra-récente (pas encore packagée). Vous ne pouvez donc vous contenter d'un package type .deb ou .rpm
  • vous voulez utiliser un matériel spécifique avec l'application (les cartes 3Dfx nécessitent la recompilation de Mesa, ou des scanners avec SANE...), ·
  • vous ne disposez pas de l'application dans sa version précompilée, · ça vous fait plaisir :-), etc.
  • "Parce-que c'est comme ça qu'on installe un logiciel sous Linux" Ohhh la là, ça a changé !o) Aujourd'hui, la plupart des logiciels s'installent très facilement (en 2-3 clics) sous Linux. Quasi toutes les distributions proposent un gestionnaire de paquetages logiciels, permettant de gagner tout le temps qu'on perd sous Windows à aller chercher chaque application et pilote un par un. Voyez un exemple de gestionnaire de paquetages logiciels.

I - DÉMARCHE USUELLE (la sainte trinité du bon linuxien ;o)

A - Récupérer les sources

Tout d'abord vous devez récupérer les sources de l'application, sous forme d'un fichier.tar.gz ,.tgz, .tar.bz2, ou .src.rpm, etc.

linux girl Vérifiez d'abord sur le(s) CD(s) de sources de votre distribution, il se peut très bien que ce que vous cherchez y soit (quand vous avez ce CD).
Sinon, vous devrez le récupérer autrement (CD d'une revue, internet (Freshmeat  ou Tucows.linux  par exemple), etc.).
Bref, tous les moyens sont bons. Essayez d'avoir la dernière version, tant qu'à faire, puis passez à la suite.

B - Décompresser les sources du logiciel

Les archives type ".tar.qqch" doivent être décompressées. On se place dans le répertoire où on a téléchargé la source et on la décompresse. La procédure diffère suivant le format des sources (plus précisemment le format de compression : .tar.gz/.tgz ou .tar.bz2/.tbz2).

Décompresser un tar.qqch : Généralités

Pour vérifier votre version de 'tar' (sous Linux vous devriez disposer de GNU tar), tapez

$ tar --version

La 1ère ligne de l'outpout devrait dire qu'il s'agit de GNU tar, sinon c'est que vous utilisez une autre version.

A la base : $ tar [-C {repertoire}] -xvzf {fichier.tar.gz} (entre crochets [] : optionnel)
L'option -C {répertoire} si vous désirez extraire tous les fichiers dans un répertoire spécifique.
En fait :

  1. tar xvf bidule.tar
  2. tar xvzf bidule.tar.gz
  3. tar xvjf bidule.tar.bz2
    x pour extraire,
    v pour voir ce qui se passe
    , z (compression Gzip) ou j (Bzip2),
    f pour dire qu'il s'agit d'un fichier.
  4. Détails en tapant man tar (merci à mattaw)

Décompresser les sources de votre application type ".tar.xx" / ".tgz"

Il faut d'abord décompresser le package dans le répertoire de votre choix. /usr/src me semble un bon choix, mais vous êtes libres.
# cd /usr/src (se placer dans le rép. où on veut décompreser) ;
# tar zxvf /ou/se/trouve/le_package.tar.gz
ou bien : # tar yxvf /ou/se/trouve/le_package.tar.bz2
ou bien : # tar jxvf /ou/se/trouve/le_package.tar.bz2
Si votre version de tar ne comprend pas la dernière commande, essayez :
# tar --use-compress-program bzip2 -xvf /là_ou_est/le_package.tar.bz2

suite Remarque : avant de décompresser pour de bon l'archive, il peut être bon de la tester, notamment pour vérifier qu'elle va bien se décompresser dans son propre répertoire, en remplaçant la commande x (comme extrait) de tar (ci-dessus) par un t (comme test) :
# tar zxvf /ou/se/trouve/le_package.tgz

Toutes les lignes (la liste des fichiers présents dans l'archive) doivent commencer par "le_package/..." ce qui assure que l'archive se décompressera dans le répertoire du même nom. Dans le cas contraire, créez un répertoire à la main (mkdir) allez-y (cd) puis exécutez la commande tar voulue.

C - Compiler les sources décompressées

1) Sources au format .src.rpm ou .srpm

nb : .src.rpm source pour développeurs
La compilation se fait en une seule ligne de commande. Elle génère un package type [nom].i586.rpm (selon que votre architecture est x86 ou x86_64) :
# rpm --rebuild le_package-version.src.rpm

Cela va créer un package au format RPM : le_package-version.i?86.rpm dans le répertoire /usr/src/RPM/RPMS/i?86. Ce répertoire peut différer légèrement suivant la distribution.
Il faut ensuite installer ce package par la commande RPM habituelle :
# rpm -ivh le_package-version.i586.rpm
Il s'installe maintenant comme tout package .rpm, le plus simple étant de double-cliquer dessus (voyiez le guide RPMdrake).

2) Sources au format .tar.*

C'est le format le plus souvent employé pour les sources. Le nom du package est en général le nom du fichier suivi de la version. Par exemple : xtel-3.2.1.tar.gz. tgz est une contraction de "tar.gz".

b) Compiler les sources

configure et make transforment les sources en fichier(s) binaire(s) (on dit éxécutable) parfaitement adaptés à votre système. make install... installe ces derniers (ainsi que la documentation, les exemples de configuration...) là où ils seront automatiquement trouvés par le système et donc utilisables.

Vous pouvez très bien le faire à la main (ci-dessous), ou utiliser checkinstall : Ce logiciel permet de créer des paquetages Slackware (.tgz), Debian (.deb) et RedHat/Mandriva (.rpm), qui s'installent et se désinstallent facilement depuis le gestionnaire de packages !
ckeckinstall est le plus souvent installable depuis le gestionnaire de packages.
Trustonme explique comment utiliser checkinstall.

Rq: il est possible d'optimiser la compilation des applications en fonction de la puissance de votre cpu: optimiser la compilation

La compilation peut différer selon chaque package, car l'auteur est libre de procéder comme bon lui semble. Cependant des standards de fait existent et sont généralement bien suivis : la présence de fichiers README et INSTALL dans l'archive.
C'est pourquoi il est fortement recommendé de lire ces fichiers avant de commencer, car ils donnent les détails pour bien compiler. L'un des deux a en général une section "installation" ou "compilation" qui donne les étapes à suivre. Ils indiquent aussi quels sont les prérequis (les librairies dont le logiciel a besoin), les configurations à faire sur votre système pour que l'appli fonctionne, etc.
De plus en plus souvent, les archives contiennent un fichier exécutable nommé "configure". Dans ce cas, la compilation est assez s"info"le, car le programme "configure" détecte les spécificités de votre machine automatiquement. Il suffit généralement de faire :

$ ./configure
$ make

(passez en root pour une installation système / tous utilisateurs)
# make install

Et c'est tout !
Le programme devrait être installé sur votre système à présent. Certains progr. s'installent dans /usr/local/bin, donc vous devez éditer /etc/ld.so.conf en y ajoutant le chemin de la librairie du programme
Cependant lisez toujours le fichier README, car il faut parfois passer des commandes à configure.

Dans les cas ou il n'y a pas de script "configure" :

Si vous avez un fichier Imakefile, vous pouvez essayer :

# xmkmf
    # make
Enfin s'il n'y a qu'un fichier Makefile ou makefile

essayez juste :
# make

Bref, il y a plein de façons de faire, mais dans tous les cas lisez les fichiers README et autres LISEZMOI.

Parfois, même en suivant bien les recommendations, cela coince

C'est souvent dû au fait que les distributions ne placent pas toutes les mêmes choses au même endroit, et que le développeur de l'appli n'a pas la même distribution que vous. Dans ce cas, regardez le fichier qui "coince", et s'il vous dit qu'il ne trouve pas tel ou tel fichier, recherchez-le sur votre disque dur (utilisez le couple updatedb / locate, très pratique), et n'hésitez pas à modifier le fichier source (avec votre éditeur de texte préféré) afin de faire pointer le fichier vers le bon endroit. Vérifiez aussi le Makefile.


topofpage


Comment on fait pour INSTALLER UN .tar.gz, .tar.bz2 ou .tgz ?

par: ThE_TemPLar
Alors voila :

1. Copiez (ou telechargez) tout d'abord le fichier .tar.gz a l'endroit voulu.

Dans ce petit tutorial je supposerais que vous etes root et seulement root (pas su, sous un shell,.code, console, xterm, Konsole, gnome Terminal, Eterm ou autre truc de ce genre...

¤ Dans /usr/src (/user/sources) vous faites un zoli rangement pour vous y retrouvez ;):
mkdir {a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z} && mkdir lib{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z}

Bon voila vous avez un zoli /usr/src maintenant vous copiez, votre fichier tar.gz a l'endroit destine MIS A PART POUR LE NOYAU que vous déballez DANS /USR/SRC !! (exemple iirc dans i, kdelibs dans k)
Apres vous, faites des sous rep. si vous voulez ( détail de la commande )

Puis vous dépacketez grace a la magnifique commande tar :
Si c'est un tar.gz :
tar -zxvf fichier-version.tar.gz (ou fichier-version.tgz)

Ou si c'est un .tar.bz2 :
tar -jxvf fichier-version.tar.bz2
Là, vous verrez dans la plupart des cas : fichier-version/fichier.c

2. Compilez

Dès que le depaquetage s'arrete (on dis déballer ou dépaqueter une archive [en anglais: archive ou tarball]), vous allez dans le dossier cree et la vous lisez le(s) fichier(s) :
  - README
  - INSTALL
  - Changelog (occasionnellement)

Parfois ces fichiers se trouvent dans un repertoire: doc [ex qt], install [ex gcc] ou autre, enfin cherchez un peu :).
Lisez les FAQ en cas, et faites tres attention aux conseils donnes dans le README, verifiez que vous avez les libs qu'il faut, tout le barratin et autre.

3. Options de compilation

¤ Bon vous avez tout lu, donc vous etes dans le dossier du tarball (archive) depackete, a cet endroit vous faites :
./configure --help | less pour connaitre les options du configure.

Il y a des options communes comme :
--prefix=/dossier : le dossier racine où on veut mettre les fichiers, c'est a dire que les binaires seront dans /dossier/bin donc si vous mettez /usr ca fera /usr/bin, comprendo¿
--sysconfdir=PREFIX/etc : normalement les fichiers de config se mettront dans le dossier du prefix/etc (si il n'y a pas de prefix, le prefix par defaut est generalement /usr/local).
Si vous mettez /usr pour PREFIX, mettez /etc pour SYSCONFDIR, car ca correspondra a vos demandes.
--localstatedir=PREFIX/var : normalement les fichiers locaux, independant du systeme se mettront dans PREFIX/var comme pour sysconfdir avec PREFIX/var.
Je vous conseille de mettre /var si vous avez mis /usr a PREFIX.
--with-gnu-ld : mis à part si vous utilisez EGCS dans ce cas, vous avez installé le compilateur tout seul et vous etes assez experimenté vous savoir ce que c'est, généralement vous avec gcc (Gnu C Compiler, Gnu Compiler Collection) qui utilise le linker dynamic : ld. Donc c'est un flag a mettre si vous avez gcc, cela permet de regler certains problemes (surtout avec les compilateurs)
Si une de ces options citees n'est pas ./configure help | less, ne la mettez pas et regardez les options que vous avez.
(avec less: fleche bas pour voir le bas du document et q pour quitter, en fait ça pipe la sortie stdout vers un fichier temporaire dans /tmp et prend vi pour l'analiser, les commandes sont donc celles de vi )

Après la configuration des sources, faites
make,
Et : make -n install, puis : make install.

Donc on résume :

  • ./configure help | less
  • Apres vous faites ./configure [Options], et puis make
  • ET sauf contradiction du README ou du fichier INSTALL qui sont "info"ORTANTS A LIRE, vous faites : make -n install pour savoir ou les fichiers vont être installés, et :
  • make install

suite À ce moment la les fichiers binaires, de configuration, et les librairies sont installées, faites quelques essais puis si le logiciel marche, effacez le dossier du tarball: rm -r fichier-version, mais pas le tarball qui peut servir ;).

topofpage

III - Trucs & actuces pour les sources utilisant AUTOCONF

A - Indiquer où installer les sources

Souvent, pour tester un programme récent, vous souhaiterez installez celui-ci ailleurs que la destination par défaut prévue par l'auteur du programme.

Si celui-ci utilise les paquetages autoconf, la solution est s"info"le, puisque prévue par le paquetage : il suffit de le dire au script configure. Placez vous dans le résertoire contenant les sources du logiciel, et tapez :
$ ./configure --prefix=/opt/[destination]
Cette méthode indique au script configure quelle est la racine de l'installation ; en général l'installation proprement dite créera une arborescence :
+ma-destination +--> bin +--> share +--> etc +--> include +--> lib `--> doc
dans laquelle seront effectivement copiés les fichiers nécessaires à la compilation de programme utilisant cette librairie, et les programmes eux-mêmes.

Mais, vous pouvez vouloir préciser beaucoup plus finement le type de l'installation.
Par exemple, vous souhaitez que tous vos fichiers de configuration soient stockés dans /etc (c'est le FHS - File Hierarchy Standard). Alors il faut taper :
$ ./configure --prefix=/opt/ma-destination --sysconfdir=/etc

Exemple :
Templar : Il faut savoir où mettre tes fichiers de config pour les logiciels :

Ou installer l'appli: ./configure --prefix=/opt
Si tu veux que les fichiers de config soient dans /etc : --sysconfdir=/etc
Et si tu veux que les fichiers locaux (ils appellent ça comme ça) soit midans /var : --localstatedir=/var
Pour en savoir plus sur les diverses options de ./configure, fais :
$ ./configure --help | less
donc, si on veut install un tarball dans /opt, on doit entrer :
./configure --prefix=/opt --sysconfdir=/etc --localstatedir=/var

Le script ./configure se plaint de l'absence d'une librairie !

Mais, vous, vous savez que vous l'avez installée dant /opt/devlib en utilisant une ligne :
$ ./configure --prefix=/opt/devlib
Si ./configure se plaint, c'est qu'il n'est pas capable de trouver la dite librairie ! (Le script a sans doute "oublié" de tester la présence d'un autre script : malib-config ... ).

Note aux développeurs de programmes utilisant gtk et imlib : les deux ne sont pas liées directement, on peut les installer dans deux répertoires différents, donc s'il vous plaît utilisez gtk-config et imlib-config pour savoir où sont installées ces deux librairies).

Il faut savoir que ./configure utilise les variables shell standard CC, CFLAGS, CXX, CXXFLAGS, LDFLAGS pour savoir comment utiliser le compilateur.
Donc l'astuce, puisque ./configure ne trouve pas la librairie, est de passer par ces variables en précisant par exemple :

  • [.. src]$ export CFLAGS="-I/opt/devlib/include" pour indiquer au compilateur C que les includes sont dans /opt/devlib/include
  • [.. src]$ export CXXFLAGS="-I/opt/devlib/include" pour indiquer au compilateur Crel="external" que les includes sont dans /opt/devlib/include
  • [.. src]$ export LDFLAGS="-L/opt/devlib/lib" pour indiquer au linker que les librairies sont dans /opt/devlib/lib

Puis de relancer ./configure avec les options idoines. Ceci règle quelques problèmes seulement, mais il est bon de les connaître avant de râler que les programmes libres c'est bien qu'est-ce que c'est pénible à installer.
Utilisez les variables CC et CXX pour indiquer à ./configure d'utiliser CC comme compilateur C et CXX comme compilateur Crel="external".

B - Optimiser la compilation d'un programme pour votre processeur

Là c'est s"info"le, il suffit de faire (une fois que vous avez lu le paragraphe précédant) :

$ export CFLAGS="-mcpu=i686 -O6"
            $ export CXXFLAGS="-mcpu=i686 -O6"

avant de lancer ./configure, pour dire aux compilateurs C et Crel="external" de compiler pour l'architecture i686 (pour la classe pentium pro et pentium II ; on peut utiliser i586 pour les pentiums, i486, i386, et sans doute d'autres options), avec le niveau d'optimisation 6 pour la vitesse d'exécution maximum (attention O6 est un peu risqué - paraît-il, mais je n'ai jamais eu de problème - donc si votre programme a des difficultés à fonctionner avec ce niveau d'optimisation, avant de vous plaindre au développeur, essayez -O1 comme niveau ;).

Quelques fois, le script ./configure prévoit des optimisations, par exemple il faut taper :
$ ./configure --optimization=yes
Utilisez ./configure --help pour le savoir!
On peut d'après les créateurs du compilateur egcs (renommé gcc 1.1.2 alias 2.92.2) obtenir au moins 5% de performance en plus, & jusqu'a 30% de performance en plus pour certains (très rares) programmes... ce peut etre la différence entre une animation fluide et saccadée...

attention Enfin, il n'est pas recommandé de compiler des programmes vitaux pour la sécurité avec des options non standard, par exemple ne compilez pas votre serveur Apache avec ces options si elles ne sont pas supportées par l'équipe de développement d'Apache ! Sinon, en cas de trou de sécurité dans votre configuration, vous risquez de ne pas être entendu.

Autres formats
Merci d'ajouter vos liens et howtos sur le forum, pour la compilation des sources avec d'autres format de packages ? (Je pense aux packages Debian par exemple.)

Trop cool pour Internet Explorer