Ceci est une ancienne révision du document !
Pouvoir compiler pour une autre architecture que la sienne ou comment faire de la compilation croisée
La compilation croisée ou «cross-compilation» en anglais permet de créer des exécutables depuis une certaine architecture pour une autre (Linux 32bits / 64bits mais aussi windows…). Cela permet de créer des paquets pour des systèmes que nous n'avons pas sous la main !
Pour cela, nous allons commencer par compiler… un compilateur ! Mais attention, il sera BRUT c'est-à-dire sans aucune bibliothèque. On pourra alors compiler le kernel Linux ou une bibliothèque. Exception : le compilateur pour Windows® existe en paquets, pas besoin de le re-compiler…
Prérequis
Avoir jeté un oeil sur la page traitant de la compilation standard : compilation.
Si vous vouler compiler pour Windows®, vous avez de la chance, tout existe en paquets : c'est le Mingw32. Il vous suffira de l'installer simplement. Rendez-vous à la rubrique utilisation…
Avoir téléchargé les sources de binutils et gcc. Prendre la dernière version ne devrait pas faire de mal.
Compilation du compilateur
Le compilateur comporte deux parties : les binutils et gcc. On commence avec les binutils qui comportent les outils de gestion comme ld ou ar.
Les binutils
Décompresser l'archive téléchargée précédemment et aller dans le dossier créé.
configuration
Configurer la compilation avec la commande :
configure --target=x86-64-pc-linux --disable-nls
qu'est le –disable-nls ?
L'option "target" permet de choisir l'architecture de destination. Ici on aura un compilateur pour l'architecture 64 bits. Remplacer le x86_64 par ce que l'on souhaite produire.
On peut utiliser l'option "prefix" pour configurer le dossier de base de l'installation mais étant donné que les exécutables créés seront tous précédés de l'architecture voulue, on peut tranquillement les mettre avec les autres sinon il faudrait configurer le PATH pour savoir où les chercher.
compilation
Il suffit de lancer la commande :
make all
installation
Avec les droits super-utilisateur si on veut installer dans les parties système (option "prefix") :
make install
gcc
Décompresser l'archive téléchargée précédemment et aller dans le dossier créé.
configuration
Configurer la compilation avec la commande :
configure --enable-languages=c --disable-nls --disable-threads --disable-shared --disable-checking --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --target=x86-64-pc-linux
qu'est le –disable-nls ?
L'option "target" permet de choisir l'architecture de destination. Ici on aura un compilateur pour l'architecture 64 bits. Remplacer le x86_64 par ce que l'on souhaite produire.
Si on veut le C++, il faut le rajouter aux langages, après c : –enable-languages=c,c++
compilation
Il suffit de lancer la commande :
make all-gcc
installation
Avec les droits super-utilisateur si on veut installer dans les parties système (option "prefix") :
make install-gcc
Voila, on devrait avoir un compilateur en état de marche…
Utilisation
Donner l'option "–arch=xxxxxx" où xxxxxx est le préfixe des commandes de compilateur à make. Dans l'exemple précédent, on aura donc : "–arch=x86_64". On peut aussi donner la variable d'environnement "CC=xxxxxx".
Le kernel
Exemple de ligne de commande pour compiler le kernel Linux où c'est plus compliqué si on veut utiliser make-kpkg :
sudo make-kpkg --initrd --arch=amd64 --cross_compile=x86_64-pc-linux --revision=amd64noyaujojo --append-to-version test kernel_image kernel_headers modules_image
En super-utilisateur pour créer le paquet (!). Ici on donne à arch la valeur "amd64" car ne compte que ce que les paquets acceptent comme architecture, non pas le préfixe des commandes à utiliser. On a pour cela recours à l'option "cross-compile" qui remplace l'habituelle "–arch".
Les autres options sont issues de la page traitant de la compilation du kernel.
Astuces
Rajouter l'option "-j X" à make pour compiler sur plusieurs processus à la fois par ex. pour un bicoeur : "-j 2".