« Compiler un programme » : différence entre les versions

De Lea Linux
Aller à la navigation Aller à la recherche
m (Software-soft gere-compil déplacé vers Compiler un programme)
m (→‎Compiler une application : : avertissement)
Ligne 6 : Ligne 6 :


<u>Prérequis</u> : vérifiez que vous avez les [[Kernel-compil|packages nécessaires à la compilation]].
<u>Prérequis</u> : vérifiez que vous avez les [[Kernel-compil|packages nécessaires à la compilation]].
{{Preferer un paquetage|<paquetage>}}


== Pourquoi compiler une application ? ==
== Pourquoi compiler une application ? ==

Version du 30 août 2006 à 08:48

Compiler une application

Compiler une application
par Jean-Christophe
Transformer le source d'un programme pour le rendre éxécutable par votre machine.

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 :

  • pour Ubuntu / Debian : apt-cache search <paquetage>
  • pour Mageia / Mandriva : urpmq <paquetage>
  • pour Gentoo : emerge -s <paquetage>
  • pour Slackware : swaret --search <paquetage>

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.

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.

  1. Vérifiez d'abord si vous avez les sources sur le CD de sources de votre distribution (quand vous avez ce CD).
  2. 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

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.).

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.

Copyright

Copyright © 25/02/2000, Jean-Christophe Cardot

Creative Commons License
Creative Commons Attribution iconCreative Commons Share Alike iconCreative Commons Noncommercial
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/