HMI
Qt 5.15 in kruiscompilatie voor de Raspberry Compute Module 4 op Ubuntu 20 LTS

Inleiding

Dit is een handleiding voor het cross-compileren van Qt 5.15.2 voor de Raspberry Pi 4 en de installatie op de Compute Module 4. Het is een update op mijn blogartikel Qt op de Raspberry Pi 4, met het verschil dat ik deze keer Raspberry Pi OS Lite (download hier: https://www.raspberrypi.org/software/operating-systems/), Qt-versie 5.15.2 en Ubuntu 20 LTS als kruiscompilatiecomputer in een virtuele machine gebruik.

Bronnen

Naast mijn oude blogartikel (zie hierboven) heb ik ook de volgende bronnen gebruikt: - van Uvindu Wijesinghe: https://github.com/UvinduW/Cross-Compiling-Qt-for-Raspberry-Pi-4

Raspberry Pi OS Lite

Installeer Raspberry Pi OS Lite op een Raspberry Pi 4 of, zoals beschreven in mijn blogartikelRaspberry Pi OS op de Raspberry Compute Module 4 installeren, op een Raspberry Compute Module 4.

Qt 5.15.2 op Ubuntu 20 LTS

Nadat Raspberry Pi OS op de Compute Module is geïnstalleerd en de Raspberry opnieuw opstart vanaf de eMMC-opslag, is het tijd om de benodigde software op de Raspberry en op de Ubuntu-machine te installeren.

Raspberry Compute Module 4

De hierna getoonde stappen zouden ook moeten werken op een "normale" Raspberry Pi 4.

Roep na het inschakelen van de Pi 4 het configuratiemenu op.

sudo raspi-config

Voor onze configuratie hebben we "SSH" en "GL (Fake KMS)" nodig. Zie hiervoor de twee volgende screenshots.

SSH Konfiguration

FKMS Konfiguration

  • Voer vervolgens development sources toe in /etc/apt/sources.list. Voeg de volgende regel toe:
deb-src http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi
  • Breng vervolgens het systeem up-to-date met de volgende opdrachten:
sudo apt-get update
sudo apt-get dist-upgrade
sudo reboot
sudo rpi-update
sudo reboot
  • En installeer vervolgens de vereiste Qt- en ontwikkelingspakketten:
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
  • Creëer vervolgens een map voor RaspberryQt:
sudo mkdir /usr/local/qt5.15
sudo chown -R pi:pi /usr/local/qt5.15

Ubuntu-machine

Een pc of een virtuele machine met Ubuntu 20 LTS geïnstalleerd is vereist. Breng allereerst Ubuntu up-to-date en installeer enkele vereiste libraries:

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

Genereer vervolgens, als deze nog niet bestaat, een ssh-sleutel en installeer deze op de Raspberry, zodat er niet bij elke rsync een wachtwoordvraag verschijnt en de gebruikersnaam en het wachtwoord moeten worden ingevoerd. Hiervoor zijn voldoende instructies op internet, zodat ik een gedetailleerde beschrijving hier achterwege kan laten.

Mapstructuur voor de Raspberry-libraries creëren

Voor de benodigde bestanden creëer ik de volgende mapstructuur onder 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

Qt-bronnen downloaden

We downloaden de Qt-bronnen en pakken ze uit in de map 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

Nu moeten we nog het mkspec-bestand een beetje aanpassen zodat we het met onze compiler kunnen gebruiken. Voer hiervoor de volgende opdrachten uit:

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

Kruiscompiler downloaden

Ik gebruik Linaro versie 7.4.1 als de kruiscompiler. Ga hiervoor naar de map tools en download en pak de compiler uit:

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 van de Raspberry-libraries

Nu hebben we de originele libraries van Raspberry Pi nodig, die we met rsync naar de Ubuntu-mappen kopiëren:

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/

Nu moeten we nog steeds de symbolische koppelingen opschonen die door rsync zijn gekopieerd, zodat ze naar de juiste originele bestanden verwijzen. Er is hiervoor een klein Python-script dat u kunt downloaden:

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

Maak het script vervolgens uitvoerbaar en roep het op:

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

Qt compileren

Nu kunnen we de build configureren en vervolgens compileren.

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

Na een paar minuten zou het script klaar moeten zijn en moeten de volgende EGLFS-voorwaarden wel of niet zijn ingesteld.

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

Als dit niet het geval is of als u andere foutmeldingen krijgt, onderzoek deze dan en corrigeer ze. Als u het configuratiescript opnieuw wilt uitvoeren met gewijzigde variabelen, zorg er dan voor dat u de inhoud van de build-map van tevoren verwijdert. Als alles in orde is, voer dan de opdrachten make en make install uit.

make -j4
make install

Gecompileerde bestanden op de Raspberry installeren

Als de compilatie is gelukt, kunnen de gecompileerde bestanden (ze bevinden zich in de map qt5.15) worden gekopieerd naar de Raspberry Pi. We doen dit opnieuw met de opdracht rsync.

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

Configuratie van QtCreator

In het volgende blogartikel leg ik uit hoe QtCreator kan worden ingezet voor gebruikt met de gecompileerde libraries.