Les détails sur ce paquet sont disponibles dans Section 6.17.2, « Contenu de GCC. »
Le paquet GCC contient la collection de compilateurs GNU, qui inclut les compilateurs C et C++.
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 :
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.0.5.tar.xz mv -v gmp-5.0.5 gmp tar -zxf ../mpc-1.0.tar.gz mv -v mpc-1.0 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.16.0, corrigez donc cela en lançant la commande suivante :
sed -i '/k prot/agcc_cv_libc_provides_ssp=yes' 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.1/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.1/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êchela 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 -vs 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. »