Cross-compilation avec GCC 4 sous Windows pour Linux


précédentsommairesuivant

II. La compilation

II-A. Les binutils

Rendez-vous dans le dossier /work/build et créez-y un dossier binutils, entrez-y.

 
Sélectionnez
../../src/binutils/configure \
--prefix=/cross --target=i586-pc-linux-gnu \
--program-prefix="" \
--with-lib-path=/gcc/mingw32/lib:/gcc/lib:/usr/local/lib:/lib:/usr/lib \
--with-gcc --with-gnu-as --with-gnu-ld --disable-nls --disable-shared \
--disable-boostrap

Vous pouvez activer le support de GOLD, mais je ne l'ai pas testé.

N'oubliez surtout pas la dernière option, qui va empêcher GCC de se recompiler de lui-même, vu que Windows ne peut exécuter des exécutables Linux (ELF, a.out, ...).

La configuration peut sembler se bloquer pendant deux ou trois minutes au niveau de checking how to compare bootstrapped objects... cmp --ignore-initial=16 $$f1 $$f2.
Ceci n'est pas parfaitement normal dans le cas d'un compilateur natif, mais bien dans le cas d'un cross-compilateur. Attendez et ça ira ...

 
Sélectionnez
make all
make install

II-B. GCC

Rendez-vous dans le dossier /work/build et créez-y un dossier gcc, entrez-y.

 
Sélectionnez
../../src/gcc/configure \
--prefix=/cross --target=i586-pc-linux-gnu \
--program-prefix="" \
--with-gcc --with-gnu-ld --with-gnu-as \
--disable-threads --disable-nls  \
--enable-languages=c,c++,ada,objc,treelang \
--disable-win32-registry --disable-shared --without-x \
--enable-interpreter --enable-libstdcxx-debug \
--with-gmp=/gcc --with-mpfr=/gcc --with-gomp \
--disable-boostrap

Le Fortran n'est pas supporté dans un cross-compilateur et sa compilation ne fonctionnera pas (sauf par GCC 4.4.0).

