IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Compilation croisée 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 compilateur croisé. 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 compilateur croisé et sa compilation ne fonctionnera pas (sauf par GCC 4.4.0).

Les fils d'exécution ne sont plus activés : en compilation croisée, 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 compilateurs croisés 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 problème supplémentaire.)
Des tests lents et méthodiques vous feront parvenir à un point où vous pourrez localiser le problème ou devenir fou. Peut-être les deux.
(extraits des 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 (le guide pour GCC 4.3 peut être utile).

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. Ça 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. Bibliothèque standard

Que contient une bibliothèque standard ? Simplement, toutes les fonctions standard 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 effectuez une compilation croisée vers une plateforme embarquée, préférez une des bibliothèques standard suivantes, plus légères et plus optimisées pour ces plateformes : dietlibc, µcLibC, Contiki, NewLib, KLibC [ftp://ftp.kernel.org/pub/linux/libs/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 bibliothèque que vous voulez utiliser. Sauf exception, toutes les bibliothèques 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 bibliothèque 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 bibliothèques ?

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

Il est même recommandé d'utiliser ces bibliothèques compilées avec un compilateur natif, car celui-ci 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

Copyright © 2009 Thibaut Cuvelier. Aucune reproduction, même partielle, ne peut être faite de ce site ni 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.