5.5. GCC-4.6.2 - Passe 1

Le paquet GCC contient la collection de compilateurs GNU, qui inclut les compilateurs C et C++.

Temps de construction estimé : 5.0 SBU
Espace disque requis : 1.2 Gio

5.5.1. Installation de GCC croisé

GCC exige maintenant les paquets GMP, MPFR et MPC. Comme il se peut que ces paquets ne soient pas inclus dans votre distribution hôte, ils vont être compilés avec GCC. Déballez chaque paquet dans le répertoire du source de GCC et renommez les répertoires ainsi créés pour que les procédures de construction de GCC les utilisent automatiquement :

[Remarque]

Remarque

Beaucoup d'incompréhensions existent concernant ce chapitre. Les procédures sont les mêmes que celles des autres chapitres, comme expliqué plus haut (Instructions de aonstruction des paquets). Extrayez d'abord l'archive tar de gcc du répertoire des sources puis rendez-vous dans le répertoire créé. C'est seulement là que vous devriez suivre les instructions ci-dessous.

tar -jxf ../mpfr-3.1.0.tar.bz2
mv -v mpfr-3.1.0 mpfr
tar -Jxf ../gmp-5.0.4.tar.xz
mv -v gmp-5.0.4 gmp
tar -zxf ../mpc-0.9.tar.gz
mv -v mpc-0.9 mpc

Appliquez un correctif qui permettra de désactiver la construction des bibliothèques cibles libiberty et zlib car elles ne se construisent pas correctement dans un environnement compilé de manière croisée :

patch -Np1 -i ../gcc-4.6.2-cross_compile-1.patch

La documentation de GCC recommande de ne pas construire GCC dans le répertoire des sources mais dans un répertoire de construction dédié :

mkdir -v ../gcc-build  
cd ../gcc-build

Préparez la compilation de GCC :

../gcc-4.6.2/configure \
    --target=$LFS_TGT --prefix=/tools \
    --disable-nls --disable-shared --disable-multilib \
    --disable-decimal-float --disable-threads \
    --disable-libmudflap --disable-libssp \
    --disable-libgomp --disable-libquadmath \
    --disable-target-libiberty --disable-target-zlib \
    --enable-languages=c --without-ppl --without-cloog \
    --with-mpfr-include=$(pwd)/../gcc-4.6.2/mpfr/src \
    --with-mpfr-lib=$(pwd)/mpfr/src/.libs

Voici la signification des options de configure :

--disable-shared

Ce paramètre oblige GCC à lier ses bibliothèques internes de manière statique. On procède ainsi pour éviter les problèmes avec le système hôte.

--disable-decimal-float, --disable-threads, --disable-libmudflap, --disable-libssp, --disable-libgomp, --disable-libquadmath --disable-target-libiberty --disable-target-zlib

Ces paramètres désactivent le support de l'extension des virgules flottantes décimales, de threading, respectivement de libmudflap, libssp et libgomp, libquadmath, libiberty et zlib. Ces fonctionnalités ne parviendra pas à se compiler lors de la construction d'un compilateur croisé et elles ne sont pas nécessaires pour la tâche de compilation croisée de la libc temporaire.

--disable-multilib

Sur du x86_64, LFS ne supporte pas encore une configuration multilib (plusieurs bibliothèques). Ce paramètre n'a pas d'importance pour x86.

--enable-languages=c

Cette option nous assure que seul le compilateur C sera construit. C'est le seul langage actuellement nécessaire.

--without-ppl, --without-cloog

Ces paramètres empêche GCC de se construire contre les bibliothèques PPL et CLooG qui peuvent être présentes sur le système hôte, mais qui ne seront pas disponibles dans l'environnement chroot.

Compilez GCC en lançant :

make

La compilation est maintenant terminée. À ce point, la suite de tests devrait être lancée. Mais, comme nous l'avons dit plus tôt, l'ensemble de travail de la suite de tests n'est pas encore en place. Les bénéfices à lancer les tests maintenant seraient minimes car les programmes de la première passe seront bientôt remplacés.

Installez le paquet :

make install

L'utilisation de --disable-shared signifie que le fichier libgcc_eh.a n'est pas créé et installé. Le paquet Glibc dépend de cette bibliothèque puisqu'il utilise -lgcc_eh à l'intérieur de son système de construction. On peut satisfaire cette dépendance en créant un lien symbolique vers libgcc.a, puisque ce fichier va finir par contenir les objets normalement contenus dans libgcc_eh.a:

ln -vs libgcc.a `$LFS_TGT-gcc -print-libgcc-file-name | \
    sed 's/libgcc/&_eh/'`

Les détails sur ce paquet sont disponibles dans Section 6.17.2, « Contenu de GCC. »