Le support des threads n'est plus activé : en cross-compilation, GCC requiert les POSIX Threads, qui ne sont, ni fournis, ni compilables sous Windows, à cause d'une implémentation POSIX très lacunaire (sauf par des cross-compilateurs stables, comme ceux que vous obtiendrez en fin d'article).

 
Sélectionnez
make all
make install

II-C. En cas d'énormes problèmes : la compilation de GCC 4.4.0 SVN

Si votre problème n'apparaît pas ici en bas, ou bien si aucune solution n'est disponible, essayez de passer à GCC 4.4.0.

N'oubliez pas ceci :
Quand un compilateur accepte un programme sans erreur du premier coup, le programme ne fournira pas le résultat attendu !
There's always one more bug. (Il y a toujours un bug supplémentaire)
Des tests lents et méthodiques vous feront parvenir à un point où vous pourrez localiser le bug, ou devenir fou. Peut-être les deux
(extraits de les Lois de Murphy).

Vous devrez passer par le protocole SVN. Les informations nécessaires sont disponibles sur le site de GCC. Choisissez la branche trunk. Avant de configurer, resynchronisez. Avant de compiler, resynchronisez. À chaque erreur, resynchronisez, puis voyez le guide ci-dessous (le guide pour GCC 4.3 peut être utile, mais pas forcément fonctionnel !) Si vous voyez une erreur qui n'est pas précisée et que vous y trouvez un patch (fonctionnel, c'est tout ce qu'il doit être), envoyez-le moi (ainsi qu'à la communauté GCC, s'il est de qualité suffisante et propre).

Chaque resynchronisation peut amener à une reconfiguration, partielle ou complète, ou à la suppression d'un patch (seulement si le fichier est modifié en amont).

Au niveau des aménagements du configure, ne pourrez compiler que le C et le C++, les autres nécessitant bien beaucoup d'aménagements, impossibles à réaliser, selon les différentes communautés.

 
Sélectionnez
../../src/gcc/configure \
--prefix=/cross --target=i586-pc-linux-gnu \
--program-prefix="" \
--with-gcc --with-gnu-ld --with-gnu-as \
--disable-threads --disable-nls  \
--enable-languages=c,c++ \
--disable-win32-registry --disable-shared --without-x \
--enable-interpreter --enable-libstdcxx-debug \
--with-gmp=/gcc --with-mpfr=/gcc --with-gomp \
--disable-boostrap

Puis :

 
Sélectionnez
make all
make install

II-D. Ca ne va toujours pas ?

Après avoir patiemment essayé GCC 4.3.2 puis 4.4.0 SVN, vous n'avez toujours rien ? Changez de crèmerie ! Essayez GCC 3.4.6 (ou 3.4.5) !

Cependant, il est probable que le programme gen-modes.exe soit extrêmement lent à lancer, il produira un fichier de 2,5 Go (plus ou moins, on n'est plus à dix mébioctets près ...).

Vous devriez aussi essayer cette version si vous avez un absolu besoin de stabilité pour votre compilateur ; En effet, la branche 3 a été commencée en 2001 : en la choisissant, vous vous ouvrez à huit années de débogage ! Tandis que la branche 4 est encore plus récente : 2005, encore plus de bugs (en théorie).

Si tout ceci ne fonctionne toujours pas (oui, c'est possible et pas forcément improbable), essayez MinGW 4.3.0 (GCC, mais porté sur Win32). Les commandes restent (comme toujours) inchangées, mais vous devez désactiver le support de l'OpenMP.

 
Sélectionnez
../../src/gcc/configure \
--prefix=/cross --target=i586-pc-linux-gnu \
--program-prefix="" \
--with-gcc --with-gnu-ld --with-gnu-as \
--disable-threads --disable-nls  \
--enable-languages=c,c++ \
--disable-win32-registry --disable-shared --without-x \
--enable-interpreter \
--with-gmp=/gcc --with-mpfr=/gcc \
--disable-boostrap --disable-libssp

Suivi de :

 
Sélectionnez
make all
make install

II-E. La librairie standard

Que contient une librairie standard ? Simplement, tous les includes standards du C. Le C++ est désormais intégré à G++ via libstdc++-v3.

Commencez par créer un nouveau répertoire libc dans votre répertoire /work/build et extrayez dans son homologue source la dernière version de la GNU LibC.

Si vous cross-compilez vers une plateforme embarquée, préférez une des librairies standard suivantes, plus légères et plus optimisées pour ces plateformes : dietlibc, µcLibC, Contiki, NewLib, KLibC.
Préférez KLibC pour une utilisation dans un initramfs et µLibC pour les autres cas. Les autres bibliothèques, non présentées, sont nettement moins utilisées.
Au lieu d'extraire l'archive précisée en haut, utilisez celle de la librairie que vous voulez utiliser. Sauf exception, toutes les librairies se compilent avec les mêmes commandes, seule la configuration peut changer.

II-E-1. GNU LibC

Pour configurer, utilisez cette commande du nouveau /work/build/libc.

 
Sélectionnez
/work/src/libc/configure \
--prefix=/cross \
--with-binutils=/cross \
--host=i586-pc-linux-gnu \
--enable-versioning

Puis compilez et installez d'un simple

 
Sélectionnez
make all && make install

II-E-2. Newlib

 
Sélectionnez
/work/src/libc/configure --prefix=/cross --host=i586-pc-linux-gnu

La configuration peut prendre autant de temps que la compilation de GCC !

II-E-3. µClibc

Extrayez directement dans le répertoire de compilation : la librairie ne supporte pas autre chose.

Pour configurer :

 
Sélectionnez
make menuconfig || make config || make oldconfig

Ici, sélectionnez toutes les options (pour une utilisation pour un système non-embarqué), et précisez l'hôte : i586-pc-linux-gnu. Pour l'embarqué, sélectionnez les options nécessaires et uniquement celles-là.

II-E-4. µClibc++

 
Sélectionnez
make menuconfig
make
make install

Choisissez les options par défaut, elles conviennent presque toujours.

II-E-5. Apache StdCxx

 
Sélectionnez
cd /work/src/stdcxx
make \
	BUILDDIR=/work/build/stccxx \
	BUILDTYPE=12d \
	CONFIG=gcc.config
make install \
	PREFIX=/cross

II-E-6. STLPort

 
Sélectionnez
configure --prefix=/cross \
--target=i586-pc-linux-gnu

II-F. Devra-t-on recompiler toutes les librairies ?

Vous pourrez directement réutiliser toutes les librairies construites pour Linux, tant que le compilateur qui s'en est occupé utilise le format ELF et soit en 32 bits (ou bien, corresponde aux choix réalisés sur la cible).

Il est même recommandé d'utiliser ces librairies compilées avec un compilateur natif, car celui-ci est, par définition, plus optimisé (parce que plus optimisable) qu'un cross-compilateur. Il produit donc des binaires de meilleure qualité que le second, mais il n'est pas toujours utilisable (sur une console de jeu portable, par exemple, il est très dur de lancer un shell pour compiler quoi que ce soit ...).


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