Compiler un programme
Compiler une application
Prérequis : vérifiez que vous avez les [../kernel/compil.php3#compil_appli packages nécessaires à la compilation].
Pourquoi compiler une application ?
Plusieurs raisons à cela :
- vous avez envie d'optimiser une application pour votre CPU par exemple,
- vous voulez utiliser un matériel spécifique avec votre application (exemple des [../hardware/3dfx.php3 cartes 3Dfx] qui nécessitent la recompilation de Mesa, ou des [../hardware/scanner.php3 scanners] avec SANE...),
- vous ne disposez pas de l'application dans sa version précompilée,
- ça vous fait plaisir :-),
- etc.
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 ou .tgz ou .tar.bz2, ou .src.rpm, etc.
- Vérifiez d'abord si vous avez les sources sur le CD de sources de votre distribution (quand vous avez ce CD).
- Sinon, vous devrez le récupérer autrement (CD d'une revue, internet (Freshmeat ou Tucows par exemple), etc.).
Bref, tous les moyens sont bons. Essayez d'avoir la dernière version, tant qu'à faire, puis passez à la suite.
Compiler les sources
La procédure diffère suivant le format des sources.
Sources au format .src.rpm ou .srpm
La compilation se fait en une seule ligne de commande généralement, elle génère un package .i?86.rpm (ou .alpha.rpm suivant votre architecture) :
[root@taz src]# 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 :
[root@taz i586]# rpm -ivh le_package-version.i586.rpm
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".
Décompresser les sources
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.
[root@taz root]# cd /usr/src [root@taz root]# tar zxvf /ou/se/trouve/le_package.tar.gz
ou bien :
[root@taz root]# tar yxvf /ou/se/trouve/le_package.tar.bz2
ou bien :
[root@taz root]# tar jxvf /ou/se/trouve/le_package.tar.bz2
Si votre version de tar ne comprend pas la dernière commande, essayez :
[root@taz root]# tar --use-compress-program bzip2 \ -xvf /ou/se/trouve/le_package.tar.bz2
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 teste) :
[root@taz root]# tar ztvf /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.
Compiler les sources
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 vont vous expliquer comment compiler. L'un des deux a en général une section "installation" ou "compilation" qui donne les étapes à suivre. Vous pourrez aussi y lire les prérequis (de quelles librairies 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 simple, car le programme "configure" détecte les spécificités de votre machine automatiquement. Il suffit généralement de faire :
[root@taz appli]# ./configure [root@taz appli]# make [root@taz appli]# make install
Et c'est tout !
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 :
[root@taz appli]# xmkmf [root@taz appli]# make
Enfin s'il n'y a qu'un fichier Makefile ou makefile, essayez juste :
[root@taz appli]# 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 va coincer. 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.
Trucs & actuces pour les sources utilisant autoconf
Merci à Fred pour ce pararaphe.
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 simple, 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/ma-destination
Il faut noter que 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 arboressence :
+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
Pour en savoir plus sur les diverses options de ./configure, faites :
$ ./configure --help | less
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 :
[user@becane src]$ ./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 :
[user@becane src]$ export CFLAGS="-I/opt/devlib/include"
pour indiquer au compilateur C que les includes sont dans /opt/devlib/include
[user@becane src]$ export CXXFLAGS="-I/opt/devlib/include"
pour indiquer au compilateur C++ que les includes sont dans /opt/devlib/include
[user@becane 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 C++.
Optimiser pour votre processeur la compilation d'un programme
Là c'est simple, il suffit de faire (cf plus paragraphe précédant) :
$ export CFLAGS="-mcpu=i686 -O6"
$ export CXXFLAGS="-mcpu=i686 -O6"
avant de lancer ./configure, pour dire aux compilateurs C et C++ de compiler pour l'architecture i686 (pentium pro et pentium II, on peut utiliser i586 pour les pentiums, i486, i386, et sans doute d'autres options), avec le niveau (6) d'optimisation (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 jusqu'a 30% de performance en plus pour certains (très rares) programmes et au moins 5% de performance en plus... ce peut etre la différence entre une animation fluide et saccadée...
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
Un volontaire pour me décrire la compilation des sources avec d'autres format de packages ?
Installer le logiciel
Je ne vais décrire ici que l'installation d'un logiciel provenant d'une archive .tar.*, car l'installation d'un rpm a déjà été vue.
En fait, là encore, il faut lire les fichiers README et/ou INSTALL.
Cependant, on peut dire que de manière générale, il suffit de faire :
[root@taz appli]# make install
pour copier les fichiers binaires, les librairies générées, le fontes, etc. au bon endroit.
Mais chaque appli a ses spécificités qu'il faut prendre en compte pour qu'elle tourne bien (par exemple, modification de certains fichiers de config, etc.).
Copyright
Copyright © 25/02/2000, Jean-Christophe Cardot
Ce document est publié sous licence Creative Commons Attribution, Partage à l'identique, Contexte non commercial 2.0 : http://creativecommons.org/licenses/by-nc-sa/2.0/fr/ |