Developpez.com - C
X

Choisissez d'abord la catégorieensuite la rubrique :

Guide de la Compilation de Gcc sous windows avec MinGW

Date de publication : 22/09/2007 , Date de mise à jour : 05/09/2010


IV. Obtenir les sources
IV-A. Les versions testées
IV-A-1. GMP-5.0.1
IV-A-2. MPFR-3.0.0
IV-A-3. MPC-0.8. "Dianthus deltoides"
IV-A-4. Binutils-2.20.51
IV-A-5. GCC-4.6.0
IV-B. Décompresser les sources
IV-B-1. Comprendre les commandes
IV-B-1-a. Renommer le dossier de sources pour w32api
IV-B-1-b. Copier les sources de GMP, MPFR et MPC
IV-B-1-b-i. Comprendre la commande
IV-B-1-b-ii. Corriger quelques fichiers
IV-B-1-b-ii--. Si vous voulez activer le support de Ada


IV. Obtenir les sources

Nous devrons compiler un certain nombre de paquets afin d'obtenir une version fonctionnelle de Gcc, dans l'ordre:

Pour cela, nous devons donc veiller à obtenir les sources relatives à ces différents paquetages.

Les sources des paquets propres à MinGW (mingw-runtime, w32-api et le cas échéant pthreads) seront téléchargées directement sur le site de MinGW.

Pthread n'est pas à proprement parler indispensable pour la compilation de Gcc.  Cependant, elle sera requise si vous souhaitez activer le support de libgomp, qui est une bibliothèque de base supportant OpenMP permettant la programmation parallèle.

Pour les autres, paquets, vous pourrez décider de récupérer les sources directement sur le site de MinGW, mais, si votre idée est de profiter des dernière versions, l'idéal est d'aller les chercher directement sur le site dédié :


IV-A. Les versions testées

Ainsi que je l'ai signalé, les numéros de version sont susceptibles d'évoluer très rapidement, ne serait-ce que du côté des "snapshot" étant donné qu'il en sort un par semaine.

S'il n'est pas impossible que la version 4.7 de GCC ne sorte qu'après la finalisation de la norme C++0x, bien que je ne puisse le jurer, il est donc aussi tout à fait possible que la version stable numérotée 4.5 évolue encore d'ici la stabilisation de la version 4.6.

Les numéros de version et les instructions de compilation que je fournis dans ce tutorial sont donc à prendre dans le sens où c'est ce qui fonctionnait au moment de la rédaction.


IV-A-1. GMP-5.0.1

Il s'agit de la dernière version à l'heure d'écrire ces lignes

Cette version apporte, outre les améliorations propres, d'énormes facilités en terme de compilation :

Il est, avec cette version, possible de compiler GMP directement lors de la compilation de Gcc.

Nous pourrons donc nous contenter de copier l'intégralité des sources de GMP dans un sous dossier des sources de Gcc nommé gmp


IV-A-2. MPFR-3.0.0

Il s'agit de la dernière version à l'heure d'écrire ces lignes

La possibilité de compiler GMP directement en compilant Gcc permet d'assurer les dépendances des différentes bibliothèques qui en dépendent, dont MPFR lorsque l'on tente de les compiler en même temps que Gcc.

Nous pourrons donc nous contenter de copier le dossier source de MPFR dans un sous dossier des sources de Gcc nommé mpfr


IV-A-3. MPC-0.8. "Dianthus deltoides"

Il s'agit de la dernière version à l'heure d'écrire ces lignes

Cette bibliothèque pourra également être compilée directement lors de la compilation de Gcc, grâce au fait que ses dépendances sont assurées.

Nous pourrons donc nous contenter de copier le dossier sources de MPC dans un sous dossier des sources de Gcc nommé mpc


IV-A-4. Binutils-2.20.51

La version reconnue comme stable de binutils par l'équipe de MinGW au moment d'écrire ces lignes est la version 2.20.51.  J'ai compilé le "snapshot du 5 septembre 2010 de cette version.


IV-A-5. GCC-4.6.0

La dernière version stable de GCC au moment d'écrire ces lignes est la version 4.5.1, cependant, j'ai réussi à compiler la version en cours de développement: la version 4.6.0


IV-B. Décompresser les sources

