7.2. Compilation de GCC

La clef de voûte du processus de compilation est bien entendu la suite de compilateurs GCC du projet GNU. Cette suite comprend un compilateur pour les languages C, C++, Objective C, Fortran, Java et Ada. La plupart des distributions fournissent ces outils sur leur CD d'installation, mais ne les installent pas par défaut. Il est toutefois recommandé d'installer au moins le compilateur C/C++ et les outils de développement associés, ainsi que les fichiers d'en-tête des bibliothèques de base du système (bibliothèque C, en-têtes de XWindow, des bibliothèques utilitaires et des bibliothèques de base des environnements graphiques Gnome et KDE).

Le choix de la version de GCC utilisée est extrêmement important, car la stabilité et les performances du système en dépendront directement. De plus, certains programmes exigeront une version spécifique du compilateur pour être compilés, soit parce qu'ils n'ont été testés qu'avec cette version par les développeurs, soit parce qu'ils utilisent une fonctionnalité qui n'est disponible que dans les versions récentes de GCC.

La versions stable de GCC reconnue par le plus grand nombre de développeurs est sans aucun doute la version 2.95.3. Cette version ne posera certainement pas de problèmes aux possesseurs de PC à base de processeur x86. Cependant, elle souffre de quelques défauts :

C'est pour ces raisons que certaines distributions sont diffusées avec des versions plus récentes de GCC qui, malheureusement, n'ont pas atteint le niveau de stabilité de la version 2.95.3. En fait c'est même relativement catastrophique, car la version utilisée est franchement une version de développement stabilisée pour l'occasion (c'est en particulier le cas des distributions Redhat et dérivées, comme la Mandrake par exemple, qui utilisaient encore récemment les « versions » 2.96 ou 2.97 de GCC, versions qui n'ont jamais existé !). Le choix de ces compilateurs a malheureusement rendu incompatibles les paquetages binaires de ces distributions avec ceux des autres et, il faut l'admettre, ne règle pas le problème de la stabilité du compilateur.

