Qt 5.15 cross compile für Raspberry Compute Module 4 auf Ubuntu 20 LTS

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:

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.

SSH Konfiguration

FKMS Konfiguration

- 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.