Compilation de GCC 4 sous Windows


précédentsommairesuivant

III. Compilation

III-A. Les 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.

Création du dossier binutils
Sélectionnez

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 :

Configuration des binutils
Sélectionnez

../../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'en-tê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 librairies 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/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-standards, 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 librairies (fichiers .a), séparés par des :, même si le shell contient déjà une liste de répertoire où chercher les librairies à lier.

Ces quelques répertoires referment les entêtes de MinGW (pour pouvoir compiler sous Windows), et les entêtes système (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 librairies 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 :

Configuration du path
Sélectionnez

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

Compilation des binutils
Sélectionnez

make all

compile le tout, tandis que

Installation des binutils
Sélectionnez

make install

installe le tout, dès qu'il est compilé.

III-B. W32API

Même procédure, mêmes explications.

W32-api
Sélectionnez

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

MinGW Runtime
Sélectionnez

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

Same as usual, mais ne réjouissons-nous pas, cela va (trop) vite changer ... Vous pouvez, ici, changer le target, pour refléter au mieux votre configuration. Plus vous serez proches, 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 (Core 2, ...) powerpc : PowerPC, toutes variantes et compatibles sparc : SPARC, UltraSPARC, MicroSPARC, SuperSPARC et compatibles m68k : Amiga, Apollo et compatibles

GMP
Sélectionnez

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 librairie ne posera aucun problème particulier.

MPFR
Sélectionnez

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 librairies

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

GCC
Sélectionnez

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 librairies pour utiliser (facilement) les threads.

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 prennent 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 librairie 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 librairie GOMP (GNU OpenMP), une implémentation d'OpenMP pour GCC.

III-H-2. La compilation et l'installation

GCC
Sélectionnez

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 plate-forme (c'est-à-dire compatibles entre tous les OS), tandis que --exec-prefix s'occupe du répertoire des fichiers dépendants de la plate-forme.

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écuterons.

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

 
Sélectionnez

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 les 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 plate-forme 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 le linker gold au lieu de ld, sensé ê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 plate-formes 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 librairie 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 garbage collector dans le runtime GNU du langage Objective C.

Un garbage collector 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 build résultant 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 build 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 librairies.

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.

IV-D. MPFR

IV-D-1. --enable-warnings

Autorise la librairie à faire part de ses erreurs sur le flux stderr.

IV-D-2. --enable-decimal-float

Active les fonctions de conversion entre nombres décimaux à virgule flottante et les autres types.


précédentsommairesuivant

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

GCC et la compilation croisée
Compilation de GCC 4 sous Windows
Cross-compilation avec GCC 4 sous Windows pour Linux
Cross-compilation de Qt4
  

Copyright © 2008 Thibaut Cuvelier. 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.