I. Introduction▲
I-A. Gcc, qu'est-ce que c'est?▲
Gcc est l'acronyme de GNU Compilers Collection. Il s'agit en fait d'une collection qui regroupe des compilateurs supportant de nombreux langages, tels que le C, le C++, l'ObjectiveC, l'ObjectiveC++, le Treelang (un langage expérimental dont la principale raison d'être est de servir de support au développement de GCC), l'Ada, le FORTRAN et même 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 d'exécutables sous Windows (Portable Executable) est très différent de ceux qui sont utilisés sous linux. Il faut donc ajouter le support de ce format a GCC pour qu'il soit capable de générer des programmes exécutables sous cet OS et de lier des biliothèques.
Le but du projet est, tout simplement, de fournir cette adaptation de GCC sous windows.
I-C. GNU..., mais c'est linux?▲
Effectivement, GNU (Gnu's Not Unix) est principalement associé à linux. Et c'est sans doute ce qui fait que GCC évolue si rapidement: En effet, les versions en développement de GCC apportent déjà le support d'une partie au moins de la prochaîne norme de C++ (C++0x) qui n'est pourtant pas attendue, par les plus optimistes, avant 2009.
Ce qui explique aussi dans une certaine mesure que les mainteneurs de MinGW aient autant de mal à garder les versions aussi à jour que ce qui existe sous linux.
I-D. Pourquoi compiler les sources?▲
Les raisons qui pourraient vous faire décider de compiler les sources de GCC sont multiples:
D'abord, la dernière version considérée comme stable de GCC au moment d'écrire ces lignes est la version 4.2.1, alors que cette version n'est encore estampillée que "prévue" sous MinGW, pour qui, la version stable est encore la version 3.4.5 de la collection.
De plus, il est posible de disposer d'un "snapshot" hebdomadaire de la version de développement, et certains pourraient être intéressés par le fait d'en profiter.
Enfin, il faut savoir que les versions binaires de MinGW sont généralement compilées de manière à être fonctionnelles sur la plupart des processeurs: "au mieux", sous de vieux Pentium II, "au pire" avec d'antiques 3x86.
Nombreux sont ceux qui pourraient, tout simplement, souhaîter disposer d'un compilateur optimisé pour l'ordinateur dont ils disposent.
I-E. Pourquoi MinGW et non cygwin?▲
Deux raisons m'ont fait choisir une compilation sous MinGW plutôt que sous cygwin:
La première est que cygwin est un émulateur linux qui fournit un compilateur croisé pour windows, et qu'il nécessite donc une optique de travail plus "orientée" vers linux. Vous me direz sans doute que vous devrez de toutes manières passer par un émulateur linux pour le compiler, mais cela pourra rester votre seule expérience sous cet environnement si vous le souhaîtez, alors que vous devriez y retourner chaque fois que vous voudriez compiler sous cygwin.
La deuxième tient tout simplement au fait que la bibliothèque dynamique cygwin.dll est fournie sous licence GNU/GPL, et que toute utilisation de cette bibliothèque vous forcerait à... créer des applications sous licence GNU/GPL.
Bien qu'étant personnellement fort attaché à la licence GNU/GPL, je peux concevoir que ce ne soit pas le cas de tout le monde. C'est la raison pour laquelle j'ai décidé de fournir un compilateur natif qui vous permette de choisir votre propre licence selon vos propres goûts en la matière.
I-F. Deux passes de compilations▲
L'un des principaux problèmes rencontrés lorsque l'on souhaite recompiler un compilateur et les différents outils qui s'y rattachent (assembleur, éditeur de liens, ...) est que nous avons à gérer des dépendances croisées entre ces outils: Il est impossible de compiler l'assembleur ou l'éditeur de liens sans avoir de compilateur, mais le compilateur a besoin de l'assembleur et de l'éditeur de liens pour fournir un exécutable fini.
Et, tant qu'à faire, il est intéressant de disposer des outils compilés avec la version du compilateur utilisé ainsi que du compilateur créé grâce aux outils utilisés.
Le problème est absent si l'on souhaite simplement optimiser les outils pour une architecture donnée, mais, si l'on souhaîte compiler une autre version, il se pose clairement.
C'est la raison pour laquelle la méthode que je vous propose va donc effectuer la compilation de certais éléments deux temps (six mouvements en tout):
- Installer une version utilisable du compilateur et des outils
- Compiler les outils indispensables (assembleur, éditeur de liens, ...) avec le compilateur fonctionnel
- Compiler les bibliothèques indispensables en veillant à utiliser les outils fraichement compilés
- Compiler le compilateur en utilisant les outils indispensables fraîchement compilés. Le système de compilation de GCC fera qu'il sera compilé plusieurs fois, et donc, il sera au final compilé automatiquement avec les versions correctes.
- Compiler une deuxième fois bibliothèques dépendant du système avec ces premières compilation des outils
- Recompiler les outils indispensables pour qu'ils le soient en utilisant la dernière version du compilateur, des outils et des bibliothèques dépendantes du système