Qt 5.15 compilación cruzada para Raspberry Compute Module 4 en Ubuntu 20 LTS

Introducción

Esta es una guía para compilar Qt 5.15.2 para Raspberry Pi 4 e instalarlo en el módulo de cómputo 4. Es una actualización de mi publicación de blog Qt sobre la Raspberry Pi 4, con la diferencia de que esta vez estoy usando Raspberry Pi OS Lite (descargar aquí: https://www.raspberrypi.org/software/operating-systems/), Qt versión 5.15.2 y Ubuntu 20 LTS como una computadora de compilación cruzada en una máquina virtual.

Fuentes

Además de mi antigua publicación de blog (ver arriba), también utilicé las siguientes fuentes:

Raspberry Pi OS Lite

Instale Raspberry Pi OS Lite en una Raspberry Pi 4 o en una Raspberry Compute Module 4 como se describe en mi publicación de blog Instalación de Raspberry Pi OS en Raspberry Compute Module 4 .

Qt 5.15.2 en Ubuntu 20 LTS

Después de instalar el sistema operativo Raspberry Pi en el módulo de cómputo y arrancar desde la memoria eMMC, es hora de instalar el software requerido en Raspberry y en la máquina Ubuntu.

Raspberry Compute Módulo 4

Los pasos que se muestran a continuación también deberían funcionar en una Raspberry Pi 4 "normal".

Después de encender el Pi 4, abra el menú de configuración.

sudo raspi-config
Para nuestra configuración necesitamos "SSH" y "GL (Fake KMS)". Vea las siguientes dos capturas de pantalla.
SSH Konfiguration

FKMS Konfiguration

- Luego agregue fuentes de desarrollo a /etc/apt/sources.list. Para ello, agregue la línea siguiente:
deb-src http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi
- A continuación, actualice el sistema con los siguientes comandos:
sudo apt-get update
sudo apt-get dist-upgrade
sudo reboot
sudo rpi-update
sudo reboot
- Y luego instale los paquetes Qt y de desarrollo requeridos:
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
- A continuación, cree un directorio para RaspberryQt:
sudo mkdir /usr/local/qt5.15
sudo chown -R pi:pi /usr/local/qt5.15

Máquina Ubuntu

Se requiere una PC o máquina virtual con Ubuntu 20 LTS instalado.
En primer lugar, actualice Ubuntu e instale algunas bibliotecas requeridas:

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

Luego, si aún no está disponible, cree una ssh-key e instálela en Raspberry, de modo que no aparezca una solicitud de contraseña con cada rsync y se deba ingresar el nombre de usuario y la contraseña. Hay suficientes instrucciones en Internet, así que me ahorraré la descripción detallada aquí.

Crear estructura de directorios para las bibliotecas de Raspberry

Para los archivos requeridos, creo la siguiente estructura de directorios en 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

Descargar recursos de Qt

Descargamos los recursos de Qt y los descomprimimos en el directorio 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

Ahora necesitamos modificar un poco el archivo mkspec para que podamos usarlo con nuestro compilador. Para ello, ejecute los siguientes comandos:

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

Descargar Cross-Compiler

Como compilador cruzado utilizo una versión 7.4.1 de Linaro. Para ello, cambie al directorio de herramientas y descargue y descomprima el compilador:

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 de bibliotecas de frambuesa

Ahora necesitamos las librerías originales de la Raspberry Pi, que copiamos en los directorios de Ubuntu con 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/

Ahora tenemos que limpiar los enlaces simbólicos que fueron copiados por el rsync para que apunten a los archivos originales correctos. Hay un pequeño script de Python para descargar:

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

Luego haga que el script sea ejecutable y llámelo:

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

Compilando Qt

Ahora podemos configurar la compilación y luego compilarla.

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

Después de unos minutos, el script debe estar terminado y las siguientes condiciones EGLFS deben establecerse o no establecerse.

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 este no es el caso o si aparece algún otro mensaje de error, investigue y limpie. Si desea volver a ejecutar el script de configuración con variables modificadas, elimine el contenido del directorio de compilación de antemano.
Si todo está bien, ejecute los comandos make y make install.

make -j4
make install

Instalar archivos compilados en la Raspberry

Si la compilación es exitosa, los archivos compilados - que se encuentran en el directorio qt5.15 - se pueden copiar a la Raspberry Pi. Nuevamente, hacemos esto usando el comando rsync.

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

Configuración QtCreator

En la próxima publicación del blog explicaré cómo usar QtCreator para usar con las bibliotecas compiladas.