Cross-compilation (emdebian) utilisant des libs externes

Salut,

Comme d’hab je me sers du forum comme bloc-notes, en espérant que ça serve à d’autres. :wink:
J’ai eu un peu de mal à trouver l’info au départ vu que je n’utilisais pas les bons mots-clés (même si, au final, c’était bien sur le Wiki officiel Debian :blush:) donc vu que j’ai un peu de temps pour souffler je la reproduis ici pour augmenter les chances de la retrouver facilement, avec mes mots à moi.

Problème 1 : cross-compiler un programme sur votre machine x86 ou amd64, pour une architecture différente.

Solution 1 : facile, ajouter emdebian.org/ dans les dépôts :

deb http://www.emdebian.org/debian/ squeeze mainaptitude install emdebian-archive-keyring aptitude update
Attention, certaines versions des compilateurs ne sont disponibles que dans testing ou unstable, à vous de voir précisément ce qu’il vous faut (voir ici emdebian.org/crosstools.html).
Installez la toolchain qui va bien pour votre architecture cible (exemple au hasard : g+±4.7-arm-linux-gnueabi).
À partir de là, arm-linux-gnueabi-g+±4.7 foobar.cpp (adapter selon l’archi bien sûr) compilera votre programme (g+±4.7-arm-linux-gnueabihf / arm-linux-gnueabihf-g+±4.7 pour armhf etc etc).

Problème 2 : c’est là que ça se corse : c’est bien gentil de pouvoir compiler un programme simple, mais dans la vraie vie y’a des dépendances envers des librairies externes, et là ça marche pas directement (ça sert à rien d’installer les paquets -dev sur votre machine, ils ne seront pas reconnus par la cross-toolchain).

Solution 2 : installer xapt (wheezy/sid uniquement, non présent dans squeeze). Ce programme permet de télécharger, construire et installer des paquets pour la cross-compilation. Mnémotechnique : xapt = cross-apt.
Utilisation : xapt -a armel -m libTRUC-dev libMACHIN-dev … qui va vous installer les paquets libTRUC-dev-armel-cross libMACHIN-dev-armel-cross et toutes les dépendances nécessaires.
Explication : -a spécifie l’architecture cible de la cross-compilation (armel, armhf, …), -m transforme les paquets multiarch (nouvelle norme, que je ne suis pas arrivé à faire marcher, voir ci-après) en paquets -cross (ancienne norme, ce que je décris ici).
Après ça votre arm-linux-gnueabi-g+±4.7 foobar.cpp -lTRUC -lMACHIN fonctionnera correctement.

Je n’ai pas compris : le multiarch. :open_mouth: C’est censé fonctionner de manière transparente mais ça n’est pas le cas, en tous cas pas avec les toolchains emdebian. Si vous savez comment cross-compiler en utilisant le multiarch au lieu de xapt n’hésitez pas à expliquer comment. :slightly_smiling:

Voir le wiki
C’est en 2 (ou 3) étapes :

dpkg --add-architecture armhf
(configurer le sources.list, étape facultative pour Debian)
apt-get install g++-4.7-arm-linux-gnueabi:armhf

EDIT
Toujours d’après le wiki, le support multiarch pour emdebian est en cours, pas sûr que ça fonctionne donc.