Kompilacja skrośna Qt 5.15 dla Raspberry Compute Module 4 na Ubuntu 20 LTS

Wprowadzenie

Ta instrukcja dotyczy kompilacji skrośnej Qt 5.15.2 dla Raspberry Pi 4 i instalacji na Compute Module 4. Jest to aktualizacja do mojego wpisu na blogu Qt na Raspberry Pi 4, z tą różnicą, że tym razem korzystam z systemu operacyjnego Raspberry Pi Lite (pobierz tutaj: https://www.raspberrypi.org/software/operating-systems/), w wersji Qt 5.15.2 i jako komputer do kompilacji skrośnej korzystam z Ubuntu 20 LTS w komputerze wirtualnym.

Źródła

Oprócz mojego poprzedniego wpisu na blogu (patrz wyżej) korzystałem również z następujących źródeł: - Uvindu Wijesinghe: https://github.com/UvinduW/Cross-Compiling-Qt-for-Raspberry-Pi-4

System operacyjny Raspberry Pi Lite

Należy zainstalować system operacyjny Raspberry Pi Lite na Raspberry Pi 4 lub jak opisałem w moim wpisie na bloguInstalacja systemu operacyjnego Raspberry PI na Raspberry Compute Module 4 na Raspberry Compute Module 4.

Qt 5.15.2 na Ubuntu 20 LTS

Po zainstalowaniu systemu operacyjnego Raspberry Pi na Compute Module i ponownym uruchomieniu Raspberry z pamięci eMMC, nadszedł czas, aby zainstalować wymagane oprogramowanie na Raspberry i na komputerze Ubuntu.

Raspberry Compute Module 4

Opisane poniżej kroki powinny również działać na „normalnym” Raspberry Pi 4.

Po włączeniu Pi 4 otworzyć menu konfiguracyjne.

sudo raspi-config

Do naszej konfiguracji potrzebujemy „SSH” i „GL (Fake KMS)”. Zobacz dwa poniższe zrzuty ekranu.

SSH Konfiguration

FKMS Konfiguration

  • Następnie należy wprowadź development sources w /etc/apt/sources.list. W tym celu należy dodać następujący wiersz:
deb-src http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi
  • Następnie należy zaktualizować system przy użyciu następujących poleceń:
sudo apt-get update
sudo apt-get dist-upgrade
sudo reboot
sudo rpi-update
sudo reboot
  • Kolejno należy zainstalować wymagane pakiety Qt i do programowania:
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
  • W następnym kroku należy utworzyć katalog dla RaspberryQt:
sudo mkdir /usr/local/qt5.15
sudo chown -R pi:pi /usr/local/qt5.15

Komputer Ubuntu

Wymagany jest komputer PC lub komputer wirtualny z zainstalowanym Ubuntu 20 LTS. Przede wszystkim należy zaktualizować Ubuntu i zainstalować kilka wymaganych bibliotek:

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

Następnie – jeśli jeszcze nie jest dostępny – należy wygenerować ssh-key i zainstalować go na Raspberry, aby przy każdym rsync nie pojawiało się pytanie o hasło i nie trzeba było wprowadzać nazwy użytkownika i hasła. W Internecie można znaleźć wiele instrukcji, więc nie podaję tutaj dokładnego opisu.

Tworzenie struktury katalogów dla bibliotek Raspberry

Dla wymaganych plików tworzę następującą strukturę katalogów pod adresem 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

Pobieranie zasobów Qt

Należy pobrać zasoby Qt i rozpakować je w katalogu 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

Teraz należy trochę zmodyfikować plik mkspec, abyśmy można go było używać z naszym kompilatorem. Aby to zrobić, należy wykonać następujące polecenia:

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

Pobranie kompilatora skrośnego

Jako kompilatora skrośnego używam Linaro, wersja 7.4.1. Aby to zrobić, należy przejść do katalogu narzędzi, pobrać i rozpakować kompilator:

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 bibliotek Raspberry

Teraz potrzebujemy oryginalnych bibliotek Raspberry Pi, które kopiujemy do katalogów Ubuntu za pomocą 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/

Następnie trzeba jeszcze jeszcze wyczyścić symboliczne linki skopiowane przez rsync, tak aby wskazywały na prawidłowe oryginalne pliki. W tym celu można pobrać mały skrypt Python:

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

Następnie należy wykonać i otworzyć skrypt:

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

Kompilacja Qt

Teraz można przeprowadzić konfigurację, a następnie kompilację.

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

Po kilku minutach skrypt powinien się zakończyć, a następujące warunki EGLFS powinny lub nie powinny być ustawione.

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

Jeżeli tak nie jest lub jeżeli pojawią się inne komunikaty o błędach, należy je sprawdzić i poprawić. Jeśli skrypt konfiguracyjny ze zmienionymi zmiennymi zostanie ponownie włączony, należy pamiętać, aby wcześniej usunąć zawartość katalogu kompilacji. Jeśli wszystko jest w porządku, należy wykonać polecenia make i make install.

make -j4
make install

Instalacja skompilowanych pliki na Raspberry

Jeżeli kompilacja przebiegła pomyślnie, skompilowane pliki, znajdujące się w katalogu qt5.15, można skopiować do Raspberry Pi. Ponownie służy do tego polecenie rsync.

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

Konfiguracja QtCreator

W następnym wpisie na bloga wyjaśnię, jak używać QtCreator do stosowania z kompilowanymi bibliotekami.