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

De Lea Linux
Aller à la navigation Aller à la recherche
m (mise en forme)
Aucun résumé des modifications
 
(10 versions intermédiaires par 5 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
[[Category:Gérer ses logiciels]]
[[Category:Logiciels]]
= Compiler une application =
= Compiler une application =


<div class="leatitre">Compiler une application</div><div class="leapar">par Jean-Christophe</div><div class="leadesc">Transformer le source d'un programme pour le rendre éxécutable par votre machine.</div>
par [[Utilisateur:LeaJice|Jean-Christophe]]
----
 
Transformer le code source d'un programme pour le rendre éxécutable par votre machine.


<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 ? ==
Ligne 16 : Ligne 19 :
* ça vous fait plaisir :-),
* ça vous fait plaisir :-),
* etc.
* 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 ==
== Récupérer les sources ==


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


# Vérifiez d'abord si vous avez les sources sur le CD de sources de votre distribution (quand vous avez ce CD).
# Vérifiez d'abord si vous avez les sources sur le CD de sources de votre distribution (quand vous avez ce CD).
Ligne 30 : Ligne 40 :
La procédure diffère suivant le format des sources.
La procédure diffère suivant le format des sources.


=== Sources au format <tt>.src.rpm</tt> ou <tt>.srpm</tt> ===
=== Sources au format <b>.src.rpm</b> ou <b>.srpm</b> ===


La compilation se fait en une seule ligne de commande généralement, elle génère un package <tt>.i?86.rpm</tt> (ou <tt>.alpha.rpm</tt> suivant votre architecture) :
La compilation se fait en une seule ligne de commande généralement, elle génère un package <b>.i?86.rpm</b> (ou <b>.alpha.rpm</b> suivant votre architecture) :


  '''[root@taz src]#''' rpm --rebuild le_package-version.src.rpm
  '''[root@taz src]#''' rpm --rebuild le_package-version.src.rpm


Cela va créer un package au format RPM : <tt>le_package-version.i?86.rpm</tt> dans le répertoire <tt>/usr/src/RPM/RPMS/i?86</tt>. Ce répertoire peut différer légèrement suivant la distribution.
Cela va créer un package au format RPM : <b>le_package-version.i?86.rpm</b> dans le répertoire <b>/usr/src/RPM/RPMS/i?86</b>. Ce répertoire peut différer légèrement suivant la distribution.


Il faut ensuite installer ce package par la commande RPM habituelle :
Il faut ensuite installer ce package par la commande RPM habituelle :
Ligne 42 : Ligne 52 :
  '''[root@taz i586]#''' rpm -ivh le_package-version.i586.rpm
  '''[root@taz i586]#''' rpm -ivh le_package-version.i586.rpm


=== Sources au format <tt>.tar.*</tt> ===
=== Sources au format <b>.tar.*</b> ===


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 : <tt>xtel-3.2.1.tar.gz</tt>. "<tt>tgz</tt>" est une contraction de "<tt>tar.gz</tt>".
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 : <b>xtel-3.2.1.tar.gz</b>. "<b>tgz</b>" est une contraction de "<b>tar.gz</b>".


==== Décompresser les sources ====
==== Décompresser les sources ====


Il faut d'abord décompresser le package dans le répertoire de votre choix. <tt>/usr/src</tt> me semble un bon choix, mais vous êtes libres.
Il faut d'abord décompresser le package dans le répertoire de votre choix. <b>/usr/src</b> me semble un bon choix, mais vous êtes libres.


  '''[root@taz root]#''' cd /usr/src
  '''[root@taz root]#''' cd /usr/src
Ligne 66 : Ligne 76 :
                       -xvf /ou/se/trouve/le_package.tar.'''bz2'''
                       -xvf /ou/se/trouve/le_package.tar.'''bz2'''


'''<u>Remarque</u>''' : 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 '''<tt>x</tt>''' (comme e'''x'''trait) de tar (ci-dessus) par un '''<tt>t</tt>''' (comme '''t'''este) :
'''<u>Remarque</u>''' : 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 '''<b>x</b>''' (comme e'''x'''trait) de tar (ci-dessus) par un '''<b>t</b>''' (comme '''t'''este) :


  '''[root@taz root]#''' tar z'''t'''vf /ou/se/trouve/le_package.tgz
  '''[root@taz root]#''' tar z'''t'''vf /ou/se/trouve/le_package.tgz


