Compilation de GCC 4 sous Windows

Thibaut Cuvelier

Un guide pour la compilation de GCC 4 sous Windows. Ceci détaille la compilation de GCC 4.3.2.

N'hésitez pas à commenter cet article !
Commentez

- Titre : Compilation de GCC 4 sous Windows

- Auteur : Thibaut Cuvelier

- Parution : 14 décembre 2008

- Mise à jour : 19 août 2020

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

Sommaire

- I. Introduction

- I-A. GCC, qu'est-ce ?

- I-B. MinGW, qu'est-ce que c'est ?

- I-C. Pourquoi MinGW et non Cygwin ?

- I-D. Et les outils UNIX pour Windows 6 ?

- I-D-1. Historique

- II. Préparation de l'environnement

- II-A. Les outils

- II-A-1. Pourquoi ne pas compiler les sources de MinGW ?

- II-B. Installation

- II-B-1. fstab

- II-B-2. Extraction

- II-B-3. PATH

- II-B-4. Patchs

- II-B-5. Versions testées

- II-B-6. Arborescence finale

- II-C. Remarque sur MSYS

- III. Compilation

- III-A. binutils

- III-A-1. ../../src/binutils/

- III-A-2. configure

- III-A-3. --prefix=/gcc

- III-A-4. --target=i386-pc-mingw32

- III-A-5. --program-prefix=""

- III-A-6. --with-libpath=/mingw/mingw32/lib:/mingw/lib:/usr/local/lib:/lib:/usr/lib

- III-A-7. --with-gcc --with-gnu-as --with-gnu-ld

- III-A-8. --disable-shared --disable-nls

- III-A-9. \

- III-A-10. La suite

- III-B. W32API

- III-C. MinGW Runtime

- III-D. LibIconv et LibIntl

- III-E. GMP

- III-E-1. --target

- III-E-2. --enable-fat

- III-F. MPFR

- III-G. Finalisation des bibliothèques

- III-H. GCC himself

- III-H-1. La configuration

- III-H-1-a. Quelques explications ?

- III-H-1-a-i. --enable-threads

- III-H-1-a-ii. --enable-languages=c,c++,ada,fortran,objc,treelang

- III-H-1-a-iii. --disable-win32-registry --without-x

- III-H-1-a-iv. --enable-libstdcxx-debug

- III-H-1-a-v. --with-gmp=/gcc --with-mpfr=/gcc

- III-H-1-a-vi. --with-gomp

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

- IV. Options supplémentaires pour la configuration

- IV-A. Généralités

- IV-A-1. Concernant les répertoires d'installation

- IV-A-2. Concernant le nom des programmes

- IV-A-3. Concernant les OS

- IV-A-4. Concernant les drapeaux

- IV-A-4-a. Le compilateur C

- IV-A-4-b. Le compilateur C++

- IV-A-4-c. Les anciens binutils

- IV-A-4-d. M4

- IV-B. Les binutils et GCC

- IV-B-1. -enable-gold

- IV-B-2. --enable-libada

- IV-B-3. --enable-libssp

- IV-B-4. --enable-stage1-languages

- IV-B-5. --enable-objc-gc

- IV-B-6. --enable-bootstrap

- IV-B-7. --enable-maintainer-mode

- IV-B-8. --enable-stage1-checking

- IV-B-9. --enable-werror

- IV-B-10. --with-gmp et --with-mpfr

- IV-C. GMP

- IV-C-1. --enable-assert

- IV-C-2. --enable-cxx

- IV-C-3. --enable-fft

- IV-C-4. --enable-mpbsd

- IV-C-5. --enable-profiling

- IV-C-6. --enable-fat

- IV-C-7. --with-readline

- IV-D. MPFR

- IV-D-1. --enable-warnings

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

- V. Utilisation de bibliothèques compilées pour Visual Studio

- VI. Divers

- VI-A. Remerciements

- VI-B. Voir aussi