Le problème provient du fait que la branche officielle de GCC, qui est issue du développement des versions 2.96 et 2.97, souffrait de bogues graves et n'était pas utilisable. Ainsi, les versions 3.0.x (jusqu'à la version 3.0.4 comprise) doivent être évitées à tout prix. Les versions des dernières branches officielles (c'est-à-dire les branches 3.1.x et 3.2.x) fonctionnent à présent sans problème et sont donc utilisables. Notez que la branche 3.2.x est issue de la version 3.1.1 et n'a comme seule différence que la correction d'erreurs dans les interfaces binaires des programmes C++, ce qui la rend incompatible binairement et justifie le changement de numéro de version mineur. La branche 3.2.x est en voie d'acceptation et la plupart des distributions sont en train de migrer vers cette version du compilateur ou l'ont déjà fait. Comme il est prévu que les versions postérieures soient compatibles au niveau du code binaire généré, cette migration résoudra sans doute les problèmes d'incompatibilités binaires entre les paquetages des diverses distributions.

En pratique, il est recommandé de se cantonner à la version 2.95.3, ou de passer franchement à la branche 3.2.1 (il est inutile de passer par la branche 3.1.x, et la version 3.2.0 ne compile pas avec les versions récentes de la bibliothèque C). Les possesseurs de distributions Redhat et dérivées s'abstiendront certainement de faire une mise à jour manuelle, car les bibliothèques de leur distributions seraient incompatibles avec les versions officielles de GCC. Dans leur cas, il faut faire une mise à jour complète de leurs distributions.

Note : En ce qui concerne les numéros de version, il faut savoir que le dernier chiffre caractérise souvent le numéro de correctif. Plus ce chiffre est élevé, moins le programme a de chances de comporter de bogues. En pratique, on évitera généralement d'installer systématiquement les dernières versions des logiciels lorsque ces versions sont les premières d'une nouvelle série. Ainsi, un programme de version x.y.0 est certainement peu fiable. Il faudra attendre au moins la version x.y.1 ou mieux la x.y.2, pour pouvoir l'utiliser sereinement. Sachez également que le numéro intermédiaire sert, pour certains logiciels, à indiquer les versions de développement. C'est par exemple le cas du noyau de Linux, pour lequel les numéros de version impairs correspondent aux versions de développement et les numéros pairs aux versions stables. Ce n'est pas le cas pour la bibliothèque C ou GCC. On notera que GCC 3.2.0 correspond en fait à une version 3.1.1 avec un nouveau format binaire pour le C++, et n'est donc pas à proprement parler une nouvelle version.

Certaines documentations référencent également la version 1.1.2 du compilateur EGCS (abréviation de « Experimental GNU Compilation System »). Ces documentations sont obsolètes : EGCS ne doit plus être utilisé. Il s'agit de la version de développement de GCC 2.95, qui est donc à présent relativement ancienne.

7.2.1. Prérequis

À moins que vous ne réussissiez à mettre la main sur une version de GCC déjà compilée pour Linux, vous ne disposerez que des sources. Les sources de GCC peuvent être récupérées sur Internet sur le site de GCC. Ces sources sont fournies sous la forme d'une archive au format tar-gzip. Le nom de cette archive est « gcc-3.2.1.tar.gz ».

Un autre prérequis est bien entendu que vous disposiez également d'un compilateur C sur votre système. Ce compilateur peut très bien être une ancienne version de GCC, mais il est impératif de disposer d'un compilateur C correct. Le code de GCC a été écrit pour pouvoir être compilé de manière minimale avec la plupart des compilateurs C existants. Il faut également que ce compilateur porte le nom de « cc » ou « gcc » et soit dans l'un des répertoires de la variable d'environnement PATH, ou que la variable CC ait été définie avec le chemin absolu du compilateur.

7.2.2. Installation des sources

Lorsque vous aurez installé le compilateur C natif de votre système, vous devrez décomprimer les sources de GCC. Cela doit se faire avec la commande suivante :

tar xvfz archive

archive est le nom de l'archive comprimée contenant ces sources. Dans notre cas, ce doit être gcc-3.2.1.tar.gz. Cette commande a pour conséquence de créer l'arborescence des répertoires des sources de GCC dans le répertoire où elle a été exécutée.

Une fois cette opération effectuée, il est conseillé de créer un autre répertoire, ailleurs que dans le répertoire des sources de GCC, dans lequel la compilation aura lieu. Dans toute la suite, nous supposerons que le répertoire des sources se nomme srcdir, et que le répertoire de compilation se nomme objdir.

7.2.3. Configuration

L'étape suivante est d'aller dans le répertoire de compilation et de lancer le programme de configuration de GCC dans ce répertoire. Cela peut être réalisé avec les commandes suivantes :

cd objdir
srcdir/configure [options]

Comme on l'a vu ci-dessus, le programme de configuration configure peut recevoir des options en ligne de commande. Il est recommandé de fournir l'option --enable-__cxa_atexit, qui permet de rendre GCC compatible avec la version 3 de la norme inter-vendeurs spéciant le format des interfaces binaires pour les compilateurs C++, et donc de garantir la compatibilité binaire ascendante avec les versions futures de GCC. Cela vous permettra d'éviter d'avoir à recompiler toutes les bibliothèques C++ lors des mises à jours ultérieures de GCC. Il est également recommandé d'utiliser l'option --enable-long-long, qui ajoute le support du type de données long long, qui permet de manipuler des données 64 bits sur les machines 32 bits comme les PC.

Normalement, le programme de configuration détecte le type de machine et le système utilisé. Cependant, cette détection peut échouer si les types de machines indiqués pour les différents composants du système ne sont pas identiques. Dans ce cas, il vous faudra spécifier la machine hôte à l'aide de l'option --host. La ligne de commande pour la configuration sera alors la suivante :

srcdir/configure --enable-__cxa_atexit  \
    --enable-long-long --host=hôte

hôte est de la forme « ix86-pc-linux-gnu ».

Le nombre de compilateurs fournis avec la suite de compilateurs GCC est impressionnant. Cependant, seuls les compilateurs C et C++ sont réellement essentiels. Aussi est-il possible de ne prendre en charge que certains langages à l'aide de l'option --enable-languages. Cette option doit être suivie des noms des langages pour lesquels le compilateur doit être créé, séparés par des virgules. Ainsi, on peut n'installer que les compilateurs C/C++ et Java en ajoutant l'option suivante à la ligne de commande :

--enable-languages=c,c++,java

Enfin, si votre distribution utilise le compilateur GCC comme compilateur de base du système, et que vous désirez remplacer la version de votre distribution par la version que vous allez compiler, il faut changer le répertoire d'installation de GCC. Normalement, GCC s'installe dans le répertoire /usr/local/ ce qui fait qu'il ne remplace pas la version de votre distribution. Vous devez donc spécifier les répertoires de base pour l'installation. Pour cela, il suffit d'ajouter les options suivantes :

--prefix=/usr

à la ligne de commande de configure.

7.2.4. Compilation

La compilation de GCC peut ensuite être réalisée. Autant vous prévenir tout de suite : c'est une opération très longue, qui de plus demande beaucoup d'espace disque. Il faut au moins prévoir 200 Mo d'espace disque, et une bonne demi-heure sur une machine à 500 Mhz. Cela est dû à la technique employée par GCC lors de la compilation. La plupart des compilateurs C ne sont pas capables de compiler GCC avec toutes ses fonctionnalités. C'est pour cela que la compilation se passe en trois étapes :

Ainsi, GCC se compile lui-même !

Ces trois opérations peuvent être exécutées à l'aide d'une seule commande :

make bootstrap

Cette commande doit être exécutée à partir du répertoire de compilation objdir.

7.2.5. Installation de GCC

Lorsque la compilation s'est terminée, vous pouvez installer GCC. Il est recommandé de supprimer le compilateur que vous avec utilisé pour compiler GCC, sauf si, bien entendu, il s'agissait déjà de GCC. En effet, il n'est pas nécessaire de le conserver, puisque vous utiliserez désormais GCC. L'installation de GCC est, encore une fois, très simple :

make install

Cette commande installe GCC ainsi que la bibliothèque standard C++.