6.18. GCC-12.2.0 — Passe 2

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

Temps de construction approximatif: 15 SBU
Espace disque requis: 4.5 Go

6.18.1. Installation de GCC

Comme pour la première construction de GCC, les paquets GMP, MPFR et MPC sont requis. Déballez les archives et déplacez-les dans les répertoires avec le nom requis :

tar -xf ../mpfr-4.1.0.tar.xz
mv -v mpfr-4.1.0 mpfr
tar -xf ../gmp-6.2.1.tar.xz
mv -v gmp-6.2.1 gmp
tar -xf ../mpc-1.2.1.tar.gz
mv -v mpc-1.2.1 mpc

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

Remplacez la règle de construction des en-têtes de libgcc et libstdc++, pour permettre la construction de ces bibliothèques avec la prise en charge des threads POSIX :

sed '/thread_header =/s/@.*@/gthr-posix.h/' \
    -i libgcc/Makefile.in libstdc++-v3/include/Makefile.in

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

mkdir -v build
cd       build

Avant de commencer la construction de GCC, rappelez-vous d'effacer (avec unset) toute variable d'environnement surchargeant les options d'optimisation par défaut.

Maintenant, préparez la compilation de GCC :

../configure                                       \
    --build=$(../config.guess)                     \
    --host=$LFS_TGT                                \
    --target=$LFS_TGT                              \
    LDFLAGS_FOR_TARGET=-L$PWD/$LFS_TGT/libgcc      \
    --prefix=/usr                                  \
    --with-build-sysroot=$LFS                      \
    --enable-initfini-array                        \
    --disable-nls                                  \
    --disable-multilib                             \
    --disable-decimal-float                        \
    --disable-libatomic                            \
    --disable-libgomp                              \
    --disable-libquadmath                          \
    --disable-libssp                               \
    --disable-libvtv                               \
    --enable-languages=c,c++

Voici la signification des nouvelles options de configure :

--with-build-sysroot=$LFS

Normalement, utiliser --host s'assure que le compilateur croisé est utilisé pour construire GCC, et que le compilateur sait qu'il doit chercher les en-têtes et les bibliothèques dans $LFS. Mais le système de construction de GCC utilise d'autres outils qui ne connaissent pas cet emplacement. Ce paramètre est requis pour qu'ils trouvent les fichiers requis dans $LFS et non sur l'hôte.

--target=$LFS_TGT

Comme nous effectuons une compilation croisée de GCC, il n'est pas possible de construire les bibliothèques de la cible (libgcc et libstdc++) avec les binaires GCC compilés car ces binaires ne fonctionneront pas sur la distribution hôte. Le système de construction de GCC essayera d'utiliser les compilateurs C et C++ de la distribution hôte pour contourner cela par défaut. Cela n'est pas pris en charge pour la construction des bibliothèques GCC de la cible avec une version différente de GCC, donc utiliser les compilateurs de l'hôte peut causer des échecs de construction. Ce paramètre s'assure de construire les bibliothèques avec GCC passe 1 et évite le problème.

LDFLAGS_FOR_TARGET=...

Permet à libstdc++ d'utliiser la bibliothèque partagée libgcc en cours de construction dans cette passe, au lieu de la version statique construite avec GCC passe 1. C'est requis pour la prise en charge de la gestion des exceptions C++.

--enable-initfini-array

Cette option est automatiquement activée lors de la construction d'un compilateur natif avec un compilateur natif sur x86. Mais ici, nous construisons avec un compilateur croisé, donc nous devons explicitement utiliser cette option.

Compilez le paquet :

make

Installez le paquet :

make DESTDIR=$LFS install

Comme touche finale, créez un lien symbolique utilitaire. De nombreux programmes et scripts lancent cc au lieu de gcc, pour que les programmes restent génériques et donc utilisables sur n'importe quel type de système UNIX où le compilateur C de GNU n'est pas toujours installé. Lancer cc laisse l'administrateur système libre de décider quel compilateur C installer :

ln -sv gcc $LFS/usr/bin/cc

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