Commençons par décompresser l'ensemble des sources en lançant les commandes

$ tar -vxjf /c/download/binutils-2.20.51.tar.bz2
$ tar -vxjf /c/downloead/gcc-4.6.20100904.tar.bz2
$ tar -vxjf /c/download/gmp-5.0.1.tar.bz2
$ tar -vxjf /c/download/mpfr-3.0.0.tar.bz2
$ tar -vxzf /c/download/mpc-0.8.2.tar.gz
$ lzma -d /c/download/w32api-3.15-1-mingw32-src.tar.lzma
$ tar -vxf /c/download/w32api-3.15-1-mingw32-src.tar
$tar -vxzf /c/download/mingwrt-3.18-mingw32.tar.gz

IV-B-1. Comprendre les commandes

L'utilitaire tar est un utilitaire capable de gérer plusieurs formats d'archive, parmi lesquels les archives compressées au format bz2 ou au format gzip.

Outre le nom du fichier à décompresser, les arguments passés à la ligne de commande sont:

Vous pouvez évidemment placer les arguments dans l'ordre qu'il vous plait, les "coller" les uns aux autres comme je le montre ici, ou les séparer clairement, en n'oubliant pas de rajouter les tirait avant chaque argument, sous une forme proche de tar -v -x -z -f <nom de l'archive>

lzma est un utiltaire permettant de gérer un autre format d'archive, généralement considéré comme plus efficace que bzip ou gzip.

Outre le nom du fichier à décompresser, l'argument passé est d : decompress : indique que nous souhaitons extraire le contenu de l'archive


IV-B-1-a. Renommer le dossier de sources pour w32api
Lors de la compilation de mingw-runtime, le système recherchera un dossier nommé w32api dans le dossier parent à celui dans lequel se trouvent les sources.

Afin qu'il soit en mesure de les trouver, il est préférable de directement renommer le dossier w32api-3.15-1-mingw32 en w32api. Cela se fait à l'aide de la commande

$ mv w32api-3.15-1-mingw32 w32api

IV-B-1-b. Copier les sources de GMP, MPFR et MPC
Il est possible de faire en sorte que les bibliothèques GMP, MPFR et MPC dont dépend Gcc soient compilées directement pendant le processus de compilation de Gcc.

Il suffit pour ce faire de copier les sources de ces bibliothèques dans des dossiers au nom clairement établi : le nom de la bibliothèque sans précision de la version.

Plutôt que de commencer à compiler ces bibliothèques séparément, copions donc les dossiers qui nous intéressent avec les commandes

$ cp -r gmp-5.0.1 gcc-4.6-20100904/gmp
$ cp -r mpfr-3.0.0 gcc-4.6-20100904/mpfr
$ cp -r mpc-0.8.2 gcc-4.6-20100904/mpc
Cela permettra entre autres de faire en sorte que ces bibliothèques soient compilées à chaque stage de la compilation de Gcc.


IV-B-1-b-i. Comprendre la commande
La commande permettant de copier un fichier ou un répertoire sous linux est la commande cp.

Comme il s'agit de faire copier l'ensemble d'un répertoire, il faut ajouter le paramètre -r pour recursive.

Nous indiquons enfin le nom du dossier à copier ainsi que le nom du dossier de destination.


IV-B-1-b-ii. Corriger quelques fichiers
Avec les sources de Gcc que j'utilise pour cet article, je me suis retrouvé confronté à à l'impossibilié de créer une partie de la documentation, suite à l'absence de TeTex, dont résulte une erreur de compilation.

Pour contourner ce problème, il m'a fallu modifier le fichier ~/gcc-4.6.20100904/gcc/Makefile.in, aux alentours de la ligne 3731 en remplaçant le false; qui se trouve à cette ligne par true;

Le fichier original prend en effet la forme de

 
(entre les lignes 3717 et 3732 environ)
$(RUN_GEN) build/genhooks$(build_exeext) \
		$(srcdir)/doc/tm.texi.in > tmp-tm.texi
$(SHELL) $(srcdir)/../move-if-change tmp-tm.texi tm.texi
@if cmp -s $(srcdir)/doc/tm.texi tm.texi; then \
  $(STAMP) $@; \
