RaspberryPiWithQt6WebEngine: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
(typo)
(add build of remaining modules)
Line 25: Line 25:
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.


* Let's create our workspace:<syntaxhighlight>
* Let's create our workspace:<syntaxhighlight lang="bash">
mkdir -p ~/workspaces/rpi/host
mkdir -p ~/workspaces/rpi/host
mkdir -p ~/workspaces/rpi/host/sysroot
mkdir -p ~/workspaces/rpi/host/sysroot
Line 33: Line 33:
</syntaxhighlight>
</syntaxhighlight>


* Let's checkout qt source code and select branches:<syntaxhighlight>
* Let's checkout qt source code and select branches:<syntaxhighlight lang="bash">
cd ~/workspaces/rpi/host/qt
cd ~/workspaces/rpi/host/qt
git clone git://code.qt.io/qt/qtbase.git
git clone git://code.qt.io/qt/qtbase.git
Line 65: Line 65:
{{note|We do need a local copy of 'libs' and 'headers' from the image, as we want to adjust the symlinks.}}
{{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:<syntaxhighlight>
* Let's now download Raspberry Pi OS:<syntaxhighlight lang="bash">
cd ~/workspaces/rpi/image
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
wget https://downloads.raspberrypi.com/raspios_arm64/images/raspios_arm64-2023-12-06/2023-12-05-raspios-bookworm-arm64.img.xz
</syntaxhighlight>
</syntaxhighlight>


* Let's extract the image:<syntaxhighlight>
* Let's extract the image:<syntaxhighlight lang="bash">
unxz --keep 2023-12-05-raspios-bookworm-arm64.img.xz
unxz --keep 2023-12-05-raspios-bookworm-arm64.img.xz
</syntaxhighlight>
</syntaxhighlight>


* We need add at least 2G space to the image to be able to fit qt build with debug info [[ResizeRaspberryPiImage| (see here instructions) ]]
* We need add at least 2G space to the image to be able to fit qt build with debug info [[ResizeRaspberryPiImage| (see here instructions) ]]
* Make loop devices for the image:<syntaxhighlight>
* Make loop devices for the image:<syntaxhighlight lang="bash">
losetup -fP 2023-12-05-raspios-bookworm-arm64.img
losetup -fP 2023-12-05-raspios-bookworm-arm64.img
losetup -a
losetup -a
Line 81: Line 81:
</syntaxhighlight>
</syntaxhighlight>


* Mount the root partition:<syntaxhighlight>
* Mount the root partition:<syntaxhighlight lang="bash">
mount /dev/loop0p2 -t ext4 ~/workspaces/rpi/target
mount /dev/loop0p2 -t ext4 ~/workspaces/rpi/target
mount -t proc /proc ~/workspaces/rpi/target/proc
mount -t proc /proc ~/workspaces/rpi/target/proc
Line 89: Line 89:
</syntaxhighlight>
</syntaxhighlight>


* We need qemu on the image to able to execute command, therefore copy static qemu binary to image.<syntaxhighlight>
* We need qemu on the image to able to execute command, therefore copy static qemu binary to image.<syntaxhighlight lang="bash">
cp /usr/bin/qemu-arch64-static /workspaces/rpi/target/usr/bin/
cp /usr/bin/qemu-arch64-static /workspaces/rpi/target/usr/bin/
</syntaxhighlight>
</syntaxhighlight>
{{note| Setup of qemu static interpreter is distribution specific. Please refer to your Linux distribution documentation.}}
{{note| Setup of qemu static interpreter is distribution specific. Please refer to your Linux distribution documentation.}}


* Chroot to arm64 target:<syntaxhighlight>
* Chroot to arm64 target:<syntaxhighlight lang="bash">
cd ~/workspaces/rpi/target
cd ~/workspaces/rpi/target
chroot .
chroot .
</syntaxhighlight>
</syntaxhighlight>


* Let's update Qt6 build dependencies:<syntaxhighlight>
* Let's update Qt6 build dependencies:<syntaxhighlight lang="bash">
vi /etc/apt/sources.list
vi /etc/apt/sources.list
# uncomment the deb-src line
# uncomment the deb-src line
Line 107: Line 107:
</syntaxhighlight>
</syntaxhighlight>


* rsync the parts that we need:<syntaxhighlight>
* rsync the parts that we need:<syntaxhighlight lang="bash">
cd ~/workspaces/rpi/host
cd ~/workspaces/rpi/host
rsync -av ~/workspaces/rpi/target/lib sysroot
rsync -av ~/workspaces/rpi/target/lib sysroot
Line 114: Line 114:
</syntaxhighlight>
</syntaxhighlight>


* Adjust symlinks to be relative:<syntaxhighlight>
* Adjust symlinks to be relative:<syntaxhighlight lang="bash">
wget https://raw.githubusercontent.com/Kukkimonsuta/rpi-buildqt/master/scripts/utils/sysroot-relativelinks.py
wget https://raw.githubusercontent.com/Kukkimonsuta/rpi-buildqt/master/scripts/utils/sysroot-relativelinks.py
chmod +x sysroot-relativelinks.py
chmod +x sysroot-relativelinks.py
Line 122: Line 122:
{{note| Command-line tool called [https://linux.die.net/man/8/symlinks symlinks] should not be used instead as it creates dangling links.}}
{{note| Command-line tool called [https://linux.die.net/man/8/symlinks symlinks] should not be used instead as it creates dangling links.}}


* Umount no longer needed mounts:<syntaxhighlight>
* Umount no longer needed mounts:<syntaxhighlight lang="bash">
umount ~/workspaces/rpi/target/sys ~/workspaces/rpi/target/proc  
umount ~/workspaces/rpi/target/sys ~/workspaces/rpi/target/proc  
umount ~/workspaces/rpi/target/dev/pts ~/workspaces/rpi/target/dev
umount ~/workspaces/rpi/target/dev/pts ~/workspaces/rpi/target/dev
</syntaxhighlight>
</syntaxhighlight>


* Detach loop device:<syntaxhighlight>
* Detach loop device:<syntaxhighlight lang="bash">
losetup -d /dev/loop0
losetup -d /dev/loop0
</syntaxhighlight>
</syntaxhighlight>
Line 142: Line 142:
{{note | The other approach could be for example installing Debian distribution on VM.}}
{{note | The other approach could be for example installing Debian distribution on VM.}}


* To setup Bookworm Debian release on your machine execute:<syntaxhighlight>
* To setup Bookworm Debian release on your machine execute:<syntaxhighlight lang="bash">
cd ~/workspaces/rpi/host
cd ~/workspaces/rpi/host
debootstrap --arch amd64 bookworm ~/workspace/rpi/host http://ftp.uk.debian.org/debian
debootstrap --arch amd64 bookworm ~/workspace/rpi/host http://ftp.uk.debian.org/debian
</syntaxhighlight>
</syntaxhighlight>


* Let's mount and chroot into newly created installation:<syntaxhighlight>
* Let's mount and chroot into newly created installation:<syntaxhighlight lang="bash">
mount -t proc /proc ~/workspaces/rpi/host/proc
mount -t proc /proc ~/workspaces/rpi/host/proc
mount -t sysfs /sys ~/workspaces/rpi/host/sys
mount -t sysfs /sys ~/workspaces/rpi/host/sys
Line 156: Line 156:
</syntaxhighlight>
</syntaxhighlight>


* Let's install host and cross compiler:<syntaxhighlight>
* Let's install host and cross compiler:<syntaxhighlight lang="bash">
apt install build-essential crossbuild-essential-arm64
apt install build-essential crossbuild-essential-arm64
</syntaxhighlight>
</syntaxhighlight>
Line 164: Line 164:
{{note | After toolchain setup, we should be chrooted into our host Debian root (~/workspaces/rpi/host).}}
{{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:<syntaxhighlight>
* Let's install dependencies for build using know dependencies for Qt 6.4:<syntaxhighlight lang="bash">
vi /etc/apt/sources.list
vi /etc/apt/sources.list
apt update
apt update
Line 170: Line 170:
</syntaxhighlight>
</syntaxhighlight>


* Let's configure host build for Qt6 qtbase, build it and install into ~/workspaces/rpi/host/opt/qt:<syntaxhighlight>
* Let's configure host build for Qt6 qtbase, build it and install into ~/workspaces/rpi/host/opt/qt:<syntaxhighlight lang="bash">
cd /qt/build
cd /qt/build
mkdir qtbase
mkdir qtbase
Line 179: Line 179:
</syntaxhighlight>
</syntaxhighlight>


{{note | /qt/qtbase is really ~/workspaces/rpi/host/qt/qtbase on build machine}}
{{note | The path /qt/qtbase in chroot is really ~/workspaces/rpi/host/qt/qtbase on build machine.}}
 
* Let's configure and build remaining modules:<syntaxhighlight lang="bash">
cd /qt/build
mkdir qtshadertools qtdeclarative qtwebengine
 
cd qtshadertools
/opt/qt/bin/qt-cofigure-module ../../qtshadertools
cmake --build . --parallel
cmake --install .
cd ..
 
cd qtdeclarative
/opt/qt/bin/qt-cofigure-module ../../qtdeclarative
cmake --build . --parallel
cmake --install .
cd ..
 
cd qtwebengine
/opt/qt/bin/qt-cofigure-module ../../qtwebengine
cmake --build . --parallel
cmake --install .
cd ..
</syntaxhighlight>

Revision as of 16:56, 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:

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: The path /qt/qtbase in chroot is really ~/workspaces/rpi/host/qt/qtbase on build machine.

  • Let's configure and build remaining modules:
    cd /qt/build
    mkdir qtshadertools qtdeclarative qtwebengine
    
    cd qtshadertools
    /opt/qt/bin/qt-cofigure-module ../../qtshadertools
    cmake --build . --parallel
    cmake --install .
    cd ..
    
    cd qtdeclarative
    /opt/qt/bin/qt-cofigure-module ../../qtdeclarative
    cmake --build . --parallel
    cmake --install .
    cd ..
    
    cd qtwebengine
    /opt/qt/bin/qt-cofigure-module ../../qtwebengine
    cmake --build . --parallel
    cmake --install .
    cd ..