table des matières
Installer la chaîne de compilation croisée sur Debian 12
- source : https://www.interelectronix.com/fr/qt-515-compilation-croisee-pour-raspberry-compute-module-4-sur-ubuntu-20-lts.html
Contexte testé :
- QtCreator 12 licence commerciale (académique)
- 31/01/2024 : RPi2B avec raspbian bookworm lite (debian 12)
- 07/02/2024 : RPi3B avec raspbian bookworm lite (debian 12)
Install sur Rasberry (cible)
- intaller et configurer raspbian-lite (version console allégée de raspbian). Dernière mouture en 01/2024 : bookworm (Debian 12)
- boot console
- service ssh actif
- display GL/Fake KMS (choix non dispo sur RPi2)
- Ajouter les sources dans les paquetages .deb : éditer le fichier /etc/apt/sources.list et décommenter la ligne suivante :
deb-src http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi
- mettre à jour
sudo apt-get update
sudo apt-get upgrade
- installer les paquets nécessaires pour Qt5 et le débogage distant
sudo apt-get build-dep qt5-qmake
sudo apt-get build-dep libqt5gui5
sudo apt-get build-dep libqt5webengine-data
sudo apt-get build-dep libqt5webkit5
sudo apt-get install libudev-dev libinput-dev libts-dev libxcb-xinerama0-dev libxcb-xinerama0 gdbserver
Noter la VERSION de Qt installée, et utiliser le même N° pour le reste des installations.
Ici, j’ai installé la 5.15.8. Le cas échéant modifier les commandes subséquentes avec le N° de version approprié.
- Créer ensuite un répertoire pour les librairies Qt qui seront utilisées par les applis développées ultérieurement
sudo mkdir /usr/local/qt5.15
sudo chown -R pi:pi /usr/local/qt5.15
install sur PC Linux (poste de développement)
- Installer les paquet requis pour le développement sous Qt
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install gcc git bison gperf pkg-config gdb-multiarch
sudo apt-get install python-is-python3
sudo apt install build-essential
- Installer Qt Creator version commerciale/education (https://www.qt.io/qt-educational-license )
- on prépare une arborescence pour l’installation de la chaîne de cross compilation dans l’environnement de travail
mkdir ~/raspi
cd ~/raspi
mkdir build
mkdir tools
mkdir sysroot
mkdir sysroot/usr
mkdir sysroot/opt
Télécharger les ressources Qt
- qt-everywhere est un paquetage qui permet le ciblage de Qt sur différentes plateformes, dont les différentes versions de Raspberry
wget https://download.qt.io/archive/qt/5.15/5.15.8/single/qt-everywhere-opensource-src-5.15.8.tar.xz
tar xvf qt-everywhere-opensource-src-5.15.8.tar.xz
- Modif de qmake.conf (qmake.conf doit être modifié pour désigner le bon cross-compilateur)
cp -R qt-everywhere-src-5.15.8/qtbase/mkspecs/linux-arm-gnueabi-g++ qt-everywhere-src-5.15.8/qtbase/mkspecs/linux-arm-gnueabihf-g++
sed -i -e 's/arm-linux-gnueabi-/arm-linux-gnueabihf-/g' qt-everywhere-src-5.15.8/qtbase/mkspecs/linux-arm-gnueabihf-g++/qmake.conf
- Télécharger le cross-compilateur et outils associés
cd tools
wget https://releases.linaro.org/components/toolchain/binaries/7.4-2019.02/arm-linux-gnueabihf/gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabihf.tar.xz
tar xfv gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabihf.tar.xz
Rsync des bibliothèques Raspberry
- on effectue une copie locale des bibliothèques installées sur le raspberry.
- L’@ du RPi utilisé ici est 192.168.17.34. Adapter selon le contexte.
cd ~/raspi
rsync -avz --rsync-path="sudo rsync" --delete pi@192.168.17.34:/lib sysroot/
rsync -av --rsync-path="sudo rsync" --delete pi@192.168.17.34:/usr/include sysroot/usr/
rsync -avz --rsync-path="sudo rsync" --delete pi@192.168.17.34:/usr/lib sysroot/usr/
rsync -avz --rsync-path="sudo rsync" --delete pi@192.168.17.34:/opt/vc sysroot/opt/
- Télécharger et exécuter le script de création des liens relatifs
wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py
chmod +x sysroot-relativelinks.py
./sysroot-relativelinks.py sysroot
Compilation de Qt
Configuration de la fabrication :
- Pour info, la liste des cibles disponibles peut être obtenue ainsi :
ls qt-everywhere-src-5.15.8/qtbase/mkspecs/devices/
- la commande
configure
permet de préparer le makefile pour la fabrication de Qt. - l’option
-device
doit être adaptée selon le modèle de raspberry utilisé.- Exemple de configuration pour cible Raspberry Pi 2 :
cd build
../qt-everywhere-src-5.15.8/configure -release -opengl es2 -eglfs -device linux-rasp-pi2-g++ -device-option CROSS_COMPILE=~/raspi/tools/gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- -sysroot ~/raspi/sysroot -prefix /usr/local/qt5.15 -extprefix ~/raspi/qt5.15 -opensource -confirm-license -skip qtscript -skip qtwayland -skip qtwebengine -nomake tests -make libs -pkg-config -no-use-gold-linker -v -recheck
Fabrication
make -j4
(c’est long - on a le temps de prendre un café, voire plusieurs !) Si pas d’erreur, on continue ainsi :
make install
- Maintenant, Qt est compilé et installé dans le répertoire local
~/raspi/qt5.15
, et configuré pour le répertoire distant sur le raspberry/usr/local/qt5.15
Installer les fichiers compilés sur le Raspberry
cd ~/raspi
rsync -avz --rsync-path="sudo rsync" qt5.15 pi@192.168.17.34:/usr/local/
Configurer Qt Creator pour la compilation croisée
- source https://www.interelectronix.com/fr/qt-515-compilation-croisee-pour-raspberry-compute-module-4-sur-ubuntu-20-lts.html
Créer un Périphérique
- Créer un périphérique de type Linux Distant
Ajouter les Compilateurs gcc et g++ pour raspberry
- spécifier les chemins des exécutables dans les outils de cross-compil téléchargés (
~/raspi/tools/gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabihf/bin/
)
Ajouter le débogueur gdb-multiarch
/usr/bin/gdb-multiarch
Options de déboguage
Par défaut, le débogueur n’a pas accès aux symboles des librairies Qt. Il faut lui indiquer explicitement le chemin.
- ajouter la commande attachée
set solib-search-path ~/raspi/qt5.15/lib
Créer une version Qt
- indiquer le chemin de la commande
qmake
dans le Qt installé pour la cross compil
Créer un kit pour la cross compilation Raspberry
Paramètres à affecter :
- Type de périphérique : Linux distant
- Périphérique sur lequel exécuter : (Raspberry Pi précédemment créé)
- Compiler le périphérique : Local PC (-> indique que les sources sont sur le PC local)
- Racine du système : le dossier sysroot utilisé
- Version de Qt : le Qt installé pour la cross compil
- Débogueur : gdb-multiarch
Configuration du Raspberry pour le déploiement distant
Par défaut qtcreator déploie les applications dans le dossier /opt
sur le raspberry.
Comme le déploiement s’effectue sous l’identité ‘pi’, il faut que l’utilisateur ‘pi’ ait les droits de créer des fichiers dans le dossier /opt/ (sinon, cela crée une erreur lorsque qrcreator tente de déployer l’exécutable sur le raspberry)
pi@raspberrypi:~ $ sudo chown pi /opt/
Créer un projet dans Qtcreator
- Créer une application Qt avec le Modèle Périphérique Linux Distant
- Sélectionner le Kit Raspberry Pi Qt
Créer une application graphique native
Qt permet de créer des applications graphiques qui interfacent directement la carte graphique grâce au mode d’affichage EGLFS.
Cela permet d’éviter toutes les surcouches de XWindows, gestionnaire de fenêtres et autres environnements de bureau. C’est adapté à la réalisation de véritables applications embarquées.
Le version de Qt que nous avons compilée utilise EGLFS par défaut.
Configuration du Raspberry
- si nécessaire reconfigurer avec
raspi-config
pour démarrer le RPi en mode console - Installer OPENGL
sudo apt install mesa-utils
Configuration de l’écran dans l’application
- Ajouter (et adapter éventuellement) les lignes suivantes en début de main() :
qputenv("QT_QPA_EGLFS_INTEGRATION", "eglfs_kms");
qputenv("QT_QPA_EGLFS_WIDTH", "1024");
qputenv("QT_QPA_EGLFS_HEIGHT", "600");