Les détails sur ce paquet sont disponibles dans Section 8.29.2, « Contenu de GCC. »
Le paquet GCC contient la collection de compilateurs GNU, laquelle contient les compilateurs C et C++.
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 :
Beaucoup d'incompréhensions existent concernant ce chapitre. Les procédures sont les mêmes que celles de tous les autres chapitres, comme expliqué plus tôt (Instructions de construction des paquets). Extrayez d'abord l'archive de gcc-14.2.0 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.2.1.tar.xz mv -v mpfr-4.2.1 mpfr tar -xf ../gmp-6.3.0.tar.xz mv -v gmp-6.3.0 gmp tar -xf ../mpc-1.3.1.tar.gz mv -v mpc-1.3.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.40 \ --with-sysroot=$LFS \ --with-newlib \ --without-headers \ --enable-default-pie \ --enable-default-ssp \ --disable-nls \ --disable-shared \ --disable-multilib \ --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.40
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 libc 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.
--enable-default-pie et
--enable-default-ssp
Ces paramètres permettent à GCC de compiler des programmes avec des fonctionnalités de durcissement (plus d'information dans remarque sur PIE et SSP au chapitre 8) par défaut. Elles ne sont pas vraiment requises à ce niveau, puisque le compilateur ne sera utilisé que pour produire les exécutables temporaires. Mais il est plus propre d'avoir des paquets temporaires aussi proches que possible des paquets finals.
--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-threads, --disable-libatomic,
--disable-libgomp, --disable-libquadmath, --disable-libssp,
--disable-libvtv, --disable-libstdcxx
Ces paramètres désactivent la prise en charge de threading, libatomic, libgomp, libquadmath, libssp, libvtv et de la bibliothèque standard C++. La compilation de ces fonctions peut é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
, inclurait à son tour l'en-tête
limits.h
du système, dans ce cas
$LFS/usr/include/limits.h
. Cependant,
au moment de cette 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 :
La commande ci-dessous montre un exemple de substitutions de
commande imbriquées de deux manières : les backquotes et une
construction $()
. Elle pourrait être
réécrite pour utiliser la même méthode pour les deux
substitutions, mais elles sont montrées de cette manière pour
montrer comment elles peuvent être mélangées. En général la
méthode $()
est préférable.
cd .. cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \ `dirname \ $($LFS_TGT-gcc -print-libgcc-file-name)`/include/limits.h
Les détails sur ce paquet sont disponibles dans Section 8.29.2, « Contenu de GCC. »