« Compiler un programme » : différence entre les versions
(catégorie) |
Aucun résumé des modifications |
||
Ligne 2 : | Ligne 2 : | ||
= Compiler une application = | = Compiler une application = | ||
<div class="leapar">par [[Utilisateur:LeaJice|Jean-Christophe]]</div><div class="leadesc">Transformer le source d'un programme pour le rendre éxécutable par votre machine.</div> | |||
---- | ---- | ||
Ligne 220 : | Ligne 220 : | ||
<div class="merci">Cette page est issue de la documentation 'pré-wiki' de Léa a été convertie avec HTML::WikiConverter. Elle fut créée par Jean-Christophe Cardot le 25/02/2000.</div> | <div class="merci">Cette page est issue de la documentation 'pré-wiki' de Léa a été convertie avec HTML::WikiConverter. Elle fut créée par Jean-Christophe Cardot le 25/02/2000.</div> | ||
<br/> | |||
<br/> | |||
'''<b>[[Software-index|@ Retour à la rubrique Logiciels]]</b>''' | |||
= Copyright = | = Copyright = | ||
Copyright © 25/02/2000, Jean-Christophe Cardot | Copyright © 25/02/2000, [[Utilisateur:LeaJice|Jean-Christophe Cardot]] | ||
{{CC-BY-NC-SA}} | {{CC-BY-NC-SA}} |
Version du 3 avril 2010 à 12:57
Compiler une application
Prérequis : vérifiez que vous avez les packages nécessaires à la compilation.
Rappel : si votre distribution contient un paquetage pour <paquetage>, préférez utiliser ce paquetage plutôt que les sources. Certains puristes prétendrons qu'utiliser les sources c'est l'esprit Linux, mais ce sont surtout des problèmes de dépendances non gérées, des choix par forcément simple à faire sur l'utilisation de telle ou telle fonctionnalité du logiciel que l'on désire compiler.
Pour vérifier que votre distribution contient un paquetage pour <paquetage>, il faut utiliser l'outil de gestion de paquetage de celle-ci. Par exemple :
Votre distribution contient aussi presque surement un outil graphique pour obtenir cette information. Pour plus d'information sur ces questions, consulter cette documentation. |
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 cartes 3Dfx qui nécessitent la recompilation de Mesa, ou des scanners SCSI avec SANE...),
- vous ne disposez pas de l'application dans sa version précompilée,
- ça vous fait plaisir :-),
- etc.
Pourquoi ne pas compiler ?
Si vous ne vous sentez pas à l'aise, le mieux est de prendre les logiciels précompilés de votre distribution, accessibles en général dans un outil en mode graphique (rpmdrake sous Mandriva, synaptic sous Debian, etc.) Ainsi vous serez sûr que le logiciel fonctionne sans problème pour votre distribution, car ces logiciels précompilés ont été adaptés spécialement et testés.
Si le logiciel n'est pas disponible dans votre gestionnaire d'installation, vous pouvez également trouver des archives compilées sur le site du logiciel que vous voulez installer (souvent avec l'extension .tar.gz ou .tar.bz2). Dans ce cas, utilisez-les.
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.
autotools
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.
qmake
Certains projets QT n'utilise pas les autotools
, ils leur préfèrent : qmake
. On repère ces projets par la présence d'un fichier .pro
. Pour pouvoir les compiler, il faut d'abord générer le makefile
, puis procéder habituellement.
[root@taz appli]# qmake
[root@taz appli]# make
Imakefile
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
CMake
Dans un esprit de portabilité, et pour répondre aux nouvelles demandes, un nouveau système de génération de Makefile est apparu. Il s'agit de CMake.
Ce système a été conçu pour une portabilité maximale, aussi bien sous les systèmes Unix (et Unix like), que pour Mac OS ou pour Windows. La configuration (relative à la recherche des dépendances) réside dans un fichier CMakeLists.txt. Suivant les projets, la procédure sera la suivante :
[root@taz appli]# mkdir build
[root@taz appli]# cd build
[root@taz appli]# cmake ..
[root@taz appli]# make
autres
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 les autotools
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
`--> doc
+--> etc
+--> include
+--> lib
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
... ).
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 -O2 -pipe"
$ export CXXFLAGS="-mcpu=i686 -O6 -pipe"
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 (2) d'optimisation (pour la vitesse d'exécution) maximum (on peut préciser Os si l'on ne veut pas des optimisations qui augmente la taille de l'exécutable généré).
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.).
@ Retour à la rubrique Logiciels
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/ |