I - Introduction

Ce guide ne peut pas vous assurer à 100 % que vous réussirez à compiler GCC, mais toutes les procédures effectuées ici ont fonctionné dans mon cas : il y a donc beaucoup de chances qu'il fasse de même pour vous.

Il y a peu de chances que vous arriviez à réussir cette procédure depuis Windows 64 bits, vu que le support, souvent expérimental, du 64 bits, a été ajouté à GCC 3.4. Il n'est donc sûrement pas assez stable et/ou fonctionnel pour pouvoir compiler GCC nativement depuis une plateforme aussi ancienne. Dans le prochain article, vous apprendrez à cross-compiler pour Linux : la méthode est comparable pour Win64.

I-A - GCC, qu'est-ce ?

GCC est l'acronyme de GNU Compilers Collection et GNU est l'acronyme récursif de GNU's Not Unix. Il s'agit, en fait, d'une collection de compilateurs, composée de nombreux langages : le C, le C++, l'Objective C, l'Objective C++, le Treelang, l'Ada, le Fortran et le Java.

Il fournit en outre les différentes bibliothèques standard pour ces langages.

I-B - MinGW, qu'est-ce que c'est ?

MinGW est l'acronyme de MINimalist Gcc for Windows.

Le format de fichiers exécutables sous Windows, le Portable Executable, est très différent des formats linuxiens (a.out, ELF, Mach-O…). Il faut donc permettre le support de ce format à GCC, pour qu'il puisse générer des exécutables pour Windows, ainsi que de lier des bibliothèques. Tel est le but de MinGW.

I-C - Pourquoi MinGW et non Cygwin ?

Cygwin est un émulateur Linux qui fournit un compilateur croisé pour Windows et nécessite donc une orientation plus linuxienne.

Ainsi, votre seule expérience Linux nécessaire sera la compilation du compilateur, pas forcément toute compilation. Ceci est très profitable aux (anciens) utilisateurs du DOS, vu qu'ils ne devront pas se souvenir de toute différence entre la console Linux et le DOS.

I-D - Et les outils UNIX pour Windows 6 ?

En effet, depuis quelque temps, Microsoft met à la disposition des utilisateurs un pack Utilities and SDK for Subsystem for UNIX-based Applications (alias SUA). On ne peut l'utiliser que sur Windows Vista Entreprise ou Intégrale, ou sur Windows 2008 (mais pas une installation core), ou bien sur Windows Server 2003 R2.

Cependant, il vous sera impossible de l'utiliser. Pourquoi ? Vous aurez besoin d'une version de GNU make, or Microsoft ne la met pas à disposition. Vous aurez besoin du compilateur GNU GCC, or Microsoft ne la propose pas.
Il vous faudra donc utiliser cette méthode afin d'avoir GCC 4 puis de vous confectionner un cross-compilateur pour cette plateforme (signalons-le, parfaitement compatible POSIX, vu le manque d'envie général de la firme pour respecter la moindre norme), afin de pouvoir compiler un compilateur natif dessus.
Un travail de bénédictin !

Pour info, ce genre d'opération s'appelle la cross-compilation canadienne. Vous compilez un cross-compilateur, qui se lancera sur votre système (A), pour une autre plateforme (B), que vous utilisez pour construire un compilateur pour cette plateforme (B) ou une autre (C).

I-D-1 - Historique

Ce développement du produit a commencé en 1996 sous le nom d'OpenNT, par Softway Systems, Inc. En 1998, il a été renommé en Interix.

Microsoft a acheté la société en 1999, mais a continué à distribuer Interix (2.2) jusqu'en 2002, en tant que produit indépendant.

La version 3 est devenue un composant des Services for Unix (SFU), en 2002. Les deux produits sont devenus très liés et leurs numéros de versions sont restés identiques jusqu'en janvier 2004, où il a été intégré à la distribution normale de Windows. Désormais, Interix est connu sous le nom de Subsystem for UNIX-based Applications (SUA).

