Compilation de GCC 4 sous Windows


précédentsommairesuivant

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 quelques 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 plate-forme (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 plate-forme (B), que vous utilisez pour construire un compilateur pour cette plate-forme (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 (non-compressés, ou alors vous avez plus qu'une vie devant vous pour compiler le tout ...).

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

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

Depuis MinGW, la win32api, le mingwrt, les binutils ainsi que le gcc-core, et 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 du 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 librairie GMP suffit, avec MPFR (anciennement distribué avec GMP : allez voir sur http://www.mpfr.org/).

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 garanti aucunement que vos exécutables seront plus stables, plus optimisés ... !

II-B. L'installation

MSYS s'installe facilement : double-clique sur l'exécutable téléchargé, mettez-le vers la racine (genre c:\mingw\msys ou c:\msys, mais pas d'espace permis dans le chemin d'installation !). Cependant, à un moment, on vous parle de post-installation : 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 que informations diverses, n'y faites pas impérativement attention.

GCC, aussi, s'installe facilement : extrayez le gcc-core, le gcc-c++ et le 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'oeil 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
Sélectionnez

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épertoires intermédiaires avant le script configure et ainsi de suite, pour toutes les librairies à compiler.

II-B-3. Le path

Le path contient tous les chemins vers les fichiers exécutables. Configurez-le en saisissant, dans MSYS :

Configuration du path
Sélectionnez

path=$path:/gcc/bin

II-B-4. Les 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 (*.patch) et appliquez-les avec ces commandes, dans MSYS, en étant ce répertoire : (1)

Configuration du path
Sélectionnez

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
Sélectionnez

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
Sélectionnez

LN = @LN@
LN_S = @LN_S@

par

/work/src/gcc/Makefile.in
Sélectionnez

LN = cp
LN_S = cp

En fait, lors de la compilation de la librairie standard, make essayera de créer des liens symboliques, mais Windows ne les aime pas beaucoup et ceci force la copie, beaucoup plus appréciée par l'OS de Redmond.

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
Sélectionnez

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


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.