installation simple et facile d'une chaine de compilation croisée sous Debian

L'avantage de Debian, c'est la grande cohérence qui existe dans l'obtention de paquets natifs, précompilés sur les serveurs de Debian,
ce qui permet avec apt-get install <paquet> de ne quasiment jamais rencontrer d'erreurs suite à un upgrade && update.

Exemple :

pour les astronomes amateurs, le logiciel stellarium s'installe sans encombre

# toutes les commandes en root

apt-get upgrade && sudo apt-get update
apt-get install stellarium


Un autre exemple précis et concret est l'obtention d'un compilateur croisée.

Une fois qu'on a compilé son noyau Vanilla avec l'aide d'outils comme buildroot,
on en vient immédiatement à vouloir compiler ses propres binaires pour l'architecture cible.

Il faut rappeler que la politique de Buildroot (actuellement) est de privilégier la compilation croisée :
le paquet gcc n'est pas fourni pour l'architecture cible (dommage..)

Voici les commandes à passer avec par exemple comme cible la Raspberry Pi 2 (soc : Broadcom Arm Cortex A7) :

# toutes les commandes en root
# rappel : armhf est l'architecture cible pour le Arm Cortex A7

cd /etc/apt/sources.list.d
touch cross.list
echo "deb http://emdebian.org/tools/debian jessie main" > cross.list
dpkg --add-architecture armhf
apt-get install curl
curl http://emdebian.org/tools/debian/emdebian-toolchain-archive.key | apt-key add -
apt-get update
apt-get install crossbuild-essential-armhf


on peut vérifier ensuite que le compilateur est bien installé :

which arm-linux-gnueabihf-gcc
# /usr/bin/arm-linux-gnueabihf-gcc


et finalement on peut voir de quel manière il a été construit

root@debian-host:/# /usr/bin/arm-linux-gnueabihf-gcc -v

Using built-in specs.
COLLECT_GCC=/usr/bin/arm-linux-gnueabihf-gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabihf/4.9/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: ../src/configure -v --with-pkgversion=' 4.9.2-10' --with-bugurl=file:///usr/share/doc/gcc-4.9/README.Bugs --enable-languages=c,c++,go,fortran,objc --prefix=/usr --program-suffix=-4.9 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.9 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libitm --disable-libquadmath --enable-plugin --with-system-zlib --enable-objc-gc --enable-multiarch --disable-sjlj-exceptions --with-arch=armv7-a --with-fpu=vfpv3-d16 --with-float=hard --with-mode=thumb --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=arm-linux-gnueabihf --program-prefix=arm-linux-gnueabihf-
Thread model: posix
gcc version 4.9.2 ( 4.9.2-10)


On remarque en particulier l'activation des threads posix, des flottants émulés côtés hard.
On peut alors compiler pour la raspi2, en modifiant la directive CC dans par exemple le Makefile de mon projet :

vi Makefile
...
ARCH    = armv7
PROJET    = astrokit
FICHIER    = astro
VERSION    = reel20
HOME    = /home/save
TARGET    = ${HOME}/target/${ARCH}
SRC    = ${HOME}/${PROJET}/src/${VERSION}
EPE    = ${SRC}/ephemerides
#CC    = gcc
#CC    = armv6-gcc
#CC    = /usr/local/bin/arm-linux-gnueabihf-gcc
CC    = /usr/bin/arm-linux-gnueabihf-gcc
INCS     = -I${TARGET}/include -I${TARGET}/include/lirc -I${SRC} -I${EPE}
LIBS    = -L${TARGET}/lib -L/home/save/kernel/lib -L/usr/lib -L${EPE} -lpthread -lm -lrt -llirc_client -lss
..

on compile :

root@debian-host:/home/save/astrokit/src/reel20# make clean ; make -j 4
[CC] astro.c
[CC] arguments.c
[CC] config.c
[CC] calculs.c
[CC] gpio.c
[CC] cat.c
[CC] i2c.c
[CC] ir.c
/usr/bin/arm-linux-gnueabihf-gcc astro.o arguments.o config.o calculs.o gpio.o cat.o i2c.o ir.o  -I/home/save/target/armv7/include -I/home/save/target/armv7/include/lirc -I/home/save/astrokit/src/reel20 -I/home/save/astrokit/src/reel20/ephemerides -o astroreel20 -L/home/save/target/armv7/lib -L/home/save/kernel/lib -L/usr/lib -L/home/save/astrokit/src/reel20/ephemerides -lpthread -lm -lrt -llirc_client -lss


on essaie d'exécuter sur le host, ce qui sort en échec, c'est normal on n'a pas copié le binaire sur la cible

root@debian-host:/home/save/astrokit/src/reel20# ./astroreel20
bash: ./astroreel20: cannot execute binary file: Erreur de format pour exec()


il faut le copier sur la cible (qui est connecté en DHCP sur le réseau local)

root@debian-host:/home/save/astrokit/src/reel20# arp-scan --localnet
Interface: wlan0, datalink type: EN10MB (Ethernet)
Starting arp-scan 1.8.1 with 256 hosts (http://www.nta-monitor.com/tools/arp-scan/)
192.168.1.1    6c:2e:85:34:1b:96    SAGEMCOM
192.168.1.14    b8:27:eb:cb:6e:b2    (Unknown)

2 packets received by filter, 0 packets dropped by kernel
Ending arp-scan 1.8.1: 256 hosts scanned in 1.606 seconds (159.40 hosts/sec). 2 responded

root@debian-host:/home/save/astrokit/src/reel20# scp -p ./astroreel20 192.168.1.14:/root
root@192.168.1.14's password:
astroreel20                                                                                          100%  435KB 434.5KB/s   00:01


on exécute sur la cible

root@debian-host:/home/save/astrokit/src/reel20# ssh 192.168.1.14 /root/./astroreel20
root@192.168.1.14's password:
..
CONFIG_AFFICHER_DATAS :     0 =            TEMPO_MENU 50000    
CONFIG_AFFICHER_DATAS :     1 =            TEMPO_RAQ  5000     
CONFIG_AFFICHER_DATAS :     2 =            TEMPO_IR   52000    
CONFIG_AFFICHER_DATAS :     3 =            TEMPO_CLAVIER 52000    
CONFIG_AFFICHER_DATAS :     4 =            TEMPO_CAPTEURS 52000

...

On vient de voir comment installer simplement une chaine de compilation croisée sous Debian
il existe bienentendu des compilateurs prêt à l'emploi qu'il faudra tester pour l'architecture que l'on souhaite (linaro, etc..)