5.5. GCC-4.7.2 - Passe 1

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

Temps de construction estimé : 5.5 SBU
Espace disque requis : 1.4 Go

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 construction 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.1.tar.xz
mv -v mpfr-3.1.1 mpfr
tar -Jxf ../gmp-5.1.0.tar.xz
mv -v gmp-5.1.0 gmp
tar -zxf ../mpc-1.0.1.tar.gz
mv -v mpc-1.0.1 mpc

La commande suivante modifiera l'emplacement de l'éditeur de liens dynamique par défaut de GCC pour utiliser celui installé dans /tools. Elle supprime aussi /usr/include du chemin de recherche include de GCC. Lancez :

for file in \
 $(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h)
do
  cp -uv $file{,.orig}
  sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
      -e 's@/usr@/tools@g' $file.orig > $file
  echo '
#undef STANDARD_STARTFILE_PREFIX_1
#undef STANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
#define STANDARD_STARTFILE_PREFIX_2 ""' >> $file
  touch $file.orig
done

Au cas où ce qui précède vous semble compliqué à suivre, décortiquons-le un peu. On cherche tout d'abord tous les fichiers sous le répertoire gcc/config nommés soit linux.h, linux64.h ou sysv4.h. Pour chaque fichier trouvé, on le copie dans un fichier du même nom, mais avec en plus le suffixe « .orig ». Puis la première expression sed envoie « /tools » dans toutes les occurrences « /lib/ld », « /lib64/ld » ou « /lib32/ld », tandis que la deuxième remplace les lignes « /usr » codées en dur. Ensuite, nous ajoutons nos instructions define qui modifient le préfixe des startfiles par défaut à la fin du fichier. Notez que le suffixe « / » dans « /tools/lib/ » est requis. Enfin, nous utilisons touch pour mettre à jour l'horodatage des fichiers copiés. Utilisé avec cp -u, ceci empêche des modifications non prévues des fichiers originaux au cas où les commandes sont lancées deux fois par erreur.

GCC ne détecte pas bien la pile de protection, ce qui pose problème pour la construction de Glibc-2.17, corrigez donc cela en lançant la commande suivante :

sed -i '/k prot/agcc_cv_libc_provides_ssp=yes' gcc/configure

Ne construisez pas les fichiers .info. Ils ne sont pas nécessaires ici et ils sont cassés dans la version actuelle de makeinfo.

sed -i 's/BUILD_INFO=info/BUILD_INFO=/' gcc/configure

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.7.2/configure         \
    --target=$LFS_TGT          \
    --prefix=/tools            \
    --with-sysroot=$LFS        \
    --with-newlib              \
    --without-headers          \
    --with-local-prefix=/tools \
    --with-native-system-header-dir=/tools/include \
    --disable-nls              \
    --disable-shared           \
    --disable-multilib         \
    --disable-decimal-float    \
    --disable-threads          \
    --disable-libmudflap       \
    --disable-libssp           \
    --disable-libgomp          \
    --disable-libquadmath      \
    --enable-languages=c       \
    --with-mpfr-include=$(pwd)/../gcc-4.7.2/mpfr/src \
    --with-mpfr-lib=$(pwd)/mpfr/src/.libs

Voici la signification des options de configure :

--with-newlib

Vu qu'aucune bibliothèque C fonctionnelle n'est encore disponible, ceci garantit que la constante inhibit_libc soit définie lors de la construction de libgcc. Cela empêche la compilation d'un code exigeant le support libc.

--without-headers

Lors de la compilation d'un compilateur croisé complet, GCC exige des en-têtes standards compatibles avec le système cible. Pour nos objectifs, ces en-têtes ne seront pas nécessaires. Ce paramètre emmêche GCC de les chercher.

--with-local-prefix=/tools

Le préfixe local est l'emplacement du système où GCC cherchera les fichiers include installés en local. Par défaut, c'est /usr/local. Définir ceci sur /tools aide à garder l'emplacement de l'hôte /usr/local en-dehors du chemin de recherche de GCC.

--with-native-system-header-dir=/tools/include

Par défaut, GCC cherche les en-têtes du système dans /usr/include. Associé au paramètre sysroot, ceci ne serait pas traduit en $LFS/usr/include. Cependant, les en-têtes qui seront installées aux deux prochaines sections iront dans $LFS/tools/include. Ce paramètre garantit que gcc les trouvera correctement. Dans la deuxième passe de GCC, ce même paramètre garantira qu'aucune en-tête du système hôte ne soit trouvée.

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

Ces paramètres désactivent le support de l'extension des virgules flottantes décimales, de threading, libmudflap, libssp et libgomp et libquadmath. Ces fonctionnalités ne parviendront 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.

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 -sv 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. »