2016-12-05-miniatureAprès avoir réalisé une chaîne de compilation en C pour le Rasberry Pi sous ArchLinux il y a deux semaines, je vous invite à explorer la cross-compilation C++ sous Debian avec un IDE dédié. Cela me permettra de créer et compiler des programmes directement sur le Raspberry Pi.
On verra également comment on peut déboguer le programme à distance sur le Raspberry Pi. Nous aurons ainsi un environnement de développement dédié à la configuration et à la création de programme sur notre système embarqué 🙂

Cette première partie traitera l’installation de Debian, l’installation des outils de cross-compilation, l’installation et la configuration du Raspberry Pi ainsi que la cross-compilation manuelle d’un Hello-World !

 

Quel est l’objectif de ce tuto ? Pourquoi passer sur Debian et dévier de ArchLinux ?

L’objectif de ce tuto est de permettre à tous ceux qui passeront par ici de découvrir, comme moi, le monde de la cross-compilation pour systèmes embarqués. J’avais en effet réalisé un tuto concernant la cross-compilation en C ArchLinux à Raspberry Pi (Raspbian), afin de pouvoir entre autre, tester la distribution ArchLinux et réaliser de la cross-compilation sur Raspberry Pi.

Cependant, ayant l’habitude des distributions type Ubuntu, Raspbian, Debian, Mint, j’ai été vite perdu sur ArchLinux. La distribution des paquets s’effectue sur des dépôts bien différents aux dépôts habituels, ce qui implique des paquets différents, avec des noms différents à la plupart des distributions Linux ! Cela ne correspond donc pas à la majorité de la documentation disponible sur le net. Le monde de la cross-compilation et des systèmes embarqués est un domaine restreint de l’informatique. La plupart des tutos, articles et vidéos trouvés sur le World Wide Web s’effectuent sur des distributions Ubuntu ou Debian. Ayant déjà testé les deux systèmes, je vais m’orienter sur Debian qui est la distribution la plus proche à la distribution Raspbian présente sur le Raspberry Pi.

Revenons-en à l’objectif. Nous allons créer un environnement de programmation complet sur une machine, afin de cross-compiler facilement des applications en C++ sur le Raspberry Pi.

Si vous avez déjà une distribution linux de prête (Ubuntu, Mint, Debian… ou tout autre dérivée de Debian), vous pouvez déjà passer au chapitre 2 :-).

1.    Installation de Debian (x64)

Vous pouvez récupérer l’image CD ou DVD de Debian ici : https://www.debian.org/distrib/

Pour ma part, j’ai choisi l’image d’installation en DVD (image d’installation complète – DVD 1) que j’ai téléchargé en 64 bits avec un client bittorrent.

C'est parti pour le téléchargement !

C’est parti pour le téléchargement !

Ensuite, je grave l’image DVD et je boot sur ma machine. On peut également installer Debian sur une machine virtuelle (Pour ma part, je préfère bosser sur une machine de développement dédiée Unix).

Perso, je grave avec CD BurnerXP, mon partenaire depuis... Windows XP

Perso, je grave avec CD BurnerXP, mon partenaire depuis… Windows XP

Adieu ArchLinux, bonjour Debian !

Adieu ArchLinux... ;-(

Adieu ArchLinux… ;-(

Bonjour Debian ! :-)

Bonjour Debian ! 🙂

J’installe Debian en utilisant le mode graphique d’installation (Graphical install).

Choix de la langue

Choix de la langue

L’installation se poursuit normalement, avec le choix de la langue, du clavier…

Je procède à l’installation normalement, en utilisant les paramètres recommandés. Je me connecte au wifi afin d’obtenir les dernières mises à jour Debian.

Connexion au réseau wifi

Connexion au réseau wifi

Puis vient la configuration du nom de la machine, du nom de domaine (j’ai laissé le champ vide) et du nom de l’utilisateur principal, avec les mots de passe associés.

Les personnes qui ont lu cet article ont aussi lu :  Overclocker son Raspberry Pi : Le guide complet

Je partitionne mon disque de manière automatique sur une seule partition. On bien, bien entendu séparer la partition /home de la partition système (plus flexible en cas de réinstallation ou de débogage système). Je ne m’embête pas, si problème il y a je ferai des sauvegardes régulières.

Partitionnement automatique du disque (oui, oui, il m’a foutu 17 GB de swap ^^)

Partitionnement automatique du disque (oui, oui, il m’a foutu 17 GB de swap ^^)

Une fois le disque partitionné, tous les fichiers nécessaires seront installés. Vient ensuite le choix de l’environnement graphique :

Pour ma part, ce sera Gnome !

Pour ma part, ce sera Gnome !

Ensuite, on installe GRUB sur le disque principal.

Installation du GRUB

Installation du GRUB

Et enfin l’installation se termine !

1-9-fin-de-linstallation

Enfin ! 🙂

Le PC redémarre, et tadaaa !!! 🙂

1-10-premier-demarrage-de-debian

Premier démarrage de Debian 8 sous Gnome !

Je recommande ensuite d’afficher les icônes sur le bureau Debian grâce à l’outil de personnalisation afin d’avoir un accès direct au dossier /home.

Cette astuce nous sera utile... un jour..

Cette astuce nous sera utile… un jour..

Nous avons donc maintenant un système Debian prêt à accueillir notre futur environnement de développement ! 🙂

2. Installation de la chaîne de cross-compilation

Attaquons-nous dorénavant au nerf de la guerre, la chaîne de compilation amd64 / i386 vers armhf !

Avant tout, assurez-vous bien de commenter la source du DVD dans la listes de sources (/etc/apt/sources.list) pour apt-get.

source.list de aptitude

source.list de aptitude

Tout d’abord, nous aurons besoin de la commande sudo pour la suite, installons donc ce bon vieux sudo !

su (pour se loguer en admin)
apt-get install sudo

 

Installation du bon vieux sudo des familles :-)

