RaspberryPiWithQt6WebEngine: Difference between revisions
(add note) |
(typo) |
||
Line 21: | Line 21: | ||
In this guide we are going to cross compile Qt 6.5 with WebEngine coming from Qt 6.7 | In this guide we are going to cross compile Qt 6.5 with WebEngine coming from Qt 6.7 | ||
{{note | As shown [[Cross-Compile_Qt_6_for_Raspberry_Pi | here]], we could do a top level build of Qt6, but we are going to do prefix module | {{note | As shown [[Cross-Compile_Qt_6_for_Raspberry_Pi | here]], we could do a 'top level build' of Qt6, but we are going to do 'prefix module build' just to show an alternative way of building Qt6.}} | ||
We need fours repositories to have Qt 6WebEngine up and running: qtbase, shadertools, qtdeclarative and qtwebengine. | We need fours repositories to have Qt 6WebEngine up and running: qtbase, shadertools, qtdeclarative and qtwebengine. |
Revision as of 16:46, 4 January 2024
Introduction
This page describes how to set up self-compiled Qt6 with WebEngine on Raspberry Pi 4 running Raspberry Pi OS.
To see other guides visit:
- Qt5 WebEngine cross compilation guide for Raspbian
- Qt6 general cross compilation guide for Raspberry Pi OS
- Qt6 WebEngine general compilation quide for all platforms
Setup
To be able to cross compile Qt6 for Raspberry Pi OS, we need three things:
Qt6 uses cmake therefore to cross-compile we need to have actually two builds of Qt. One Qt6 host build, which is later used to cross-compile the arm64 Qt build.
In this guide we are going to cross compile Qt 6.5 with WebEngine coming from Qt 6.7
Note: As shown here, we could do a 'top level build' of Qt6, but we are going to do 'prefix module build' just to show an alternative way of building Qt6.
We need fours repositories to have Qt 6WebEngine up and running: qtbase, shadertools, qtdeclarative and qtwebengine.
- Let's create our workspace:
mkdir -p ~/workspaces/rpi/host mkdir -p ~/workspaces/rpi/host/sysroot mkdir -p ~/workspaces/rpi/host/qt mkdir -p ~/workspaces/rpi/target mkdir -p ~/workspaces/rpi/image
- Let's checkout qt source code and select branches:
cd ~/workspaces/rpi/host/qt git clone git://code.qt.io/qt/qtbase.git cd qtbase git git checkout origin/6.5.3 cd .. git clone git://code.qt.io/qt/qtshadertools.git cd qtshadertools git checkout origin/6.5.3 cd .. git clone git://code.qt.io/qt/qtdeclarative.git cd qtdeclarative git checkout origin/6.5.3 cd .. git clone git://code.qt.io/qt/qtwebengine.git git checkout origin/6.7 git submodule update cd ..
Note: QtWebEngine needs initialization of the submodule.
Sysroot
To be able to cross-compile, we need a part of arm64 target sysroot to be present on our build machine. As shown here, you could simply start your Rasberry Pi OS on the board and then rsync the required libs and includes to the host machine with SSH connection. However, in this guide we will mount the Raspberry Pi OS image via a loop device, use qemu to install build dependencies and than make a local copy.
Note: We do need a local copy of 'libs' and 'headers' from the image, as we want to adjust the symlinks.
- Let's now download Raspberry Pi OS:
cd ~/workspaces/rpi/image wget https://downloads.raspberrypi.com/raspios_arm64/images/raspios_arm64-2023-12-06/2023-12-05-raspios-bookworm-arm64.img.xz
- Let's extract the image:
unxz --keep 2023-12-05-raspios-bookworm-arm64.img.xz
- We need add at least 2G space to the image to be able to fit qt build with debug info (see here instructions)
- Make loop devices for the image:
losetup -fP 2023-12-05-raspios-bookworm-arm64.img losetup -a /dev/loop0: [66306]:2363198 (~/workspaces/rpi/image/2023-12-05-raspios-bookworm-arm64.img)
- Mount the root partition:
mount /dev/loop0p2 -t ext4 ~/workspaces/rpi/target mount -t proc /proc ~/workspaces/rpi/target/proc mount -t sysfs /sys ~/workspaces/rpi/target/sys mount --bind /dev ~/workspaces/rpi/target/dev mount --bind /dev/pts ~/workspaces/rpi/target/pts
- We need qemu on the image to able to execute command, therefore copy static qemu binary to image.
cp /usr/bin/qemu-arch64-static /workspaces/rpi/target/usr/bin/
Note: Setup of qemu static interpreter is distribution specific. Please refer to your Linux distribution documentation.
- Chroot to arm64 target:
cd ~/workspaces/rpi/target chroot .
- Let's update Qt6 build dependencies:
vi /etc/apt/sources.list # uncomment the deb-src line apt update apt build-dep qt6-base exit
- rsync the parts that we need:
cd ~/workspaces/rpi/host rsync -av ~/workspaces/rpi/target/lib sysroot rsync -av ~/workspaces/rpi/target/usr/include sysroot/usr rsync -av ~/workspaces/rpi/target/usr/lib sysroot/usr
- Adjust symlinks to be relative:
wget https://raw.githubusercontent.com/Kukkimonsuta/rpi-buildqt/master/scripts/utils/sysroot-relativelinks.py chmod +x sysroot-relativelinks.py ./sysroot-relativelinks.py sysroot
Note: Command-line tool called symlinks should not be used instead as it creates dangling links.
- Umount no longer needed mounts:
umount ~/workspaces/rpi/target/sys ~/workspaces/rpi/target/proc umount ~/workspaces/rpi/target/dev/pts ~/workspaces/rpi/target/dev
- Detach loop device:
losetup -d /dev/loop0
Toolchain
To cross-compile Qt, we need a cross-compiler toolchain. There are many excellent tools to compile a toolchain, such as crosstool-ng or buildroot. We could also simply download ready 3dparty toolchain form the internet. However, this guide will use the official gcc cross compiler, which is shipped with Debian distribution, same as the one shipped with Raspberry Pi OS. In time of writing this quide latest Raspberry Pi OS is called 'Bookworm' and it is shipped with gcc 12.2 and Qt 6.4. Therefore we will use the gnu gcc cross compiler from Bookworm release. To setup the cross-compiler toolchain will use 'debootstrap' which is a very convenient tool to install Debian base system into a subdirectory of any other running Linux system. Most of distributions ship this tool therefore it was selected as most generic approach.
Note: The other approach could be for example installing Debian distribution on VM.
- To setup Bookworm Debian release on your machine execute:
cd ~/workspaces/rpi/host debootstrap --arch amd64 bookworm ~/workspace/rpi/host http://ftp.uk.debian.org/debian
- Let's mount and chroot into newly created installation:
mount -t proc /proc ~/workspaces/rpi/host/proc mount -t sysfs /sys ~/workspaces/rpi/host/sys mount --bind /dev ~/workspaces/rpi/host/dev mount --bind /dev/pts ~/workspaces/rpi/target/pts chroot ~/workspaces/rpi/host /bin/bash
- Let's install host and cross compiler:
apt install build-essential crossbuild-essential-arm64
Qt6 Host Build
Note: After toolchain setup, we should be chrooted into our host Debian root (~/workspaces/rpi/host).
- Let's install dependencies for build using know dependencies for Qt 6.4:
vi /etc/apt/sources.list apt update apt build-dep qt6-base
- Let's configure host build for Qt6 qtbase, build it and install into ~/workspaces/rpi/host/opt/qt:
cd /qt/build mkdir qtbase cd qtbase /qt/qtbase/configure -release -nomake tests -nomake examples -linker lld -prefix /opt/qt cmake --build . --parallel cmake --install
Note: /qt/qtbase is really ~/workspaces/rpi/host/qt/qtbase on build machine