elif test $(srcdir)/doc/tm.texi -nt $(srcdir)/doc/tm.texi.in \
  && test $(srcdir)/doc/tm.texi -nt $(srcdir)/doc/target.def; then \
  echo >&2 ; \
  echo You should edit $(srcdir)/doc/tm.texi.in rather than $(srcdir)/doc/tm.texi . >&2 ; \
  false; \
else \
  echo >&2 ; \
  echo Verify that you have permission to grant a GFDL license for all >&2 ; \
  echo new text in tm.texi, then copy it to $(srcdir)/doc/tm.texi. >&2 ; \
  false; \
fi
Et le fichier modifié devrait prendre la forme de

$(RUN_GEN) build/genhooks$(build_exeext) \
		$(srcdir)/doc/tm.texi.in > tmp-tm.texi
$(SHELL) $(srcdir)/../move-if-change tmp-tm.texi tm.texi
@if cmp -s $(srcdir)/doc/tm.texi tm.texi; then \
  $(STAMP) $@; \
elif test $(srcdir)/doc/tm.texi -nt $(srcdir)/doc/tm.texi.in \
  && test $(srcdir)/doc/tm.texi -nt $(srcdir)/doc/target.def; then \
  echo >&2 ; \
  echo You should edit $(srcdir)/doc/tm.texi.in rather than $(srcdir)/doc/tm.texi . >&2 ; \
  false; \
else \
  echo >&2 ; \
  echo Verify that you have permission to grant a GFDL license for all >&2 ; \
  echo new text in tm.texi, then copy it to $(srcdir)/doc/tm.texi. >&2 ; \
  true; \
fi
info Les corrections suivantes ne sont nécessaires que si vous souhaitez activer le support de Ada.

IV-B-1-b-ii--. Si vous voulez activer le support de Ada
L'un des principaux problèmes que l'on rencontrera au cours de la compilation est que la création de liens symboliques échoue sous MSYS, lors de la compilation de libada.

Pour résoudre ce problème, il suffira de modifier une seule variable.

Ainsi, il faudra rechercher la variable LN_S, qui est définie avec une valeur de @LN_S@, dans le fichier c:\msys\1.0\<votre nom>\src\gcc-4.2.1\gcc\libada\Makefile.in aux alentours de la ligne 43 et la modifier pour lui donner la valeur cp -r de manière à forcer la copie des fichiers plutôt que la création de liens symboliques.

Assez bizarrement les autres bibliothèques ne souffrent pas de ce problème.

De plus, avec les sources que j'ai récupérées, j'ai un problème pour la compilation de Ada dans le sens où un fichier propre à MinGW provoque une erreur:

Il s'agit du fichier g-socthi-mingw.adb se trouvant dans <dossier_source>/gcc/ada.

Entre les lignes 272 et 280, vous trouverez le code:

   function C_Recvmsg
     (S     : C.int;
      Msg   : System.Address;
      Flags : C.int) return System.CRTL.ssize_t
   is
      use type C.size_t;

      Fill  : constant Boolean :=
                (C.unsigned (Flags) and SOSC.MSG_WAITALL) /= 0;
      --  Is the MSG_WAITALL flag set? If so we need to fully fill all vectors
Le fait est que MSG_WAITALL est défini à -1 sous MinGW car il s'agit d'une valeur inexistante et que cette valeur ne peut décidément pas être considérée comme une valeur non signée.

La compilation échouera donc sous prétexte que la valeur est hors des limites admises.

Il faut donc modifier le code pour qu'il ressemble à

   function C_Recvmsg
     (S     : C.int;
      Msg   : System.Address;
      Flags : C.int) return System.CRTL.ssize_t
   is
      use type C.size_t;

      Fill  : constant Boolean :=
                SOSC.MSG_WAITALL /= -1
                and then(C.unsigned (Flags) and SOSC.MSG_WAITALL) /= 0;
      --  Is the MSG_WAITALL flag set? If so we need to fully fill all vectors
warning Ada ne supporte pas l'indentation sous forme de tabulation.  Vous devrez donc veiller à faire en sorte d'indenter le code à l'aide d'espaces uniquement.
 

Valid XHTML 1.0 TransitionalValid CSS!

Copyright © Philippe Dunski. Aucune reproduction, même partielle, ne peut être faite de ce site et 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.

Contacter le responsable de la rubrique C