Собираем Qt 5.12.6 LTS под Raspberry pi 4

от
Linux   qt5, raspbian, qt 5.12.6, rpi4, arm, crosscompilation

Cross-Compile QT 5.12.6 / Raspberry Pi 4

В данной статье я хочу рассказать о том, как собрать Qt 5.12.6 LTS для Raspberry pi 4. На момент написания, нормальных гайдов пока ещё нет, а те что есть, выдают кривые, нестабильные (если вообще рабочие) решения. Собраная подобным способом версия Qt (а значит и билд конфигурация) прекрасно работает с целой кучей разных модулей, задач, библиотек.

Почему 5.12.6?На данный момент это последняя LTS версия для Qt5 opensource.

Зачем LTS?LTS – расшифровывается как Long Time Support или, в переводе на русский, поддержка в течение длительного времени. Это позволяет дольше не переходить на более свежие версии, так как поддержка, исправления, а иногда и обновления доступны в течение более длительного срока. Но, отличие версий помеченных как LTS состоит не только в том, что она поддерживается производителем дольше.

LTS версии часто более стабильны по сравнению с обычными, так как при их выпуске разработчики стараются не экспериментировать со всевозможными новинками. Что принципиально важно, если мы целимся именно на стабильность работы.

Собственно сборкаДля того чтоб собрать Qt 5.12.6 под Raspberry Pi4 нам потребуется рабочий Raspbian Buster (на RPi), sshfs, и linaro версии 7.x

[на RPi] Отредактируйте /etc/apt/sources.list и раскомментируйте строку deb-src:
  1. sudo vim /etc/apt/sources.list

Обновите свою систему и установите необходимые библиотеки:
  1. sudo apt-get update
  2. sudo apt-get build-dep qt4-x11
  3. sudo apt-get build-dep qtbase-opensource-src
  4. apt-get install build-essential libfontconfig1-dev libdbus-1-dev libfreetype6-dev libicu-dev libinput-dev libxkbcommon-dev libsqlite3-dev libssl-dev libpng-dev libjpeg-dev libglib2.0-dev libraspberrypi-dev
  5. sudo apt-get install libegl1-mesa libegl1-mesa-dev libgles2-mesa libgles2-mesa-dev
  6. sudo apt-get install libx11-dev libxcb1-dev libxkbcommon-x11-dev libx11-xcb-dev libxext-dev

Опционально, (если вам нужен QtMultimedia):
  1. sudo apt-get install libbluetooth-dev bluez-tools gstreamer1.0-plugins* libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libopenal-data libsndio7.0 libopenal1 libopenal-dev pulseaudio libasound2-dev

[на RPi] Добавим нашего пользователя в группу render
  1. sudo gpasswd -a pi render

[на RPi] Подготовим папку под наш Qt
  1. sudo mkdir /usr/local/Qt5.12.6-rpi4
  2. sudo chown pi:pi /usr/local/Qt5.12.6-rpi4

[на хосте] Создадим папку под наш билд и выкачаем тулчейн
  1. mkdir ~/build-Qt5
  2. cd ~/build-Qt5
  3. wget https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-i686_arm-linux-gnueabihf.tar.xz
  4. tar xf gcc-linaro-7.5.0-2019.12-i686_arm-linux-gnueabihf.tar.xz

[на хосте] Замонтируем по ssh sysroot
  1. mkdir sysroot
  2. sudo sshfs -o allow_other,transform_symlinks pi@10.0.0.175:/ ~/build-Qt5/sysroot
Имейте в виду что папка с sysroot зашивается внутрь вашего qmake который вы позже будете использовать для кросскомпиляции. Если вы планируете интегрировать сборку под RPi4 в систему CI/CD или просто раздать ваш Qt для кросскомпиляции коллегам, хорошим тоном будет не монтировать sysroot себе в домашнюю директорию. Выбирайте мудро.

[на хосте] Выкачаем Qt (qtbase для начала)
  1. git clone git://code.qt.io/qt/qtbase.git -b 5.12.6
  2. cd qtbase
После этого пофиксим mkspecs под Raspberry pi 4, для этого в qtbase/mkspecs/devices/linux-rasp-pi3-vc4-g++/qmake.conf заменяем строку с QMAKE_CFLAGS на QMAKE_CFLAGS = -march=armv8-a -mtune=cortex-a72 -mfpu=vfpОткуда взялись исправления для QMAKE_CFLAGS?
Открыть спойлер

[на хосте] ./configure && make && make install
  1. ./configure -release -opengl es2 -device linux-rasp-pi3-vc4-g++ -device-option CROSS_COMPILE=~/build-Qt5/gcc-linaro-7.5.0-2019.12-i686_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- -sysroot ~/build-Qt5/sysroot -opensource -confirm-license -make libs -prefix /usr/local/Qt5.12.6-rpi4 -extprefix ~/build-Qt5/Qt5.12.6-rpi4 -hostprefix ~/build-Qt5/host-Qt5.12.6-rpi4 -no-use-gold-linker -v
  2. make -j8
  3. make install
ВАЖНО: перекалибровка без очистки проекта от остатков предидущих билдов не имеет смысла! Если билд не прошел или вы хотите переконфигурировать Qt (например, после того как доставили некоторые либы) выполняем:
  1. git clean -dfx
После этого заново ./configure && make && make install
Это справедливо как для самого Qt, так и для его модулей

[на хосте] Задеплоим свежесобраный Qt на нашу Raspberry Pi
  1. cd ~/build-Qt5
  2. rsync -avz Qt5.12.6-rpi4 pi@10.0.0.175:/usr/local

[на RPi] Дадим линкеру знать про наш Qt
  1. echo /usr/local/Qt5.12.6-rpi4/lib | sudo tee /etc/ld.so.conf.d/Qt5.12.6-rpi4.conf
  2. sudo ldconfig

[на хосте] Далее билдим все нужные нам модули
  1. git clone git://code.qt.io/qt/<qt-module>.git -b <qt-version>
  2. cd <qt-module>
  3.  
  4. ~/build-Qt5/host-Qt5.12.6-rpi4/bin/qmake
  5.  
  6. make
  7. make install

Модули которые я использовал:
Открыть спойлер

После того как все модули собраны, деплоим на rpi
  1. rsync -avz Qt5.12.6-rpi4 pi@10.0.0.175:/usr/local

[на RPi] Выполняем
  1. sudo ldconfig

:salut: :salut2: :salut3: :salut: ПОЗДРАВЛЯЮ, ВЫ ВЕЛИКОЛЕПНЫ! :salut: :salut3: :salut2: :salut:
+7   7   0
260