II - Préparation de l'environnement

Avant de commencer la compilation proprement dite, il nous faudra quelques outils et les sources (bien évidemment).

Vérifiez aussi que vous avez assez d'espace disque disponible : pas moins de 2,77 Go auront été dévorés par la compilation de GCC (avec les fichiers temporaires, les téléchargements, les sources et les binaires créés). Soyez prévoyants et réservez à l'opération 5 Go.

II-A - Les outils

Il vous faudra les télécharger, soit à partir de GnuWin32 (http://sourceforge.net/project/showfiles.php?group_id=23617), soit à partir du site de MinGW (http://sourceforge.net/project/showfiles.php?group_id=2435), soit à partir du site de la GNU (ftp://ftp.easynet.be/gnu/ [ftp://ftp.easynet.be/gnu/]).

Depuis GnuWin32, les paquets bison, flex ainsi que les bibliothèques libiconv et libintl sont requises. Prenez les binaires uniquement. http://sourceforge.net/project/showfiles.php?group_id=23617

Depuis MinGW, win32api, mingwrt, binutils ainsi que gcc-core, gcc-c++ et gcc-ada si vous prévoyez l'emploi de ces langages, les binaires et les sources. Vous pouvez vous passer des sources de gcc-core de MinGW, celles de GNU fonctionnent très bien. Prenez aussi MSYS, une émulation du shell Linux pour Windows (base system et supplementary-tools, uniquement les binaires les plus récents, le reste ne nous intéresse pas).

Une installation antérieure pourrait fonctionner, mais ce n'est pas sûr (et je ne l'ai pas testé). C'est pourquoi je vous recommande chaudement de réinstaller un MinGW tout beau, tout propre.

Depuis GNU, la bibliothèque GMP suffit, avec MPFR (anciennement distribué avec GMP).

II-A-1 - Pourquoi ne pas compiler les sources de MinGW ?

Tout simplement parce que les sources disponibles sur ce site sont très souvent en retard d'une à cinq versions, ce qui peut se révéler gênant dans certains cas. En plus, ce retard ne vous garantit aucunement que vos exécutables seront plus stables, plus optimisés… !

II-B - Installation

MSYS s'installe facilement : double-cliquez sur l'exécutable téléchargé, mettez-le vers la racine (comme c:\mingw\msys ou c:\msys, mais aucun espace n'est permis dans le chemin d'installation !). Cependant, à un moment, on vous parle de postinstallation : acceptez sans crainte, mais répondez par la négative si on vous demande si vous avez déjà installé GCC, le contraire pourrait amener à des conflits. Le reste n'est qu'informations diverses, n'y faites pas impérativement attention.

GCC, aussi, s'installe facilement : extrayez gcc-core, gcc-c++ et gcc-ada dans le même répertoire, toujours proche de la racine (par exemple, c:\mingw).

Si vous n'avez jamais touché à un shell Linux ou à la console de Windows, vous devriez aller jeter un coup d'œil sur l'un des tutoriels disponibles en fin d'article, pour apprendre les bases du maniement de ce système.

II-B-1 - fstab

Qu'est-ce qui peut se cacher derrière un nom aussi barbare ? En gros, un fichier de raccourcis. Une entrée dans celui-là vous permet d'écrire (sous MSYS uniquement !) /win au lieu de /c/windows. On pourrait le comparer avec le système de DNS, qui attribue au nom developpez.com une adresse impossible à retenir : 87.98.130.52.

Il se situe dans le répertoire etc du dossier d'installation de MSYS. Éditez-le et ajoutez les lignes suivantes :

/etc/fstab

c:/gcc/msys        /msys
c:/gcc            /gcc
c:/mingw            /mingw
c:/work            /work

