5.3. GCC-12.2.0 — Passe 1

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

Temps de construction approximatif: 12 SBU
Espace disque requis: 3.8 Go

5.3.1. Installation de GCC croisé

GCC requiert 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 en même temps que GCC. Déballez chaque paquet dans le répertoire des sources de GCC et renommez les répertoires ainsi créés pour que les procédures de construction de GCC les utilisent automatiquement :

[Note]

Note

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

Sur les systèmes x86_64, définissez « lib » comme nom de répertoire par défaut pour les bibliothèques 64 bits :

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

La documentation de GCC recommande de construire GCC dans un répertoire de construction dédié :

mkdir -v build
cd       build

Préparez la compilation de GCC :

../configure                  \
    --target=$LFS_TGT         \
    --prefix=$LFS/tools       \
    --with-glibc-version=2.36 \
    --with-sysroot=$LFS       \
    --with-newlib             \
    --without-headers         \
    --disable-nls             \
    --disable-shared          \
    --disable-multilib        \
    --disable-decimal-float   \
    --disable-threads         \
    --disable-libatomic       \
    --disable-libgomp         \
    --disable-libquadmath     \
    --disable-libssp          \
    --disable-libvtv          \
    --disable-libstdcxx       \
    --enable-languages=c,c++

Voici la signification des options de configuration :

--with-glibc-version=2.36

Cette option spécifie la version de glibc qui sera utilisée sur la cible. Ce n'est pas lié à la libc de la distribution hôte parce que tout ce qui est compilé par gcc passe 1 sera lancé dans l'environnement chroot, qui est isolé de la glibc de la distribution hôte.

--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 la prise en charge de la 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 empêche GCC de les chercher.

--disable-shared

Ce paramètre oblige GCC à lier ses bibliothèques internes de manière statique. On procède ainsi parce que les bibliothèques partagées requièrent glibc, qui n'est pas encore installé sur le système cible.

--disable-multilib

Sur du x86_64, LFS ne prend pas en charge une configuration multilib. Ce paramètre n'a pas d'importance pour x86.

--disable-decimal-float, --disable-threads, --disable-libatomic, --disable-libgomp, --disable-libquadmath, --disable-libssp, --disable-libvtv, --disable-libstdcxx

Ces paramètres désactivent la prise en charge de l'extension pour les nombres décimaux en virgules flottantes, de threading, libatomic, libgomp, libquadmath, libssp, libvtv et de la bibliothèque standard C++. La compilation de ces fonctions va échouer lors de la construction d'un compilateur croisé et celles-ci sont inutiles pour la compilation croisée de la libc temporaire.

--enable-languages=c,c++

Cette option nous assure que seuls les compilateurs C et C++ seront construits. Ce sont les seuls langages actuellement nécessaires.

Compilez GCC en lançant :

make

Installez le paquet :

make install

Cette construction de GCC a installé quelques en-têtes internes au système. Normalement l'un d'entre eux, limits.h, incluerait à son tour l'en-tête limits.h du système, dans ce cas, $LFS/usr/include/limits.h. Cependant, au moment de la construction de GCC $LFS/usr/include/limits.h n'existe pas, donc l'en-tête interne qui vient d'être construit est un fichier partiel, auto-contenu et n'inclus pas les fonctionnalités étendues de l'en-tête système. Cela est suffisant pour construire glibc, mais l'en-tête interne complet sera requis plus tard. Créez une version complète de l'en-tête interne avec une commande identique à ce que le système de construction de GCC fait dans des circonstances normales :

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

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