Installation du bon vieux sudo des familles 🙂

Ensuite on peut enchaîner avec les trois commandes suivantes :

sudo apt-get install build-essential
sudo dpkg –add-architecture armhf
dpkg –print-foreign-architectures

 

« Build-essential » contient tous les paquets nécessaires compilation en C et C++. La commande dpkg –add-architecture armhf permet de rajouter l’architecture ARM Hard Float au système, ainsi votre système saura qu’il pourra charger des librairies pour cette architecture. Ensuite –print-foreign-architectures affiches les différentes architectures processeurs prisent en charge par la gestion des paquets. Si armhf est la première architecture que vous ajoutez, vous devriez voir s’afficher « armhf » à la suite de cette dernière commande.

2-3-build-essentials

2-4-dpkg

Ensuite, il va falloir récupérer les différents paquets nécessaires à la cross-compilation. Ces paquets ne sont pas disponibles sur le dépôt officiel de Debian 8 (jessie) par défaut (contrairement à Debian 7 Wheezy à l’époque). Nous allons donc ajouter un fichier crosstools.list dans  /etc/apt/sources.list.d/ avec comme dépôt deb les dossier « jessie » et « main » de http://emdebian.org/tools/debian/.

Voici la commande toute faite :

sudo echo “deb http://emdebian.org/tools/debian/ jessie main” > /etc/apt/sources.list.d/crosstools.list

 

On doit également rajouter une ligne dans le fichier /etc/apt/sources.list afin de résoudre un problème de dépendances :

sudo echo “deb http://ftp.debian.org/debian/ unstable main” >> /etc/apt/sources.list

 

2-5-sources-curl

Installation de Curl et de la clé

Ensuite on installe Curl, qui nous permettra d’ajouter la clé nous permettant d’activer le dépôt de toolchain.

sudo apt-get install curl
curl http://emdebian.org/tools/debian/emdebian-toolchain-archive.key | sudo apt-key add –

 

L’étape suivante est très importante. C’est ici que l’on ordonne à notre gestionnaire de paquet de prendre en compte toutes les modifications précédentes !

sudo apt-get update

 

Ensuite, vous pouvez installer les outils de cross-compilation armhf :

sudo apt-get install crossbuild-essential-armhf

 

Si jamais cela ne fonctionne pas et que vous tombez sur des dépendances incompatibles pouvant nuire au système, ne continuez surtout pas l’installation ! (Je l’avais fait une 1ère fois, l’installation a touché au noyau, et ça de manière pas très propre… j’ai dû réinstaller complètement Debian pour ce tuto…).

2-6-probleme

Ici, ne cherchez en aucun moyen de forcer l’installation

Pour pallier aux problèmes, entrer la commande suivante :

echo “APT::Default-Release \”jessie\”;” > /etc/apt/apt.conf.d/20defaultrelease

 

Les personnes qui ont lu cet article ont aussi lu :  [PiRobot] Partie 7.5 - Retour caméra dans l'application !

Cela rajoute une préférence pour les paquets « Jessie ». Ensuite réessayez l’installation :

sudo apt-get install crossbuild-essential-armhf

 

2-7-solution

Ça fonctionne !

Si le compilateur C++ existe pour armhf sur le système, on peut le tester avec la commande :

arm-linux-gnueabihf-g++ -v

 

2-8-test

Bon, passons aux choses sérieuses avec un petit test sur notre machine source, écrivons un petit Hello World ! 🙂

Hello World de BASE (en C++)

Hello World de BASE (en C++)