À adapter, bien évidemment, à votre système et aux répertoires dans lesquels vous avez installé les différents programmes. Le répertoire gcc correspond à l'actuel GCC, tandis que mingw renvoie au compilateur que nous allons compiler. Créez dans le dossier work les répertoires src et build, qui contiendront, respectivement, les sources et les fichiers temporaires de la compilation.

II-B-2 - Extraction

Extrayez chaque archive de sources dans son propre dossier, de telle sorte que GMP se situe dans le dossier /work/src/gmp/ et qu'il n'y ait plus de répertoire intermédiaire avant le script configure et ainsi de suite, pour toutes les bibliothèques à compiler.

II-B-3 - PATH

La variable d'environnement path contient tous les chemins vers les fichiers exécutables. Configurez-la en saisissant, dans MSYS :

Configuration du path

path=$path:/gcc/bin

II-B-4 - Patchs

Pour que GCC se compile sans problème, il faut patcher préalablement les sources. Téléchargez ces trois patchs dans le répertoire de GCC (concept-check.patch, delegating-constructors.patch, libstdc++-v3-tr1-mingw.patch) et appliquez-les avec ces commandes, dans MSYS, en étant dans ce répertoire :

Configuration du path

patch -p0 < concept-check.patch
patch -p0 < delegating-constructors.patch
patch -p0 < libstdc++-v3-tr1-mingw.patch

Ensuite, dans le répertoire /work/src/binutils/bfd/doc/, ouvrez le fichier Makefile.in et remplacez tout son contenu avec ceci :

/work/src/binutils/bfd/doc/Makefile.in

info:
all:
install:

En fait, lors de la compilation, make essayera de compiler de la documentation, mais … sans en avoir les sources ! Ceci l'empêche d'essayer de compiler cette documentation.

Ensuite, dans le répertoire /work/src/gcc/, ouvrez le fichier Makefile.in et, aux alentours de la ligne 80, remplacez

/work/src/gcc/Makefile.in

LN = @LN@
LN_S = @LN_S@

par

/work/src/gcc/Makefile.in

LN = cp
LN_S = cp

En fait, lors de la compilation de la bibliothèque standard, make essayera de créer des liens symboliques, mais Windows ne les aime pas beaucoup et cette configuration force la copie.

Ensuite, dans le répertoire /work/src/gcc/gcc, ouvrez le fichier Makefile.in et, aux alentours de la ligne 4110, commentez la cible install-headers-tar: et real-install-headers-tar: de cette manière :

/work/src/gcc/gcc/Makefile.in

# Install the include directory using tar.
install-headers-tar: stmp-int-hdrs $(STMP_FIXPROTO) install-include-dir
# We use `pwd`/include instead of just include to problems with CDPATH
# Unless a full pathname is provided, some shells would print the new CWD,
# found in CDPATH, corrupting the output.  We could just redirect the
# output of `cd', but some shells lose on redirection within `()'s
#    (cd `${PWD_COMMAND}`/include ; \
#     tar -cf - .; exit 0) | (cd $(DESTDIR)$(libsubdir)/include; tar xpf - )
#    (cd `${PWD_COMMAND}`/include-fixed ; \
#     tar -cf - .; exit 0) | (cd $(DESTDIR)$(libsubdir)/include-fixed; tar xpf - )
# /bin/sh on some systems returns the status of the first tar,
# and that can lose with GNU tar which always writes a full block.
# So use `exit 0' to ignore its exit status.

[...]

# Targets without dependencies, for use in prev-gcc during bootstrap.
real-install-headers-tar:
#    (cd `${PWD_COMMAND}`/include-fixed ; \
#     tar -cf - .; exit 0) | (cd $(DESTDIR)$(libsubdir)/include-fixed; tar xpf - )

En fait, GCC se configure avec de vieilles versions de tar, qui ne prennent pas le même nombre d'arguments…

II-B-5 - Versions testées

- Binutils 2.19 MinGW

- LibGMP 4.2.4

- LibMPFR 2.3.2

