Guide de la Compilation de Gcc sous windows avec MinGW
Date de publication : 22/09/2007 , Date de mise à jour : 05/09/2010
VII. Compiler Gcc
VII-A. Si vous voulez activer le support de Ada
VII-B. Configurer Gcc
VII-B-1. Comprendre la commande
VII-B-2. Comprendre le processus de compilation
VII-C. Compiler Gcc première (selon conditions)
VII-C-1. Comprendre les commandes
VII-C-2. Terminer l'installation de pthreads
VII-C-3. Si vous souhaitez activer le support de Java
VII-C-3-a. Installer unzip
VII-C-4. Retourner dans le dossier de compilation de Gcc
VII-D. Compiler Gcc deuxième
VII. Compiler Gcc
VII-A. Si vous voulez activer le support de Ada
VII-B. Configurer Gcc
Il est temps de configurer la compilation de Gcc. Cela se fait à l'aide des commandes
$ cd gcc
$ ../../gcc-4.6.20100904/configure --prefix=/mingw --with-sysroot=/mingw \
> --enable-libssp --enable-libgomp --enable-libstdcxx-debug \
> --enable-version-specific-runtime-libs --enable-fully-dynamic-string \
> --enable-shared --enable-languages=c,c++,ada,fortran,objc,obj-c++,java \
> --with-dwarf2 --disable-nls --disable-win32-registry \
> --disable-werror
|
VII-B-1. Comprendre la commande
Après être entré dans le dossier dans lequel nous souhaitons que la compilation s'effectue, nous configurons
Gcc en lui passant (seuls les options n'ayant pas encore été vues sont reprises)
-
--enable-libssp : provoque la compilation de la bibliothèque SSP, (Stack Smashing Protection) une bibliothèque
permettant de se protéger un peu des problèmes liés à la corruption de la pile
-
--enable-libgomp : provoque la compilation de la bibliothèque GOMP, une bibliothèque implémentant la
norme OpenMP pour le travail parallèle
-
--enable-libstdcxx-debug : provoque la compilation d'une version de la biblitothèque standard de C++
avec le support des informations de débogage
-
--enable-specific-runtime-libs : fait en sorte que les différentes bibliothèques soient placées dans des
dossiers particuliers en fonctions de la cible et de la version du compilateur, de manière à permettre
à plusieurs versions de cohabiter
-
--enable-fully-dynamic-string : fait en sorte que les chaines de caractères soient d'office représentées
par des chaines de caractères de taille dynamique, pour éviter les éventuels problèmes avec certaines
bibliothèques
-
--with-dwarf2 : indique que les informations de débogage seront par défaut au format Dwarf2
-
--disable-sjlj-exceptions : désactive explicitement le support de SJLJ comme gestionnaire d'exception.
-
--disable-win32-registry : fait en sorte que Gcc n'aille pas écrire d'informations particulières dans le
registre de windows
-
--disable-werror : désactive le flag "-Werror" lors des deuxièmes et troisièmes stages de compilation
-
--enable-languages:c,c++,ada,fortran,objc,obj-c++,java : indique les langages dont nous souhaitons activer
le support
 |
J'ai demandé à ce que les différentes bibliothèques soient fournies sous leur forme dynamique, quand
elle est disponible
Vous pouvez parfaitement demander à ce que la version dynamique ne soit pas créée en remplaçant
l'option --enable-shared par l'option inverse: --disable-shared
|
 |
J'ai demandé à ce que la compilation fournisse le support pour l'ensemble des langages
Vous pouvez bien entendu sélectionner les langages qui vous intéressent.
Pensez cependant au fait que C est absolument obligatoire.
|
 |
Vous pourrez en apprendre d'avantage sur les options de configurations de Gcc directement sur le site de Gcc
Vous pouvez également utiliser l'option --help ou l'option --help=recursive
du script de configuration pour obtenir une aide en ligne.
|
 |
N'oubliez pas que vous ne pourrez demander à ce que le compilateur Ada soit compilé que si vous disposez
déjà d'un compilateur pour ce langage.
|
 |
L'ordre dans lequel vous transmettrez les options ou demanderez le support des langages
n'a pas d'importance. Il faut cependant veiller à ne pas oublier une option qui pourrait
vous intéresser.
|
VII-B-2. Comprendre le processus de compilation
Lorsque la cible (l'option --target et l'hôte (l'option --host) pour lequel
vous demandez la compilation de Gcc sont identiques, le processus de compilation s'effectuera trois
fois:
-
La première fois pour créer un compilateur susceptible de fournir des exécutables utilisable par la cible
-
La deuxième fois pour créer un compilateur utilisable sur la cible (qui est également l'hôte)
-
La troisième fois pour s'assurer que le compilateur obtenu soit capable de se compiler lui-même.
On se base en effet sur le principe que, si un compilateur est capable de se compiler lui-même,
il sera capable de compiler n'importe quoi.
Ce processus s'appelle le bootstrap
Il paraitrait que le compilateur sera d'autant mieux optimisé qu'il aura été compilé de nombreuses fois,
mais cela n'est peut-être que légende urbaine.
La première passe se contentera généralement de compiler un stricte minimum, alors que les étapes suivantes
compileront Gcc dans son ensemble (en fonction de la configuration que vous aurez choisie).
Ces deux dernières étapes utiliseront, par défaut, le drapeau "-Werror" lors de la compilation, qui a
pour objectif de faire en sorte que le compilateur traite les avertissements exactement comme s'il
s'agissait d'erreur, en quittant le processus de compilation.
Comme il reste malgré tout de nombreux points dans le code source où des avertissements sont lancés,
alors que l'auteur du code savait parfaitement ce qu'il faisait, il est important de passer l'option
--disable-werror lors de la configuration, afin d'éviter que la compilation n'échoue
"au beau milieu" du processus suite à un "simple" avertissement.
VII-C. Compiler Gcc première (selon conditions)
 |
Vous pouvez passer ce chapitre si vous n'avez pas demandé la compilation de libgomp au lors de la configuration
|
Afin de pouvoir compiler la bibliothèque libgomp, nous aurons besoin d'une version utilisable de la bibliothèque
pthreads qui fournit un support partiel des threads de type "posix".
Libgomp et pthreads ne sont pas indispensables pour la compilation de Gcc, mais libgomp ne peut absoluement
pas être compilé si l'on ne dispose pas du support des threads posix.
Si vous ne voulez pas installer pthreads, vous ne pourrez pas utiliser l'option --enable-libgomp.
Si vous avez passé l'option --enable-libgomp au script de configuration, il faudra veiller
à assurer la présence de la bibliothèque pthead, dont libgomp dépend.
Tant qu'à faire, il est intéressant de faire en sorte que pthread sera compilée en utilisant la version
du compilateur que nous sommes sur le point de compiler.
Il s'agira alors de compiler et d'installer un stricte minimum pour être en mesure de créer les fichiers
objets, à savoir le compilateur C et la bibliothèque qui va avec avec les commande
$ make all-gcc && make install-gcc && \
> make target-libgcc && make install-target-libgcc
|
Vous l'aurez constaté, il faut en réalité enchainer quatre commandes, car il faut au minimum que le compilaeur
C ait été compilé avant de pouvoir compiler libgcc.
Comme les deux devront de toutes manières être installés, autant les installer directement, même si l'installation
de libgcc semble également installer le compilateur C.
Vous pouvez obtenir les sources de pthreads directement sur le site de MinGW. Ma version actuelle est
la 2.8.0-3
Après avoir téléchargé les sources, décompressez les avec les commande
$ cd /~
lzma -d /c/download/pthreads-w32-2.0.8-3-mingw32-src.tar.lzma
tar -vxf /c/download/pthreads-w32-2.0.8-3-mingw32-src.tar
tar -vxzf pthreads-w32-2.0.8.-3-release.tar.gz
|
La commande cd ~ permet de retourner dans son dossier personnel, qui est le dossier dans
lequel nous avons à la base décompressé les sources.
Il semblerait que l'équipe de MinGW aie décidé de fournir une archive des sources de pthread à l'intérieur
d'une autre, au format tar.lzma. C'est la raison pour laquelle vous constatez les trois commandes
d'extraction.
Les sources de pthreads ne sont pas fournies avec le script de configuration habituel, mais directement
avec un Makefile qui s'occupe de gérer la compilation.
Afin de nous assurer que ce soit effectivement le compilateur que nous sommes occupés à compiler qui
sera utilisé, nous pouvons demander l'affichage de la versin de gcc avec la commande
Si vous obtenez, entre autre, l'affichage
gcc versin 4.6.0 20100904 (experimental)
|
vous aurez votre certitude.
Autrement, vous devrez modifier la ligne 56 du fichier GNUmakefile qui ressemble à
pour qu'elle corresponde à
Une fois que nous serons sur du compilateur utilisé, nous pourons compiler pthreads en allant directement
dans le répertoire des sources avec les commandes
cd pthreads-w32-2-8-0-release
make clean GC
|
Le makefile fourni ne permet pas l'installation automatique, il faut donc copier un certain nombre de
fichiers manuellement avec les commandes
cp pthreadGC2.dll /mingw/bin
cp pthreadGC2.dll /mingw/i686-pc-mingw32/lib/libpthread.a
cp pthreadGC2.dll /mingw/i686-pc-mingw32/lib/libpthreadGC2.a
cp pthreads.h semaphore.h sched.h /mingw/i686-pc-mingw32/include
cp config.h /mingw/i686-pc-mingw32/include/pthreads_config.h
|
VII-C-1. Comprendre les commandes
La première instruction copie, tout simplement, la bibliothèque dans le dossier dans lequel se trouvent
tous les exécutables.
La bibliothèque d'importation (libpthreadGC.a) ne semble pas convenir, ce qui justifie que nous copions
la DLL elle-même en la renommant au nom de la biliothèque d'importation.
Comme de nombreux système ne font pas la différence entre les différentes versions envisageables de pthreads,
faisons de même en donnant un nom sans information de version : libpthread.a
Nous copions ensuite les fichiers d'en-tête indispensables dans le dossier include: pthreads.h, sched.h
et semaphore.h
Enfin, nous copions le fichier config.h dans le dossier include en le renommant au passage en config_pthreads.h
afin d'éviter qu'il n'interfère avec d'autres fichiers config.h lors de processus de compilation
d'autres projets.
VII-C-2. Terminer l'installation de pthreads
Il ne nous reste plus que deux choses à faire au sujet de pthreads: Nous assurer que pthreads_config.h
sera bel et bien inclus dans pthreads.h
modifier
# if HAVE_CONFIG_H
# include "config.h"
# endif
en
# include "pthreads_config.h"
|
Puis veiller à ce que le dossier /mingw/mingw contiennent exactement la même chose que le dossier /mingw/i686-pc-mingw32,
avec les commandes
$ rm -rf /mingw/mingw
$ cp /mingw/i686-pc-mingw /mingw/mingw
|
 |
Vous pouvez bien évidemment utiliser l'explortateur windows pour ce faire, mais, tant qu'à avoir la ligne
de commande MSYS sous la main...
|
 |
Vous pouvez attendre d'avoir installé unzip si vous souhaitez également activer le support pour Java.
Il ne sert pas à grand chose de le faire deux fois alors qu'une seule serait suffisante.
|
VII-C-3. Si vous souhaitez activer le support de Java
Vous le savez certainement, java utilise un format particulier d'archives: le JAR.
Tels qu'elles sont présentées classiquement, les sources de Gcc ne permettent pas de gérer de telles
archives.
Cette bibliothèque ne fournit pas de script de configuration, mais un certain nombre de Makefile "prêts
à l'emploi".
Après avoir téléchargé les sources, décompressez les archives dans votre dossier personnel (c:\msys\1.0\<votre
nom>)
VII-C-3-a. Installer unzip
Entrez dans le dossier contenant les sources de zip et demandez la compilation de l'ensemble avec la
commande
$ make -fwin32/Makefile.gcc NOASM=1 all
|
Copiez les fichiers qui nous intéressent avec les commandes
cp libunzip32.a /mingw/i686-pc-mingw32/lib
cp libunzip32.a /mingw/i686-pc-mingw32/lib/libunzip.a
cp zip.h unzip.h unzpriv.h /mingw/i686-pc-mingw32/include
cp globals.h /ming/i686-pc-mingw32/include/globals_zip.h
|
Modifiez le fichier unzpriv.h à auteur de la ligne 2320 pour qu'il inclue globals_zip.h au lieu de globals.h
(vu que c'est le nouveau nom donné au fichier).
A l'origine, ce fichier ressemble à
/*************/
/* Globals */
/*************/
#if (defined(OS2) && !defined(FUNZIP))
# include "os2/os2data.h"
#endif
#include "globals.h"
|
La ligne en question étant la dernière. Modifiez cette dernière ligne en
/*************/
/* Globals */
/*************/
#if (defined(OS2) && !defined(FUNZIP))
# include "os2/os2data.h"
#endif
#include "globals_zip.h"
|
La raison d'être de ce changement de noms est que nous courrons le risque que d'autres projets essayent
d'ajouter leur propre fichier "globals.h" au fichier d'en-tête, ce qui aurait pour résultat de
remplacer celui de unzip.
Il ne reste plus qu'à veiller à ce que le dossier /mingw/mingw contiennent exactement la même chose que
le dossier /mingw/i686-pc-mingw32, avec les commandes
$ rm -rf /mingw/mingw
$ cp /mingw/i686-pc-mingw /mingw/mingw
|
 |
Vous pouvez bien évidemment utiliser l'explortateur windows pour ce faire, mais, tant qu'à avoir la ligne
de commande MSYS sous la main...
|
VII-C-4. Retourner dans le dossier de compilation de Gcc
Une fois que
$ cd /home/<votre nom>/build/gcc
|
VII-D. Compiler Gcc deuxième
Nous pouvons maintenant lancer le processus de compilation dans son intégralité, puis installer Gcc à
l'aide des commandes
Après avoir lancé cette commande, vous pourrez passer à autre chose le temps que tout se fasse, car le
processus de bootstrap prendra un temps certain (trois à quatre heures sur un Athlon 1800 XP, un
peu plus de deux heures sur un Intel quad core I7 sans le recours à la compilation parallèle).


Copyright © Philippe Dunski.
Aucune reproduction, même partielle, ne peut être faite
de ce site ni de l'ensemble de son contenu : textes, documents, images, etc.
sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à
trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.