Une fois enregistré, il faudra compiler (ou plutôt cross-compiler, hihi ^^) notre programme. Pour se faire on va tout d’abord créer un fichier « hello.o ». En effet, le compilateur compile chaque fichier d’un programme en fichier *.o. Ensuite les *.o sont compilés en un seul et même programme grâce à l’édition de liens. Je rentrerai un jour un peu plus dans les détails dans un article dédié.

Pour cela, rentrez les commandes suivantes :

arm-linux-gnueabihf-g++ -O3 -g3 -Wall -c -o “hello.o” “hello.cpp”
arm-linux-gnueabihf-g++ -o “hello” hello.o

 

Vous pouvez toujours essayer de le lancer (./hello), cela ne fonctionnera pas, car votre machine source n’est pas armhf.

Pour vérifier la destination machine de l’application, effectuez :

file hello

 

Youhouuu ! :-)

Youhouuu ! 🙂

 

Afin de clore nos différents outils « console » à installer, je rajoute gdb-multiarch pour le debug (voir chapitre 6 de cet article !).

sudo apt-get install gdb-multiarch

 

Et voilà ! Nous avons notre chaîne de cross-compilation de prête en C++. On a même une chaîne disponible en C (gcc), en Fortran (gfortran), en Objective C (gobjc), en Go (gccgo). Il suffit juste de remplacer le suffixe pour la cross-compilation :

arm-linux-gnueabihf-<suffixe>

 

3. Installation et configuration du Raspberry Pi

Afin de faire le test de l’application « hello », il faudra copier l’application sur une machine cible. Pour se faire, on va prendre le Raspberry Pi 2 Modèle B se trouvant sur le PiRobot. Ayant une distribution Raspbian Wheezy d’installée dessus, j’ai préféré réinstaller le système avec la dernière monture : Raspbian Jessie (distribution basée sur Debian 8, adaptée au Raspberry Pi).

Pour ce faire, rien de plus simple, je vous renvoie à cette page officielle : https://www.raspberrypi.org/downloads/raspbian/

3-1-download-raspbian-for-raspberry-pi

Pour ma part, j’ai choisi la version « Lite », qui est plus adaptée au PiRobot. Attention : aucun serveur d’affichage n’est prévu sur la version « Lite ». Console only ! Vous pouvez bien sûr en installer un par la suite !

Ensuite on copie avec Win32 Disk Imager…

3-2-win32-disk-imager

Puis on peut démarrer Raspbian sur le Raspberry ! Utilisateur : pi. Mot de passe : raspberry.
Note : le clavier configuré par défaut est en qwerty. Si le mot de passe ne passe pas, tapez « rqspberry ».

Ensuite on configure notre matériel grâce à la commande :

sudo raspi-config

Je ne m’attarde pas sur cette partie que j’ai déjà traité avec le WebServer sur Raspberry Pi.

Sur cette nouvelle monture de Raspbian, la configuration du réseau et du wifi est devenue beaucoup plus simple. Il y a deux fichiers à modifier :

Dans /etc/wpa_supplicant/wpa_supplicant.conf (à la fin du fichier)

network={

ssid=”Votre SSID”

psk=”Votre mot de passe Wifi”

}

 

Et pour configurer une addresse IP statique (c’est mieux ^-^). Dans /etc/dhcpcd.conf (au début du fichier)

interface eth0 => sur port Ethernet

interface wlan0 => sur wifi

static ip_address=Votre_adresse_IP_Raspberry/24

static routers=Adresse_IP_routeur_réseau

static domain_name_servers= Adresse_IP_routeur_réseau

 

Ensuite, on peut revenir sur notre machine source afin de copier notre programme en ssh sur le Raspberry grâce à la commande scp :

scp hello pi@IP_Raspberry:/home/pi/hello

 

Ensuite, connectons-nous en ssh au Raspberry Pi :

ssh –p 22 pi@IP_Raspberry

 

On est maintenant connecté. Le terminal contrôle le Raspberry. On peut vérifier que le fichier hello est bien présent (commande ls) et lancer avec ./hello.

Le programme se lance ! Un grand pas pour petit développeur que je suis ! : -)

Le programme se lance ! Un grand pas pour petit développeur que je suis ! : -)

Maintenance que l’on sait compiler manuellement un petit programme en C++, le transférer sur notre machine cible, le Raspberry Pi, il nous reste plus qu’à installer et configurer notre environnement de développement final afin de pouvoir développer, exécuter et débuguer des programmes bien plus complets !

Je vous donne rendez-vous dans 2 jours pour la suite avec l’installation et la configuration de l’IDE Eclipse !

Ressources :

HackADay – Code Craft : Cross Compiling for the Raspberry Pi

Debian Wiki – CrossToolchains

MS-Cheminformatics

BenTeK.

Pin It on Pinterest

Shares
Share This