- LibIconv 1.9.2-1 (version précompilée de GnuWin32)

- LibIntl 0.14.4 (version précompilée de GnuWin32)

- GCC 4.3.2 (version GNU)

- MinGW Runtime 3.15.1

- Win32 API 3.12

II-B-6 - Arborescence finale

Arborescence finale

II-C - Remarque sur MSYS

MSYS supporte le copier-coller, depuis et vers d'autres applications.

Pour copier, sélectionnez à la souris du texte, puis faites Alt+C. Cependant, cette manœuvre peut effacer tout le contenu de l'écran.

Pour coller, faites Maj+clic gauche.

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.

Création du dossier binutils

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

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

Configuration du path

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

make all

compile le tout, tandis que

Installation des binutils

make install

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

III-B - W32API

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

W32-api

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

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

GMP

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.

MPFR

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

GCC

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

GCC

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.

IV-D - MPFR

IV-D-1 - --enable-warnings

Autorise la bibliothèque à 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.

V - Utilisation de bibliothèques compilées pour Visual Studio

Vous avez besoin d'une bibliothèque, prévue pour Visual Studio uniquement, comme DirectX ? Vous pouvez utiliser de tels fichiers .lib avec GCC, mais pas directement : il faut les convertir en .a. Comment faire ?

Dans un terminal (n'importe lequel : que ce soit un shell DOS ou UNIX, tant que le PATH est correctement configuré, avec le chemin de MinGW), lancez cette commande :

reimp -c filename.lib

Si l'utilitaire n'est pas trouvé, installez le paquet mingw-utils.

Copiez les fichiers .a dans votre répertoire /lib (par exemple, C:\MinGW\lib). Copiez le répertoire d'includes dans votre répertoire /include (par exemple, C:\MinGW\include).
Et voilà ! C'est fait ! Lancez la compilation avec cette nouvelle bibliothèque !

Si MinGW se plaint de ne pas trouver le fichier .a, faites attention aux conventions de nommage de bibliothèques de GNU : toute bibliothèque commence par lib ! Par exemple, le drapeau -liberty lie avec le fichier libiberty.a.

VI - Divers

VI-A - Remerciements

Un tout grand merci à yan, Alp, Gorgonite, Bbil pour leurs encouragements, les idées, et leurs remarques constructives, ainsi que toute l'équipe C et C++ !
Sans oublier RideKick pour sa relecture.

VI-B - Voir aussi

Le site qui a mis à disposition les quelques fichiers de patch que je mets à votre disposition :

- How to build GCC with MinGW (désormais mort)

Quelques autres sites intéressants sur la compilation de GCC :

- Guide de la Compilation de Gcc sous windows avec MinGW

- CrossGCC Frequently Asked Questions

Les logiciels et bibliothèques compilés ou utilisés ici :

- GCC et sa documentation

- MinGW et MSYS

- binutils

- libiconv

- libiconv et gettext

- GMP

- MPFR

- GNUWin32

Quelques autres tutoriels qui vous permettront d'approfondir certains points :

- Mode d'emploi de GCC

- Introduction à Makefile

- Garbage-collector simple ou progressif

Les quelques technologies ou pratiques employées ou présentées et leurs articles encyclopédiques :

- OpenMP

- GOMP, l'implémentation de OpenMP pour GCC

- GCC

- MinGW et MSYS

- binutils

- Gold

- libintl et gettext

- libiconv

- GMP

- MPFR

- GNU Win32

- ELF

- PEF

- Mach-O

- PE

- sed

- Le bootstrapping

- La sortie de Gold

- Utilities and SDK for Subsystem for UNIX-based Applications in Microsoft Windows Vista RTM/Windows Vista SP1 and Windows Server 2008 RTM et Utilities and Software Development Kit (SDK) for Subsystem for UNIX-based Applications in Microsoft Windows Server 2003 R2, parties du projet Windows Services for UNIX, ainsi que l'article dédié