Compilation croisée de Qt 5.15 pour Raspberry Compute Module 4 sur Ubuntu 20 LTS

Introduction

Voici un guide pour effectuer la compilation croisée de Qt 5.15.2 pour Raspberry Pi 4 et l'installation sur le Compute Module 4. Il s'agit d'une mise à jour de mon article de blog Qt sur le Raspberry Pi 4, mais j'utilise cette fois Raspberry Pi OS Lite (téléchargez ici : https://www.raspberrypi.org/software/operating-systems/), Qt Version 5.15.2 et comme ordinateur pour effectuer la compilation croisée : Ubuntu 20 LTS dans une machine virtuelle.

Sources

En plus de mon ancien article de blog (voir ci-dessus), j'ai également utilisé les sources suivantes :
- d'Uvindu Wijesinghe : https://github.com/UvinduW/Cross-Compiling-Qt-for-Raspberry-Pi-4

Raspberry Pi OS Lite

Installez Raspberry Pi OS Lite sur un Raspberry Pi 4 ou comme décrit dans mon article de blog Installer Raspberry Pi OS sur le Raspberry Compute Module 4, sur un Raspberry Compute Module 4.

Qt 5.15.2 sur Ubuntu 20 LTS

Après avoir installé Raspberry Pi OS sur le Compute Module et redémarré Raspberry à partir de la mémoire eMMC, il est temps d'installer le logiciel nécessaire sur le Raspberry et sur la machine Ubuntu.

Raspberry Compute Module 4

Les étapes montrées dans Branchement devraient également fonctionner sur un Raspberry Pi 4 « normal ».

Après avoir allumé le Pi 4, ouvrez le menu de configuration.

sudo raspi-config

Pour notre configuration, nous avons besoin de « SSH » et de « GL (Fake KMS) ». Pour ce faire, reéférez-vous aux deux captures d'écran suivantes.

SSH Konfiguration

FKMS Konfiguration

  • Entrez ensuite les sources de développement dans /etc/apt/sources.list. Pour ce faire, ajoutez la ligne suivante :
deb-src http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi
  • Actualisez ensuite le système avec les commandes suivantes :
sudo apt-get update
sudo apt-get dist-upgrade
sudo reboot
sudo rpi-update
sudo reboot
  • Puis installez les kit de développement et QT nécessaires :
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
  • Enfin, créez un répertoire pour RaspberryQt :
sudo mkdir /usr/local/qt5.15
sudo chown -R pi:pi /usr/local/qt5.15

Machine Ubuntu

La condition préalable est d'avoir un ordinateur ou une machine virtuelle où Ubuntu 20 LTS est déjà installé.
Premièrement, mettez à jour Ubuntu et installez les quelques bibliothèques requises :

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install gcc git bison python gperf pkg-config gdb-multiarch
sudo apt install build-essential

Ensuite, si elle n'existe pas encore, générez une clé ssh et installez-la sur le Raspberry afin que le mot de passe ne soit pas demandé à chaque rsync et que vous n'ayez pas à ressaisir le nom d'utilisateur et le mot de passe. Vous trouverez toutes les instructions nécessaires sur Internet pour le faire. C'est pourquoi je ne les décris pas en détail ici.

Créer la structure des répertoires pour les bibliothèques Raspberry

Pour les fichiers requis, je crée la structure de répertoires suivante sous Documents/Qt-CrossCompile-RaspberryPi/raspberrypi4 :

sudo mkdir ~/Documents/Qt-CrossCompile-RaspberryPi/raspberrypi4
sudo mkdir ~/Documents/Qt-CrossCompile-RaspberryPi/raspberrypi4/build
sudo mkdir ~/Documents/Qt-CrossCompile-RaspberryPi/raspberrypi4/tools
sudo mkdir ~/Documents/Qt-CrossCompile-RaspberryPi/raspberrypi4/sysroot
sudo mkdir ~/Documents/Qt-CrossCompile-RaspberryPi/raspberrypi4/sysroot/usr
sudo mkdir ~/Documents/Qt-CrossCompile-RaspberryPi/raspberrypi4/sysroot/opt
sudo chown -R 1000:1000 ~/Documents/Qt-CrossCompile-RaspberryPi/raspberrypi4
cd ~/Documents/Qt-CrossCompile-RaspberryPi/raspberrypi4

Télécharger les ressources Qt

Nous téléchargeons et décompressons les ressources Qt dans le répertoire raspberrypi4 :

sudo wget http://download.qt.io/archive/qt/5.15/5.15.2/single/qt-everywhere-src-5.15.2.tar.xz
sudo tar xfv qt-everywhere-src-5.15.2.tar.xz

À présent, nous devons légèrement modifier le fichier mkspec pour pouvoir l'utiliser avec notre compilateur. Pour ce faire, exécutez les commandes suivantes :

cp -R qt-everywhere-src-5.15.2/qtbase/mkspecs/linux-arm-gnueabi-g++ qt-everywhere-src-5.15.2/qtbase/mkspecs/linux-arm-gnueabihf-g++
sed -i -e 's/arm-linux-gnueabi-/arm-linux-gnueabihf-/g' qt-everywhere-src-5.15.2/qtbase/mkspecs/linux-arm-gnueabihf-g++/qmake.conf

Télécharger le compilateur croisé

J'utilise la version 7.4.1 de Linaro comme compilateur croisé. Pour ce faire, allez dans le répertoire Tools, puis téléchargez et décompressez le compilateur :

cd  tools
sudo 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

Nous avons maintenant besoin des bibliothèques originales de Raspberry Pi, que nous copions dans les répertoires Ubuntu avec rsync :

cd ..
rsync -avz --rsync-path="sudo rsync" --delete [email protected]:/lib sysroot/
rsync -avz --rsync-path="sudo rsync" --delete [email protected]:/usr/include sysroot/usr/
rsync -avz --rsync-path="sudo rsync" --delete [email protected]:/usr/lib sysroot/usr/
rsync -avz --rsync-path="sudo rsync" --delete [email protected]:/opt/vc sysroot/opt/

Il nous reste désormais à nettoyer les liens symboliques qui sont copiés par rsync, afin qu'ils dirigent vers les bons fichiers originaux. Pour ce faire, il y a un petit script Python à télécharger :

wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py

Ensuite, rendez le script exécutable et lancez-le :

sudo chmod +x sysroot-relativelinks.py
./sysroot-relativelinks.py sysroot

Compiler Qt

Nous pouvons maintenant configurer le build, puis le compiler.

cd build
../qt-everywhere-src-5.15.2/configure -release -opengl es2  -eglfs -device linux-rasp-pi4-v3d-g++ -device-option CROSS_COMPILE=~/Documents/Qt-CrossCompile-RaspberryPi/raspberrypi4/tools/gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- -sysroot ~/Documents/Qt-CrossCompile-RaspberryPi/raspberrypi4/sysroot -prefix /usr/local/qt5.15 -extprefix ~/Documents/Qt-CrossCompile-RaspberryPi/raspberrypi4/qt5.15 -opensource -confirm-license -skip qtscript -skip qtwayland -skip qtwebengine -nomake tests -make libs -pkg-config -no-use-gold-linker -v -recheck

Après quelques minutes, l'exécution du script doit être terminé et les conditions EGLFS suivantes doivent être définies ou être non définies.

QPA backends:
  DirectFB ............................... no
  EGLFS .................................. yes  [SHOULD BE YES]
  EGLFS details:
    EGLFS OpenWFD ........................ no
    EGLFS i.Mx6 .......................... no
    EGLFS i.Mx6 Wayland .................. no
    EGLFS RCAR ........................... no
    EGLFS EGLDevice ...................... yes  [SHOULD BE YES]
    EGLFS GBM ............................ yes
    EGLFS VSP2 ........................... no
    EGLFS Mali ........................... no
    EGLFS Raspberry Pi ................... no   [SHOULD BE NO]
    EGLFS X11 ............................ yes
  LinuxFB ................................ yes
  VNC .................................... yes

Si ce n'est pas le cas, ou si vous obtenez d'autres messages d'erreur, veuillez les examiner et les corriger. Si vous souhaitez exécuter à nouveau le script de configuration en changeant les variables, assurez-vous d'avoir supprimé au préalable le contenu du répertoire build.
Si tout est OK, exécutez les commandes make et make install.

make -j4
make install

Installer les fichiers compilés sur le Raspberry

Si la compilation a réussi, les fichier compilés qui se trouvent dans le répertoire qt5.15, peuvent être copiés sur le Raspberry Pi. Nous le refaisons avec la commande rsync.

rsync -avz --rsync-path="sudo rsync" qt5.15 [email protected]:/usr/local/

Configuration de QtCreator

Dans le prochain article de blog, j'expliquerai comment utiliser QtCreator pour l'utiliser avec les bibliothèques compilées.