Toutes les lignes (la liste des fichiers présents dans l'archive) doivent commencer par "<tt>le_package/...</tt>" 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 (<tt>mkdir</tt>) allez-y (<tt>cd</tt>) puis exécutez la commande <tt>tar</tt> voulue.
Toutes les lignes (la liste des fichiers présents dans l'archive) doivent commencer par "<b>le_package/...</b>" 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 (<b>mkdir</b>) allez-y (<b>cd</b>) puis exécutez la commande <b>tar</b> voulue.


==== Compiler les sources ====
==== 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 <tt>README</tt> et <tt>INSTALL</tt> dans l'archive.
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 <b>README</b> et <b>INSTALL</b> 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.
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.
Ligne 80 : Ligne 90 :
===== autotools =====
===== autotools =====


De plus en plus souvent, les archives contiennent un fichier exécutable nommé "'''<tt>configure</tt>'''". Dans ce cas, la compilation est assez simple, car le programme "<tt>configure</tt>" détecte les spécificités de votre machine automatiquement. Il suffit généralement de faire :
De plus en plus souvent, les archives contiennent un fichier exécutable nommé "'''<b>configure</b>'''". Dans ce cas, la compilation est assez simple, car le programme "<b>configure</b>" détecte les spécificités de votre machine automatiquement. Il suffit généralement de faire :


<code>[root@taz appli]# ./configure
<div class="code">
[root@taz appli]# make
[root@taz appli]# ./configure <br />
[root@taz appli]# make install</code>
[root@taz appli]# make <br />
[root@taz appli]# make install <br />
</div>


Et c'est tout ! <br />Cependant lisez toujours le fichier README, car il faut parfois passer des commandes à <tt>configure</tt>.
Et c'est tout ! <br />Cependant lisez toujours le fichier README, car il faut parfois passer des commandes à <b>configure</b>.




===== qmake =====
===== qmake =====


Certains projets QT n'utilise pas les <code>autotools</code>, ils leur préfèrent : <code>qmake</code>. On repère ces projets par la présence d'un fichier <code>.pro</code>. Pour pouvoir les compiler, il faut d'abord générer le <code>makefile</code>, puis procéder habituellement.
Certains projets QT n'utilise pas les <b>autotools</b>, ils leur préfèrent : <b>qmake</b>. On repère ces projets par la présence d'un fichier <b>.pro</b>. Pour pouvoir les compiler, il faut d'abord générer le <b>makefile</b>, puis procéder habituellement.


<code>[root@taz appli]# qmake
<div class="code">[root@taz appli]# qmake <br />
[root@taz appli]# make</code>
[root@taz appli]# make</div>


===== Imakefile =====
===== Imakefile =====


Dans les cas ou il n'y a pas de script "<tt>configure</tt>" : <br />Si vous avez un fichier '''<tt>Imakefile</tt>''', vous pouvez essayer :
Dans les cas ou il n'y a pas de script "<b>configure</b>" : <br />Si vous avez un fichier '''<b>Imakefile</b>''', vous pouvez essayer :


<code>[root@taz appli]# xmkmf
<div class="code">[root@taz appli]# xmkmf <br />
[root@taz appli]# make</code>
[root@taz appli]# make</div>
 
===== 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 <b>CMakeLists.txt</b>. Suivant les projets, la procédure sera la suivante :
 
<div class="code">
[root@taz appli]# mkdir build <br />
[root@taz appli]# cd build <br />
[root@taz appli]# cmake .. <br />
[root@taz appli]# make <br />
</div>


===== autres =====
===== autres =====


Enfin s'il n'y a qu'un fichier '''<tt>Makefile</tt>''' ou '''<tt>makefile</tt>''', essayez juste :
Enfin s'il n'y a qu'un fichier '''<b>Makefile</b>''' ou '''<b>makefile</b>''', essayez juste :


<code multi>[root@taz appli]# make</code>
<div class="code">[root@taz appli]# make</div>


Bref, il y a plein de façons de faire, mais dans tous les cas lisez les fichiers README et autres LISEZMOI.
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 <tt>updatedb</tt> / <tt>locate</tt>, 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 <tt>Makefile</tt>.
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 <b>updatedb</b> / <b>locate</b>, 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 <b>Makefile</b>.


=== Trucs & actuces pour les sources utilisant les autotools ===
=== Trucs & actuces pour les sources utilisant les autotools ===
Ligne 119 : Ligne 144 :
==== Indiquer où installer les sources ====
==== 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 <tt>autoconf</tt>, la solution est simple, puisque prévue par le paquetage : il suffit de le dire au script <tt>configure</tt>. Placez vous dans le résertoire contenant les sources du logiciel, et tapez :
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 <b>autoconf</b>, la solution est simple, puisque prévue par le paquetage : il suffit de le dire au script <b>configure</b>. Placez vous dans le résertoire contenant les sources du logiciel, et tapez :


<code multi>$ ./configure --prefix=/opt/ma-destination</code>
<div class="code">$ ./configure --prefix=/opt/ma-destination</div>


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 :
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 :


<code>+ma-destination
<div class="code">
  +--> bin
+ma-destination <br />
  +--> share
+--> bin <br />
    `--> doc
+--> share <br />
  +--> etc
`--> doc <br />
  +--> include
+--> etc <br />
  +--> lib
+--> include <br />
</code>
+--> lib
</div>


dans laquelle seront effectivement copiés les fichiers nécessaires à la compilation de programme utilisant cette librairie, et les programmes eux-mêmes.  
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 <code>/etc</code> (c'est le <code>FHS</code> - File Hierarchy Standard). Alors il faut taper :
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 <b>/etc</b> (c'est le <b>FHS</b> - File Hierarchy Standard). Alors il faut taper :


<code multi>$ ./configure --prefix=/opt/ma-destination --sysconfdir=/etc</code>
<div clas="code">$ ./configure --prefix=/opt/ma-destination --sysconfdir=/etc</div>


Pour en savoir plus sur les diverses options de <code>./configure</code>, faites :
Pour en savoir plus sur les diverses options de <b>./configure</b>, faites :


<code>$ ./configure --help | less</code>
<div clas="code">$ ./configure --help | less</div>


==== Le script <code>./configure</code> se plaint de l'absence d'une librairie ====
==== Le script <b>./configure</b> se plaint de l'absence d'une librairie ====


Mais, vous, vous savez que vous l'avez installée dant <code>/opt/devlib</code> en utilisant une ligne :
Mais, vous, vous savez que vous l'avez installée dant <b>/opt/devlib</b> en utilisant une ligne :


<code multi>[user@becane src]$ ./configure --prefix=/opt/devlib</code>
<div clas="code">[user@becane src]$ ./configure --prefix=/opt/devlib</div>


Si <code>./configure</code> 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 : <code>malib-config</code> ... ).
Si <b>./configure</b> 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 : <b>malib-config</b> ... ).


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


<code multi>[user@becane src]$ export CFLAGS="-I/opt/devlib/include"</code>
<div clas="code">[user@becane src]$ export CFLAGS="-I/opt/devlib/include"</div>
pour indiquer au compilateur C que les includes sont dans <code>/opt/devlib/include</code>
pour indiquer au compilateur C que les includes sont dans <b>/opt/devlib/include</b>
<code multi>[user@becane src]$ export CXXFLAGS="-I/opt/devlib/include"</code>
<div clas="code">[user@becane src]$ export CXXFLAGS="-I/opt/devlib/include"</div>
pour indiquer au compilateur C++ que les includes sont dans <code>/opt/devlib/include</code>
pour indiquer au compilateur C++ que les includes sont dans <b>/opt/devlib/include</b>
<code multi>[user@becane src]$ export LDFLAGS="-L/opt/devlib/lib"</code>
<div clas="code">[user@becane src]$ export LDFLAGS="-L/opt/devlib/lib"</div>
pour indiquer au linker que les librairies sont dans <code>/opt/devlib/lib</code>
pour indiquer au linker que les librairies sont dans <b>/opt/devlib/lib</b>


Puis de relancer <code>./configure</code> 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.
Puis de relancer <b>./configure</b> 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 <code>CC</code> et <code>CXX</code> pour indiquer à <code>./configure</code> d'utiliser <code>CC</code> comme compilateur C et <code>CXX</code> comme compilateur C++.
Utilisez les variables <b>CC</b> et <b>CXX</b> pour indiquer à <b>./configure</b> d'utiliser <b>CC</b> comme compilateur C et <b>CXX</b> comme compilateur C++.


==== Optimiser pour votre processeur la compilation d'un programme ====
==== Optimiser pour votre processeur la compilation d'un programme ====
Ligne 169 : Ligne 195 :
Là c'est simple, il suffit de faire (cf plus paragraphe précédant) :
Là c'est simple, il suffit de faire (cf plus paragraphe précédant) :


<blockquote><tt>$ export CFLAGS="-mcpu=i686 -O6"</tt><br /><tt>$ export CXXFLAGS="-mcpu=i686 -O6"</tt></blockquote>
<div clas="code">
$ export CFLAGS="-mcpu=i686 -O2 -pipe" <br />
$ export CXXFLAGS="-mcpu=i686 -O6 -pipe"
</div>
 
avant de lancer <b>./configure</b>, pour dire aux compilateurs C et C++ de compiler pour l'architecture <b>i686</b> (pentium pro et pentium II, on peut utiliser <b>i586</b> pour les pentiums, <b>i486</b>, <b>i386</b>, et sans doute d'autres options), avec le niveau (<b>2</b>) d'optimisation (pour la vitesse d'exécution) maximum (on peut préciser <b>Os</b> si l'on ne veut pas des optimisations qui augmente la taille de l'exécutable généré).
 
Quelques fois, le script <b>./configure</b> prévoit des optimisations, par exemple il faut taper :


avant de lancer <tt>./configure</tt>, pour dire aux compilateurs C et C++ de compiler pour l'architecture <tt>i686</tt> (pentium pro et pentium II, on peut utiliser <tt>i586</tt> pour les pentiums, <tt>i486</tt>, <tt>i386</tt>, et sans doute d'autres options), avec le niveau (<tt>6</tt>) d'optimisation (pour la vitesse d'exécution) maximum (attention <tt>O6</tt> 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 <tt>-O1</tt> comme niveau ;). <br />Quelques fois, le script <tt>./configure</tt> prévoit des optimisations, par exemple il faut taper :
<div clas="code">$ ./configure --optimization=yes</div>


<blockquote><tt>$ ./configure --optimization=yes</tt></blockquote>
Utilisez <b>./configure --help</b> pour le savoir!


(Utilisez <tt>./configure --help</tt> pour le savoir!) <br />  <br />On peut d'après les créateurs du compilateur <tt>egcs</tt> (renommé <tt>gcc 1.1.2</tt> alias <tt>2.92.2</tt>) 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...
On peut d'après les créateurs du compilateur <b>egcs</b> (renommé <b>gcc 1.1.2</b> alias <b>2.92.2</b>) 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.
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.
Ligne 197 : Ligne 230 :
<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>


= Copyright =
<br/>
Copyright &copy; 25/02/2000, Jean-Christophe Cardot
<br/>
{{CC-BY-NC-SA}}
'''<b>[[Logiciels|@ Retour à la rubrique Logiciels]]</b>'''
<br/>
 
 
{{Copy|25/02/2000|[[Utilisateur:LeaJice|Jean-Christophe Cardot]]|CC-BY-SA}}

Dernière version du 30 novembre 2023 à 16:57

Compiler une application

par Jean-Christophe

Transformer le code 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.

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.

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

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.



@ Retour à la rubrique Logiciels


Copyright

© 25/02/2000 Jean-Christophe Cardot

Creative Commons License
Creative Commons Attribution iconCreative Commons Share Alike icon
Ce document est publié sous licence Creative Commons
Attribution, Partage à l'identique 4.0 :
https://creativecommons.org/licenses/by-sa/4.0/