I wrote about the installation of Raspbian on Raspberry Compute Module and setup cross compilation for QtCreator on Ubuntu 20.
This blogpost is an update to the - at this time - newest version 6.8 of Qt, raspi OS Bookworm and Ubuntu 22.04 LTS.
Prerequisites
I used the following hard- and software:
Raspberry Pi 4
raspi OS Bookworm, without recommended software
Ubuntu 22.04 LTS
Qt 6.8
QtCreator 14.02
Notes
If you have a laptop or desktop computer with enough RAM and CPU cores, you can do the cross compilation in a virtual machine. But I made the experience, that a native computer is much faster and produces less errors.
Have a look at the file paths and ip addresses in my code examples and adjust them to your needs.
Discover versions of gcc, ld and ldd. Source code of the same version should be downloaded to build cross compiler later.
pi@raspberrypi:~ $ gcc --version
gcc (Debian 12.2.0-14) 12.2.0
Copyright (C) 2022 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
pi@raspberrypi:~ $ ld --version
GNU ld (GNU Binutils for Debian) 2.40
Copyright (C) 2023 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or (at your option) a later version.
This program has absolutely no warranty.
pi@raspberrypi:~ $ ldd --version
ldd (Debian GLIBC 2.36-9+rpt2+deb12u8) 2.36
Copyright (C) 2022 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.
Append following piece of code to the end of ~/.bashrc and update changes:
cd ~
wget https://github.com/Kitware/CMake/releases/download/v3.30.5/cmake-3.30.5.tar.gz
tar -xzvf cmake-3.30.5.tar.gz
cd cmake-3.30.5
./bootstrap
make -j$(nproc)
sudo make install
# Update PATH Environment Variable
which cmake
/usr/local/bin/cmake
export PATH=/usr/local/bin/cmake:$PATH
source ~/.bashrc
cmake --version
Build gcc as a cross compiler
Download necessary source code. You should modify the following commands to your needs. For the time I make this page, they are:
gcc 12.2.0
binutils 2.40(ld version)
glibc 2.36(ldd version)
cd ~
mkdir gcc_all && cd gcc_all
wget https://ftpmirror.gnu.org/binutils/binutils-2.40.tar.bz2
wget https://ftpmirror.gnu.org/glibc/glibc-2.36.tar.bz2
wget https://ftpmirror.gnu.org/gcc/gcc-12.2.0/gcc-12.2.0.tar.gz
git clone --depth=1 https://github.com/raspberrypi/linux
tar xf binutils-2.40.tar.bz2
tar xf glibc-2.36.tar.bz2
tar xf gcc-12.2.0.tar.gz
rm *.tar.*
cd gcc-12.2.0
contrib/download_prerequisites
cd ~/gcc_all
cd linux
KERNEL=kernel7
make ARCH=arm64 INSTALL_HDR_PATH=/opt/cross-pi-gcc/aarch64-linux-gnu headers_install
Build Binutils.
cd ~/gcc_all
mkdir build-binutils && cd build-binutils
../binutils-2.40/configure --prefix=/opt/cross-pi-gcc --target=aarch64-linux-gnu --with-arch=armv8 --disable-multilib
make -j 8
make install
Edit gcc-12.2.0/libsanitizer/asan/asan_linux.cpp. Add following piece of code.
#ifndef PATH_MAX
#define PATH_MAX 4096
#endif
Do a partial build of gcc.
cd ~/gcc_all
mkdir build-gcc && cd build-gcc
../gcc-12.2.0/configure --prefix=/opt/cross-pi-gcc --target=aarch64-linux-gnu --enable-languages=c,c++ --disable-multilib
make -j8 all-gcc
make install-gcc
Partially build Glibc.
cd ~/gcc_all
mkdir build-glibc && cd build-glibc
../glibc-2.36/configure --prefix=/opt/cross-pi-gcc/aarch64-linux-gnu --build=$MACHTYPE --host=aarch64-linux-gnu --target=aarch64-linux-gnu --with-headers=/opt/cross-pi-gcc/aarch64-linux-gnu/include --disable-multilib libc_cv_forced_unwind=yes
make install-bootstrap-headers=yes install-headers
make -j8 csu/subdir_lib
install csu/crt1.o csu/crti.o csu/crtn.o /opt/cross-pi-gcc/aarch64-linux-gnu/lib
aarch64-linux-gnu-gcc -nostdlib -nostartfiles -shared -x c /dev/null -o /opt/cross-pi-gcc/aarch64-linux-gnu/lib/libc.so
touch /opt/cross-pi-gcc/aarch64-linux-gnu/include/gnu/stubs.h
Back to gcc.
cd ~/gcc_all/build-gcc
make -j8 all-target-libgcc
make install-target-libgcc
Finish building glibc.
cd ~/gcc_all/build-glibc
make -j8
make install
Finish building gcc.
cd ~/gcc_all/build-gcc
make -j8
make install
At this point, we have a full cross compiler toolchain with gcc. Folder gcc_all is not need any more. You can delete it.
Building Qt6
There are two possibilities to build Qt6. There is a "single" (https://download.qt.io/official_releases/qt/6.8/6.8.0/single/qt-everywhere-src-6.8.0.tar.xz) version to download, which contains qtbase and all submodules. This is very heavy stuff and needs much power and time to compile it.
My recommendation is, to compile qtbase as basis and afterwards compile only each submodule you need separately.
Make folders for sysroot and qt6. I create this folders in my workspace/qt-rpi-cross-compilation directory.
cd ~/workspace/qt-rpi-cross-compilation/qt6/src
wget https://download.qt.io/official_releases/qt/6.8/6.8.0/submodules/qtbase-everywhere-src-6.8.0.tar.xz
tar xf qtbase-everywhere-src-6.8.0.tar.xz
Create a file named toolchain.cmake in ~/workspace/qt-rpi-cross-compilation/qt6.
You need to adjust the line "set(TARGET_SYSROOT /home/factory/workspace/qt-rpi-cross-compilation/rpi-sysroot)" to your environment.
If you create a project in QtCreator, you have to adjust the "Run" configuration. At "Environment" you have to add:
-LD_LIBRARY_PATH=:/usr/local/qt6/lib/
Add Qt Submodules
Add QML module
Download source codes:
cd ~/workspace/qt-rpi-cross-compilation/qt6/src
wget https://download.qt.io/official_releases/qt/6.8/6.8.0/submodules/qtshadertools-everywhere-src-6.8.0.tar.xz
tar xf qtshadertools-everywhere-src-6.8.0.tar.xz
wget https://download.qt.io/official_releases/qt/6.8/6.8.0/submodules/qtdeclarative-everywhere-src-6.8.0.tar.xz
tar xf qtdeclarative-everywhere-src-6.8.0.tar.xz
You have to check dependencies at ~/workspace/qt-rpi-cross-compilation/qt6/src/qtdeclarative-everywhere-src-6.8.0/dependencies.yaml and ~/workspace/qt-rpi-cross-compilation/qt6/src/qtshadertools-everywhere-src-6.8.0/dependencies.yaml.
Make sure required modules should be built and installed first.