Einführung
Dies ist eine Anleitung für das Cross-Compiling von Qt 5.15.2 für Raspberry Pi 4 und die Installation auf dem Compute Module 4. Es ist ein Update zu meinem Blogpost Qt auf dem Raspberry Pi 4, mit dem Unterschied, daß ich diesmal Raspberry Pi OS Lite (Download hier: https://www.raspberrypi.org/software/operating-systems/), Qt Version 5.15.2 und als Cross-Compile-Computer Ubuntu 20 LTS in einer virtuellen Maschine verwende.
Quellen
Neben meinem alten Blogpost (siehe oben) habe ich noch folgende Quellen verwendet:
- von Uvindu Wijesinghe: https://github.com/UvinduW/Cross-Compiling-Qt-for-Raspberry-Pi-4
Achtung
Es gibt ein Update zu diesem Artikel, das Cross-Compilation für Raspberry Pi, Qt6 und Ubuntu 22.04 LTS enthält. Folgen Sie diesem Link, wenn Sie neuere Versionen benötigen.
Raspberry Pi OS Lite
Installieren Sie Raspberry Pi OS Lite auf einem Raspberry Pi 4 oder wie in meinem Blogpost Raspberry Pi OS auf dem Raspberry Compute Module 4 installieren beschrieben, auf einem Raspberry Compute Module 4.
Qt 5.15.2 auf Ubuntu 20 LTS
Nachdem das Raspberry Pi OS auf dem Compute Module installiert ist und der Raspberry wieder von dem eMMC Speicher startet, ist es an der Zeit, die benötigte Software auf dem Raspberry und auf der Ubuntu Maschine zu installieren.
Raspberry Compute Module 4
Die im Anschluss gezeigten Schritte sollten so auch auf einem "normalen" Raspberry Pi 4 funktionieren.
Nach dem Einschalten des Pi 4 das Konfigurations-Menü aufrufen.
sudo raspi-config
Für unsere Konfiguration benötigen wir "SSH" und "GL (Fake KMS)". Siehe dazu die beiden folgenden Screenshots.
- Anschließend development sources in /etc/apt/sources.list eintragen. Dazu folgende Zeile hinzufügen:
deb-src http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi
- Dann das System mit folgenden Befehlen auf den neuesten Stand bringen:sudo apt-get update
sudo apt-get dist-upgrade
sudo reboot
sudo rpi-update
sudo reboot
- Und anschließend die benötigten Qt- und Entwicklungspakte installieren: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
- Dann noch ein Verzeichnis für RaspberryQt anlegen:sudo mkdir /usr/local/qt5.15
sudo chown -R pi:pi /usr/local/qt5.15
Ubuntu Maschine
Vorausgesetzt wird ein PC oder eine virtuelle Maschine mit installiertem Ubuntu 20 LTS.
Als Erstes Ubuntu auf den neuesten Stand bringen und noch einige benötigte Libraries installieren:
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
Anschließend - falls noch nicht vorhanden - einen ssh-key erzeugen und auf dem Raspberry installieren, damit nicht bei jedem rsync eine Passwortabfrage erscheint und Benutzername und Passwort eingegeben werden müssen. Dazu gibt es genügend Anleitungen im Internet, so daß ich mir die ausführliche Beschreibung hier erspare.
Verzeichnisstruktur für die Raspberry Libraries anlegen
Für die benötigten Dateien lege ich unter Documents/Qt-CrossCompile-RaspberryPi/raspberrypi4 folgende Verzeichnisstruktur an:
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
Download Qt Resourcen
Wir laden die Qt Resourcen herunter und entpacken sie in dem raspberrypi4 Verzeichnis:
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
Jetzt müssen wir noch die mkspec Datei ein wenig modifizieren, damit wir sie mit unserem Compiler verwenden können. Dazu folgende Befehle ausführen:
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
Download Cross-Compiler
Als Cross-Compiler verwende ich eine Linaro version 7.4.1. Dazu in das Verzeichnis tools wechseln und den Compiler herunterladen und entpacken:
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 der Raspberry Libraries
Nun benötigen wir noch die Original-Libraries vom Raspberry Pi, die wir mit rsync in die Ubuntu-Verzeichnisse kopieren:
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/
Nun müssen wir noch die symbolischen Links, die durch das rsync kopiert wurden, bereinigen, damit diese auf die richtigen Original-Dateien deuten. Dazu gibt es ein kleines Python-Script zum Download:
wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py
Dann noch das Script ausführbar machen und aufrufen:
sudo chmod +x sysroot-relativelinks.py
./sysroot-relativelinks.py sysroot
Qt kompilieren
Nun können wir den build konfigurieren und anschließend kompilieren.
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
Nach einigen Minuten sollte das Script beendet sein und folgende EGLFS-Bedingungen sollten gesetzt bzw. nicht gesetzt sein.
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
Sollte dies nicht so sein oder sollten irgendwelche anderen Fehlermeldungen auftauchen, dann bitte nachforschen und bereinigen. Sollten Sie das Konfigurations-Script noch einmal mit geänderten Variablen laufen lassen wollen, dann bitte unbedingt zuvor den Inhalt des build-Verzeichnisses löschen.
Wenn alles OK ist, dann die Befehle make und make install ausführen.
make -j4
make install
Kompilierte Dateien auf dem Raspberry installieren
Ist die Kompilierung erfolgreich gelaufen, können die kompilierten Dateien - sie befinden sich in dem Verzeichnis qt5.15 - auf den Raspberry Pi kopiert werden. Dies machen wir wieder mit dem rsync-Befehl.
rsync -avz --rsync-path="sudo rsync" qt5.15 [email protected]:/usr/local/
Konfiguration QtCreator
Im nächsten Blogpost erkläre ich, wie man QtCreator für den Einsatz mit den kompilierten Libraries verwendet.