5.10. GCC-7.2.0 - Passe 2

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

Temps de construction approximatif: 11 SBU
Espace disque requis: 2.6 Go

5.10.1. Installation de GCC

Notre première construction de GCC a installé deux en-têtes internes au système. En principe, l'une d'entre elles, limits.h inclura l'en-tête limits.h du système correspondante dans ce cas, /tools/include/limits.h. Cependant, au moment de la première construction de gcc, /tools/include/limits.h n'existait pas, donc l'en-tête interne qu'a installée GCC est un fichier partiel, à moitié-rempli et il n'inclut pas les fonctions étendues de l'en-tête du système. Ceci s'adaptait à la construction de la libc temporaire mais la construction de GCC exige maintenant l'en-tête interne complète. Créez une version complète de l'en-tête interne en utilisant une commande identique à ce que fait le système de construction de GCC en temps normal :

cat gcc/limitx.h gcc/glimits.h gcc/limity.h >  `dirname \
  $($LFS_TGT-gcc -print-libgcc-file-name)`/include-fixed/limits.h

Une fois encore, modifiez l'emplacement de l'éditeur de liens dynamique par défaut de GCC pour utiliser celui installé dans /tools.

for file in gcc/config/{linux,i386/linux{,64}}.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

Si vous construisez sur x86_64, changez le nom de répertoire par défaut pour les bibliothèques 64 bits en « lib » :

case $(uname -m) in
  x86_64)
    sed -e '/m64=/s/lib64/lib/' \
        -i.orig gcc/config/i386/t-linux64
  ;;
esac

Comme dans la première construction de GCC, il a besoin de GMP, de MPFR et MPC. Déballez les archives tar et déplacez-les dans les répertoires nommés comme il le faut :

tar -xf ../mpfr-3.1.5.tar.xz
mv -v mpfr-3.1.5 mpfr
tar -xf ../gmp-6.1.2.tar.xz
mv -v gmp-6.1.2 gmp
tar -xf ../mpc-1.0.3.tar.gz
mv -v mpc-1.0.3 mpc

Créez un répertoire de construction séparé :

mkdir -v build
cd       build

Avant de commencer la construction de GCC, rappelez-vous de désinitialiser toute variable d'environnement surchargeant les options d'optimisation par défaut.

Maintenant, préparez la compilation de GCC :

CC=$LFS_TGT-gcc                                    \
CXX=$LFS_TGT-g++                                   \
AR=$LFS_TGT-ar                                     \
RANLIB=$LFS_TGT-ranlib                             \
../configure                                       \
    --prefix=/tools                                \
    --with-local-prefix=/tools                     \
    --with-native-system-header-dir=/tools/include \
    --enable-languages=c,c++                       \
    --disable-libstdcxx-pch                        \
    --disable-multilib                             \
    --disable-bootstrap                            \
    --disable-libgomp

Voici la signification des nouvelles options de configure :

--enable-languages=c,c++

Cette option garantit que les compilateurs C et C++ seront construits.

--disable-libstdcxx-pch

Ce commutateur empêche la construction de l'en-tête pré-compilé (PCH) de libstdc++. Il prend beaucoup d'espace et nous n'en avons aucune utilité.

--disable-bootstrap

Pour les constructions natives de GCC, on a par défaut une compilation « bootstrap ». Elle ne fait pas que compiler GCC, mais elle le compile plusieurs fois. Elle utilise les programmes compilés dans une première étape pour se compiler une seconde fois, puis une troisième fois à nouveau. Les deuxième et troisième passages sont comparés pour garantir qu'elle peut se reproduire facilement. Cela implique aussi qu'elle a été compilée correctement. Néanmoins, la méthode de compilation LFS devrait fournir un compilateur solide sans qu'il soit nécessaire de bootstraper chaque fois.

Compilez le paquet :

make

Installez le paquet :

make install

En touche finale, créez un lien symbolique. Beaucoup de programmes et de scripts lancent cc au lieu de gcc, qui est utilisé pour conserver des programmes génériques, utilisables donc sur n'importe quel type de système où le compilateur C n'est pas toujours installé. L'exécution de cc laisse l'administrateur du système décider quel compilateur C installer :

ln -sv gcc /tools/bin/cc
[Attention]

Attention

À ce stade, il est impératif de s'arrêter et de s'assurer que les fonctions de base (compilation et édition de liens) du nouvel ensemble d'outils fonctionnent comme prévu. Pour effectuer un test de propreté, lancez les commandes suivantes :

echo 'int main(){}' > dummy.c
cc dummy.c
readelf -l a.out | grep ': /tools'

Si tout fonctionne correctement, il ne devrait pas y avoir d'erreurs et la sortie de la dernière commande aura la forme :

[Requesting program interpreter: /tools/lib/ld-linux.so.2]

Remarquez que /tools/lib ou /tools/lib64 pour les machines 64 bits apparaît comme préfixe de l'éditeur de liens dynamiques.

Si l'affichage diffère ou s'il n'y a aucun affichage, alors quelque chose ne se passe pas bien. Enquêtez et tracez vos étapes pour trouver où se cache le problème et comment le corriger. Ce problème doit être corrigé avant de continuer. Tout d'abord, relancez la vérification de propreté en utilisant gcc au lieu de cc. Si cela fonctionne, le lien symbolique /tools/bin/cc est manquant. Installez le lien symbolique comme indiqué ci-dessus. Ensuite, assurez-vous que le PATH est correct. Ceci se vérifie en lançant echo $PATH et en vérifiant que /tools/bin est en tête de la liste. Si le PATH est mauvais, cela pourrait signifier que vous n'êtes pas connecté en tant qu'utilisateur lfs ou que quelque chose s'est mal passé dans Section 4.4, « Configurer l'environnement. ».

Une fois que tout va bien, nettoyez les fichiers de test :

rm -v dummy.c a.out

Les détails sur ce paquet sont situés dans Section 6.20.2, « Contenu de GCC. »