III. Compilation▲
III-A. binutils▲
Après avoir tout extrait, tout installé, nous pouvons entamer cette joyeuse partie.
Dans le répertoire /work/build, commençons par créer un nouveau dossier : binutils, une preuve de l'imagination débordante qui règne en ce bas monde de développeurs et entrons dans celui-ci.
mkdir binutils $amp; cd binutils
Ensuite, lançons l'outil dont je vous ai longuement parlé au début : configure. Que va-t-il faire ? Créer un Makefile, qui contiendra toutes les informations nécessaires à la compilation. Pour ce faire, tapez ceci :
../../src/binutils/configure \
--prefix=/gcc --target=i386-pc-mingw32 \
--program-prefix="" \
--with-lib-path=/mingw/mingw32/lib:/mingw/lib:/usr/local/lib:/lib:/usr/lib \
--with-gcc --with-gnu-as --with-gnu-ld --disable-nls --disable-shared
Que signifie ce charabia ?
III-A-1. ../../src/binutils/▲
Configure crée le Makefile dans le dossier courant, mais nous ne voulons pas détraquer le dossier de sources.
En effet, il pourra encore servir un peu après, ne fût-ce que pour vérifier que GCC a bien été compilé.
III-A-2. configure▲
Tout simplement l'outil que nous utilisons : configure.
Il va créer le makefile et d'autres fichiers d'entête spécifiques à la machine / OS / …
III-A-3. --prefix=/gcc▲
Ceci indique que les outils iront s'installer dans le répertoire /gcc, où se logera la future installation de la dernière version de GCC, avec les bibliothèques et les outils qu'il requiert.
On peut l'appeler la racine de l'installation : cela correspond à l'analogie entre des répertoires et un arbre, vu que l'on parle de l'arborescence des dossiers. Ce répertoire renvoie aux racines de l'arbre, et les dossiers qui y seront créés aux branches.
III-A-4. --target=i386-pc-mingw32▲
La plateforme pour laquelle les binutils seront compilés.
i386 correspond au processeur : à partir de la génération Intel 80386 pour les i386, par exemple. Tout Windows est compilé pour ces processeurs, c'est-à-dire que vous pourrez installer Vista sur un bon vieux 80386 (le lancer serait une gageure, mais ceci est un tout autre débat…).
pc : vous êtes installé face à un PC, il me semble ? Même si vous utilisez Boot Camp sur votre Mac, il vous faudra préciser le pc, vu que Windows est prévu pour des PC, à l'origine.
mingw32 désigne le système d'exploitation.
Cependant, vu la multiplicité des compilateurs sous Windows (GCC/MinGW, GCC/Cygwin, GCC/DJGPP, Microsoft C++, Intel C/C++, Borland C++, Digital Mars, LCC, Turbo C/C++…), on préfère le compilateur afin de désigner cet OS, même si seul GCC est capable de le compiler (à cause de ses trop nombreuses extensions non standard ni standardisées).
III-A-5. --program-prefix=""▲
Il n'est pas très utile de mettre une valeur ici : quel intérêt de devoir appeler qsdsdgezzrth-ld au lieu de ld ? Sauf, bien entendu, si vous souhaitez utiliser plusieurs versions de GCC en même temps, ou d'autres programmes qui utilisent les mêmes noms pour leurs exécutables.
III-A-6. --with-libpath=/mingw/mingw32/lib:/mingw/lib:/usr/local/lib:/lib:/usr/lib▲
Tous les répertoires où le compilateur devra aller chercher les bibliothèques (fichiers .a), séparés par des :, même si le shell contient déjà une liste de répertoires où chercher les bibliothèques à lier.
Ces quelques répertoires renferment les entêtes de MinGW (nécessaires pour compiler sous Windows), et les entêtes système (comme le noyau Linux).
III-A-7. --with-gcc --with-gnu-as --with-gnu-ld▲
Nous utiliserons des compilateurs GNU, de la famille GCC, pour compiler ces fameux outils, aidés d'un assembleur et d'un linker gnu.
À noter, aussi, --with-as et --with-ld, qui permettent de préciser quels assembleur et linker précisément il faudra utiliser.
D'habitude, on les recherche dans le path, que nous avons précédemment configuré.
Ces deux paramètres n'ont d'importance que quand on travaille sous HP-PA 1.0, 1.1 et Solaris 2. Sous ces systèmes, on est obligé d'utiliser les deux paramètres conjointement.
III-A-8. --disable-shared --disable-nls▲
Ces options ont la (mauvaise) réputation de casser toute tentative de compilation statique, sous Windows, lorsque l'on utilise ces outils ou des bibliothèques qu'ils ont produits.
Ceci permet de vous éviter de nombreuses recherches futures pour résoudre un problème qui n'aurait pas dû exister.
III-A-9. \▲
Une simple séparation de la ligne en plusieurs lignes, vous pouvez passer ce symbole, mais, une fois entré, vous devez faire un retour chariot.
Il est l'équivalent du ^ sous DOS, mais sans « Plus ? » ni « More? » à la ligne suivante.
III-A-10. La suite▲
Normalement, tout devrait se passer sans problème. Si, cependant, on vous dit que GCC est introuvable, qu'il est incapable de produire des exécutables, ou autre chose, vérifiez qu'il est bien dans le path, en l'ajoutant à nouveau dedans :
path=$PATH:/mingw/bin
Quand tout le charabia a fini de se dérouler, normalement, le dossier /work/build/binutils devrait être un peu plus rempli… Lançons donc la vraie compilation…
make all
compile le tout, tandis que
make install
installe le tout, dès qu'il est compilé.
III-B. W32API▲
Même procédure, mêmes explications.
cd /work/build
mkdir w32-api
cd w32-api
../../src/w32-api/configure \
--prefix=/gcc --target=i386-pc-mingw32 \
--with-as=/mingw/bin/as.exe --with-ld=/mingw/bin/ld.exe
make all
make install
III-C. MinGW Runtime▲
cd /work/build
mkdir mingwrt
cd mingwrt
../../src/mingwrt/configure \
--prefix=/gcc --target=i386-pc-mingw32 \
--with-as=/mingw/bin/as.exe --with-ld=/mingw/bin/ld.exe
make all
make install
III-D. LibIconv et LibIntl▲
Décompressez dans /gcc les archives de GnuWin32, vous pouvez omettre le dossier manifest. Si vous voulez tenter leur compilation, essayez les mêmes manipulations que ci-dessus, même s'il vous est presque assuré que vous ne réussirez pas cette compilation…
III-E. GMP▲
III-E-1. --target▲
Comme d'habitude, mais ne nous réjouissons pas, cela va (trop) vite changer… Vous pouvez, ici, changer le target, pour refléter au mieux votre configuration. Plus vous serez proche, plus la bibliothèque pourra utiliser des scripts adaptés et performants sur votre processeur. i386 : Intel 80386 et compatibles i486 : Intel 80486 et compatibles i586 : Pentium et compatibles i686 : Pentium Pro et compatibles i786 : Pentium 4 et compatibles i886 : le futur Intel 80886 et compatibles core2 : Core 2 et compatibles ia-64 : Intel Itanium, Itanium 2 et compatibles amd-64 : AMD 64 bits et compatibles (comme Core 2) powerpc : PowerPC, toutes variantes et compatibles sparc : SPARC, UltraSPARC, MicroSPARC, SuperSPARC et compatibles m68k : Amiga, Apollo et compatibles
cd /work/build
mkdir gmp
cd gmp
../../src/gmp/configure \
--prefix=/gcc --target=i386-pc-mingw32 \
--with-gnu-as --with-gnu-ld \
--with-as=/mingw/bin/as.exe --with-ld=/mingw/bin/ld.exe \
--enable-fat
make all
make install
III-E-2. --enable-fat▲
Ce paramètre indique que l'optimisation pour tous les processeurs supportés par l'OS sera activée. Ceci aura pour conséquence de légèrement augmenter la taille de l'exécutable, mais le rendra plus performant sur tous les processeurs. Ceci n'est pas très utile pour GCC : il n'utilise GMP que pour effectuer quelques calculs constants dans votre programme.
III-F. MPFR▲
La dernière bibliothèque ne posera aucun problème particulier.
cd /work/build
mkdir gmp
cd gmp
../../src/gmp/configure \
--prefix=/gcc --target=i386-pc-mingw32 \
--with-gnu-as --with-gnu-ld \
--with-as=/mingw/bin/as.exe --with-ld=/mingw/bin/ld.exe
make all
make install
III-G. Finalisation des bibliothèques▲
C'est bien, tout est installé dans votre future installation de GCC, mais l'actuelle ne sait pas encore où cela est rangé !
Copiez donc /gcc dans /mingw. Remplacez tout : ceci ne peut être que plus récent.
À l'exception notable des exécutables : il n'est pas impossible que la nouvelle version des binutils soit incompatible avec l'ancienne version de GCC que MinGW vous fournit.
III-H. GCC himself▲
III-H-1. La configuration▲
cd /work/build
mkdir gcc
cd gcc
../../src/gcc/configure \
--prefix=/gcc --target=i386-pc-mingw32 \
--program-prefix="" --with-as=/mingw/bin/as.exe \
--with-ld=/mingw/bin/ld.exe --with-gcc --with-gnu-ld --with-gnu-as \
--enable-threads --disable-nls \
--enable-languages=c,c++,ada,fortran,objc,treelang \
--disable-win32-registry --disable-shared --without-x \
--enable-interpreter --enable-libstdcxx-debug \
--with-gmp=/gcc --with-mpfr=/gcc --with-gomp
III-H-1-a. Quelques explications ?▲
III-H-1-a-i. --enable-threads▲
La compilation est plus rapide avec des threads, cela parallélise la situation et remplit mieux votre processeur.
Ce paramètre autorise l'utilisation des threads dans GCC (lors de la compilation) et dans les langages Objective C et C++. Les autres langages peuvent utiliser d'autres bibliothèques pour utiliser (facilement) les fils d'exécution.
III-H-1-a-ii. --enable-languages=c,c++,ada,fortran,objc,treelang▲
Si vous n'avez pas besoin d'un langage, enlevez-le de la liste, mais la compilation d'autres langages que le C ne prend pas beaucoup de temps.
J'ai aussi enlevé l'Objective C++, vu que je n'ai jamais été autorisé à le compiler (« can't make obj-c++ », sans un mot de plus).
III-H-1-a-iii. --disable-win32-registry --without-x▲
Nous sommes sous Windows, un OS qui ne permet pas à un serveur X d'exister, mais qui propose un registre. Nous ne voulons pas remplir le registre et nous ne voulons pas d'erreur à cause du vide.
III-H-1-a-iv. --enable-libstdcxx-debug▲
La version de debug de la bibliothèque standard C++ sera compilée : avec un débogueur, c'est la panacée !
III-H-1-a-v. --with-gmp=/gcc --with-mpfr=/gcc▲
Oui, nous avons compilé GMP et MPFR, ils sont dans le dossier de GCC, celui qui compile, mais il ne les trouve pas toujours ! Indiquons-lui où les trouver, ainsi !
III-H-1-a-vi. --with-gomp▲
Compile le support d'OpenMP, qui permet la parallélisation facilement. GCC 4.4 supportera OpenMP 3.0, la dernière version de la spécification, tandis que la version 2.5 est supportée depuis GCC 4.2.
En fait, le gomp de l'option renvoie à la bibliothèque GOMP (GNU OpenMP), une implémentation d'OpenMP pour GCC.
III-H-2. La compilation et l'installation▲
make CFLAGS='-O' LIBCFLAGS='-O2' LIBCXXFLAGS='-O2 -fno-implicit-templates' LDFLAGS='-s'
make install
Juste pour indiquer à make ce qu'il peut admettre, à quel point il doit optimiser, et c'est tout.
Vous pouvez ajouter -j2 si vous disposez de deux unités logiques de calcul (dual-core, carte-mère bi-socket…). Vous pouvez incrémenter ce nombre, mais les performances pourraient en pâtir, si vous prenez beaucoup trop de tâches simultanées !
Faites attention, de nombreuses erreurs peuvent être évitées en ne voulant pas aller trop vite.
IV. Options supplémentaires pour la configuration▲
IV-A. Généralités▲
IV-A-1. Concernant les répertoires d'installation▲
--prefix indique où seront rangés les fichiers indépendants de la plateforme (c'est-à-dire compatibles entre tous les OS), tandis que --exec-prefix s'occupe du répertoire des fichiers dépendants de la plateforme.
Souvent, ces deux paramètres ont la même valeur.
Il y a aussi moyen de préciser où chaque type de fichier trouvera sa place :
- --bindir
- --sbindir
- --libexecdir
- --datadir
- --sysconfdir
- --sharedstatedir
- --localstatedir
- --libdir
- --includedir
- --oldincludedir
- --infodir
- --mandir
Un peu d'anglais vous permettra d'associer chaque option à sa signification.
IV-A-2. Concernant le nom des programmes▲
--program-prefix permet d'indiquer ce qu'il faut ajouter avant chaque nom de programme.
--program-suffix permet d'indiquer ce qu'il faut ajouter après chaque nom de programme.
--program-transform-name permet d'indiquer le paramètre qui sera passé à sed, pour la transformation du nom.
IV-A-3. Concernant les OS▲
--build : votre plateforme (presque toujours « devinée »).
--host, ou la plateforme sur laquelle les exécutables compilés s'exécuteront.
--target, alias la plateforme où les outils seront lancés.
Ces commandes existent sur tous les paquets de compilateurs (principalement GCC et les binutils, mais aussi ceux qui nécessitent des outils spéciaux pour la compilation, comme Qt).
IV-A-4. Concernant les drapeaux▲
Ils se précisent bizarrement dans la ligne de commande et cela peut varier selon le shell.
Cependant, la manière la plus répandue de faire est de les invoquer ainsi :
configure CC=/bin/gcc
IV-A-4-a. Le compilateur C▲
CC indique le compilateur C, CFLAGS les paramètres supplémentaires à passer au compilateur C pendant la compilation, CPPFLAGS, ceux à passer au préprocesseur C.
IV-A-4-b. Le compilateur C++▲
CXX indique le compilateur C++, CXXFLAGS les paramètres supplémentaires à passer au compilateur C++ pendant la compilation, CXXCPP, le préprocesseur C++.
IV-A-4-c. Les anciens binutils▲
LDFLAGS indique les options à passer au linker, AR, AS, DLLTOOL, LD, LIPO, NM, RANLIB, STRIP, WINDRES, WINDMC, OBJCOPY, OBJDUMP, les exécutables de ces outils.
À noter, aussi, l'existence des drapeaux CC_FOR_TARGET, CXX_FOR_TARGET, AR_FOR_TARGET, AS_FOR_TARGET, DLLTOOL_FOR_TARGET, LD_FOR_TARGET, LIPO_FOR_TARGET, NM_FOR_TARGET, RANLIB_FOR_TARGET, STRIP_FOR_TARGET, WINDRES_FOR_TARGET, WINDMC_FOR_TARGET, OBJCOPY_FOR_TARGET, OBJDUMP_FOR_TARGET, qui servent à présenter les outils pour la plateforme cible.
IV-A-4-d. M4▲
C'est un outil qui permet de reconfigurer en partie certains paquets. Son drapeau porte son nom.
IV-B. Les binutils et GCC▲
Toutes les options qui commencent par --enable- peuvent être désactivées en remplaçant ce préfixe par --disable-.
IV-B-1. -enable-gold▲
Utilise l’éditeur de liens gold au lieu de ld, censé être plus rapide, ou le compile.
Il est le produit des recherches d'un employé de Google (tiens donc, il vient se perdre ici aussi ?), Ian Lance Taylor. Cependant, il n'est utilisable que pour les systèmes à base d'ELF, comme GNU/Linux, sur des processeurs x86 ou x86_64.
Il n'est compatible qu'avec GCC 4 et les versions supérieures ! Vous ne pouvez donc pas utiliser son exécutable en remplacement de ld dans une installation de GCC 2 ou GCC 3.
IV-B-2. --enable-libada▲
Demande la compilation de libada dès cette étape, un runtime Ada.
Cette option n'est utile que pour les plateformes qui ne disposent pas déjà d'un compilateur Ada, mais il est préférable de ne l'activer qu'avec la configuration de GCC.
IV-B-3. --enable-libssp▲
Demande la compilation de libssp, un « résumé » de la bibliothèque standard.
De toute façon, s'il est requis pour la compilation, il sera compilé. Ne vous en inquiétez dons pas trop.
IV-B-4. --enable-stage1-languages▲
Active la compilation de tous les outils dès le stage 1.
Il est recommandé de mettre ici la valeur all.
IV-B-5. --enable-objc-gc▲
Active la compilation du ramasse-miettes dans l'environnement d'exécution GNU du langage Objective C.
Un ramasse-miettes est un nettoyeur de mémoire automatique : un objet n'est plus utilisé et ne le sera plus ? On le supprime !
IV-B-6. --enable-bootstrap▲
Active la recompilation du compilateur avec la première compilation du compilateur (qui a suivi ? qu'il se dénonce !).
Obligatoire, sauf pour les cross-compilateurs, où cela est strictement impossible.
IV-B-7. --enable-maintainer-mode▲
Active des portions du Makefile, utiles uniquement pour les mainteneurs du paquet.
Disponible aussi dans de nombreux paquets, mais pas tous !
IV-B-8. --enable-stage1-checking▲
Active de nouveaux tests lors de la phase la plus délicate de la compilation des compilateurs, la première.
Elle n'est vraiment utile que quand vous ne pouvez pas être sûr de la validité de votre compilateur (très vieux, pas GCC…), auquel cas le résultat de la compilation pourrait être incorrect.
IV-B-9. --enable-werror▲
Active l'option -Werror de GCC pour la compilation des stages 2 et supérieurs.
Cette option transforme tous les warnings en errors, pour être sûr d'avoir un résultat aussi parfait que possible.
IV-B-10. --with-gmp et --with-mpfr▲
Permettent de préciser les répertoires où il faut trouver GMP et MPFR, compilés, quand configure ne les trouve pas ou qu'ils sont dans des répertoires anormaux.
GCC s'en sert pour calculer, le plus vite possible, tout ce qui peut déjà l'être : vous voulez une fonction qui multiplie par pi, puis qui divise par une constante ? GCC optimisera cela directement en une simple division avec un float, à l'aide de ces deux bibliothèques.
IV-C. GMP▲
IV-C-1. --enable-assert▲
Active les assert, principalement utiles lors du débogage.
Les assertions sont, en gros, ce que vous pensez qu'il va toujours se passer dans votre code : si votre fonction prend, en paramètre, un pointeur non nul, vous pouvez être sûr que ce pointeur ne sera jamais nul ! C'est pour expliquer cela que les assertions ont été créées. N'hésitez pas à vous documenter sur le sujet.
IV-C-2. --enable-cxx▲
Active l'interface C++, qui utilise tout ce que le C ne permet pas, comme la surcharge d'opérateurs, qui permet d'utiliser les opérateurs sur des objets GMP, au lieu d'utiliser des fonctions.
IV-C-3. --enable-fft▲
Active une optimisation de la multiplication, la transformation de Fourrier rapide.
IV-C-4. --enable-mpbsd▲
Construit une bibliothèque compatible avec Berkeley MP, une autre bibliothèque de calcul, made in Berkeley, l'université à qui l'on doit, entre autres, BSD.
IV-C-5. --enable-profiling▲
Active le support des profilers, qui permettent de détecter les portions de code à optimiser, au détriment des performances pures lors de l'utilisation de ce paramètre.
IV-C-6. --enable-fat▲
Demande la création de gros binaires (qui contiennent les versions compilées pour plusieurs architectures : sous MacOS X, pour PowerPC et MacIntel, par exemple).
IV-C-7. --with-readline▲
Active l'utilisation de la bibliothèque readline, pour certains exemples en console.