6.12. GCC-4.1.2

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

Temps de construction estimé : 22 SBU testsuite included
Espace disque requis : 681 MB testsuite included

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]

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

6.12.2. Contenu de GCC

Programmes installés: c++, cc (lien vers gcc), cpp, g++, gcc, gccbug et gcov
Bibliothèques installés: libgcc.a, libgcc_eh.a, libgcc_s.so, libmudflap.{a,so}, libssp.{a,so}libstdc++.{a,so} et libsupc++.a

Descriptions courtes

c++

Le compilateur C++

cc

Le compilateur C

cpp

Le préprocesseur C ; il est utilisé par le compilateur pour l'extension des instructions #include, #define et d'autres instructions similaires dans les fichiers sources

g++

Le compilateur C++

gcc

Le compilateur C

gccbug

Un script shell utilisé pour aider à la création de bons rapports de bogues

gcov

Un outil de tests ; il est utilisé pour analyser les programmes et savoir où des optimisations seraient suivies du plus d'effet

libgcc

Contient un support en exécution pour gcc

libmudflap

Contient des routines qui supportent la fonctionnalité de test des limites de GCC

libssp

Contient des routines supportant la fonctionalité de GCC de protection contre les débordements de mémoire

libstdc++

La bibliothèque C++ standard

libsupc++

Fournit des routines de support pour le langage de programmation C++