6.12.1. Installation de GCC
Appliquez une substitution sed qui supprimera l'installation
de libiberty.a
. À la place, la
version de libiberty.a
fournie par
Binutils sera utilisée :
sed -i 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in
La compilation bootstrap effectuée dans Section 5.4, « GCC-4.1.2
- Passe 1 » a compilé GCC avec le commutateur du
compilateur -fomit-frame-pointer
. Les
compilations non-bootstrap n'incluent pas ce paramètre par défaut,
donc appliquez la commande sed suivante pour l'utiliser afin
de vous assurer de la compilation d'un compilateur cohérent :
sed -i 's/^XCFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in
Le script fixincludes
est connu pour s'efforcer parfois, de manière inadéquate, de
"réparer" les en-têtes du système installées précédemment. Comme
les en-têtes installées par GCC-4.1.2 et Glibc-2.5.1 sont connues
pour ne pas avoir besoin de réparation, lancez la commande suivante
pour empêcher le script fixincludes de s'exécuter :
sed -i 's@\./fixinc\.sh@-c true@' gcc/Makefile.in
GCC fournit un script gccbug qui détecte au moment de
la compilation si mktemp est présent, et crée une référence en dur
du résultat dans un test. Cela aboutira à ce que le script sera lié
à l'usage de moins de nom aléatoires pour les fichiers temporaires.
Nous installerons mktemp plus tard, donc le sed suivant simulera sa
présence :
sed -i 's/@have_mktemp_command@/yes/' gcc/gccbug.in
La documentation de GCC recommande de construire GCC en dehors du
répertoire source, c'est-à-dire dans un répertoire dédié :
mkdir -v ../gcc-build
cd ../gcc-build
Préparez la compilation de GCC :
../gcc-4.1.2/configure --prefix=/usr \
--libexecdir=/usr/lib --enable-shared \
--enable-threads=posix --enable-__cxa_atexit \
--enable-clocale=gnu --enable-languages=c,c++
Compilez le paquet :
make
Important
Dans cette section, la suite de tests pour GCC est considérée
critique. Ne les sautez sous aucun prétexte.
Testez les résultats mais ne vous arrêtez pas aux erreurs :
make -k check
Pour recevoir un résumé des résultats de la suite de tests,
lancez
../gcc-4.1.2/contrib/test_summary
Pour n'avoir que les résumés, redirigez la sortie vers
grep -A7 Summ
.
Vous pouvez comparer les résultats avec ceux situés dans http://www.linuxfromscratch.org/lfs/build-logs/6.3/.
Quelques échecs inattendus sont inévitables. Les développeurs de
GCC connaissent ces problèmes, mais ne les ont pas encore résolus.
En particulier, les tests de libmudflap
sont connus pour être particulièrement
problématiques et résultant d'un bogue dans GCC (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20003).
Sauf si les résultats du test sont très différents de ceux sur
l'adresse ci-dessus, vous pouvez continuer en toute sécurité.
Installez le paquet :
make install
Quelques paquets s'attendent à ce que le préprocesseur C soit
installé dans le répertoire /lib
Pour
supporter ces paquets, créez ce lien symbolique :
ln -sv ../usr/bin/cpp /lib
Beaucoup de paquets utilisent le nom cc pour appeler le compilateur C.
Pour satisfaire ces paquets, créez un lien symbolique :
ln -sv gcc /usr/bin/cc
Maintenant que notre ensemble d'outils est en place, il est
important de s'assurer à nouveau que la compilation et l'édition de
liens fonctionneront comme prévu. Cela se fait en effectuant les
mêmes tests de propreté que ceux faits plus haut dans ce
chapitre :
echo 'main(){}' > dummy.c
cc dummy.c -v -Wl,--verbose &> dummy.log
readelf -l a.out | grep ': /lib'
Si tout fonctionne correctement, il ne devrait pas y avoir
d'erreurs et la sortie de la commande sera (avec des différences
spécifiques aux plateformes dans le nom de l'éditeur de
liens) :
[Requesting program interpreter: /lib/ld-linux.so.2]
Maintenant, assurez-vous que nous utilisons les bons fichiers de
démarrage :
grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
Si tout fonctionne correctement, il ne devrait pas y avoir
d'erreurs et la sortie de la dernière commande sera :
/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../crt1.o succeeded
/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../crti.o succeeded
/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../crtn.o succeeded
Vérifiez que le compilateur cherche les bons fichiers
d'en-tête :
grep -B3 '^ /usr/include' dummy.log
Cette commande devrait réussir avec la sortie suivante :
#include <...> search starts here:
/usr/local/include
/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/include
/usr/include
Puis, vérifiez que le nouvel éditeur de liens est utilisé avec les
bons chemins de recherche :
grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
Si tout fonctionne correctement, il ne devrait pas y avoir
d'erreurs et la sortie de la dernière commande sera :
SEARCH_DIR("/usr/i686-pc-linux-gnu/lib")
SEARCH_DIR("/usr/local/lib")
SEARCH_DIR("/lib")
SEARCH_DIR("/usr/lib");
Ensuite, assurez-vous que nous utilisons la bonne libc :
grep "/lib/libc.so.6 " dummy.log
Si tout fonctionne correctement, il ne devrait pas y avoir d'erreur
et la sortie de la dernière commande sera :
attempt to open /lib/libc.so.6 succeeded
Pour finir, assurez-vous que GCC utilise le bon éditeur de liens
dynamiques :
grep found dummy.log
Si tout fonctionne correctement, il ne devrait pas y avoir
d'erreurs et la sortie de la commande sera (avec des différences
spécifiques aux plateformes dans le nom de l'éditeur de
liens) :
found ld-linux.so.2 at /lib/ld-linux.so.2
Si la sortie n'apparaît pas comme montré ci-dessus ou qu'elle
n'apparaît pas du tout, alors quelque chose ne va vraiment pas.
Investiguez et retracez les étapes pour savoir d'où vient le
problème et comment le corriger. La raison la plus probable est que
quelque chose s'est mal passé lors de la modification du fichier
specs ci-dessus. Tout problème devra être résolu avant de continuer
le processus.
Une fois que tout fonctionne correctement, nettoyez les fichiers
tests :
rm -v dummy.c a.out dummy.log