IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

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
info 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
info 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.
info Vous pourrez en apprendre d'avantage sur les options de configurations de Gcc directement en 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.
warning 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.
info 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)

info 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

gcc -v
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 à

CC    = $(CROSS)gcc
pour qu'elle corresponde à

CC    = /mingw/bin/gcc
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 /* HAVE_CONFIG_H */

en 


//#if HAVE_CONFIG_H
#include "pthreads_config.h"
//#endif 
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
info Vous pouvez bien évidemment utiliser l'explortateur windows pour ce faire, mais, tant qu'à avoir la ligne de commande MSYS sous la main...
info 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.

Vous devrez donc veiller à installer une bibliothèque supplémentaire: unzip, dont vous trouverez les sources sur en le site de sourceforge qui leur est dédié

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
info 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

$ make && make install
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).

 

Valid XHTML 1.0 TransitionalValid CSS!

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.