My next step in creating a cross-platform Qt development environment is trying to set it up on a chroot and make it usable from Qt Creator, so that both buil-dependencies and cross-build-dependencies can be available even when they are not coinstallable.
Building a chroot
I built a chroot to host the armhf
build-dependencies:
$ sudo cdebootstrap stretch arm-linux-gnueabihf
$ sudo systemd-nspawn -D arm-linux-gnueabihf
# dpkg --add-architecture armhf
# apt update
# apt install qtbase5-dev qtbase5-dev-tools qtbase5-dev:armhf
The cross-compilers need to be outside the chroot. I tried to use cross-compilers installed inside the chroot while building outside the chroot, and they fail to link at runtime, since they expect their shared libraries to be in /usr.
I put this qt.conf
in the chroot:
[Paths]
Prefix=/home/enrico/…/arm-linux-gnueabihf/usr
ArchData=lib/arm-linux-gnueabihf/qt5
Binaries=lib/qt5/bin
Data=share/qt5
Documentation=share/qt5/doc
Examples=lib/arm-linux-gnueabihf/qt5/examples
Headers=include/arm-linux-gnueabihf/qt5
HostBinaries=bin
HostData=lib/arm-linux-gnueabihf/qt5
HostLibraries=lib/arm-linux-gnueabihf
Imports=lib/arm-linux-gnueabihf/qt5/imports
Libraries=lib/arm-linux-gnueabihf
LibraryExecutables=lib/arm-linux-gnueabihf/qt5/libexec
Plugins=lib/arm-linux-gnueabihf/qt5/plugins
Qml2Imports=lib/arm-linux-gnueabihf/qt5/qml
Settings=/etc/xdg
Translations=share/qt5/translations
TargetSpec=arm-linux-gnueabihf
I added the custom mkspecs to the chroot:
$ cd arm-linux-gnueabihf/usr/lib/arm-linux-gnueabihf/qt5/mkspecs/
$ sudo cp -r linux-g++ arm-linux-gnueabihf
$ sudo vi arm-linux-gnueabihf/qmake.conf
This is the content of usr/lib/arm-linux-gnueabihf/qt5/mkspecs/arm-linux-gnueabihf/qmake.conf
:
#
# qmake configuration for arm-linux-gnueabihf
#
MAKEFILE_GENERATOR = UNIX
CONFIG += incremental
QMAKE_INCREMENTAL_STYLE = sublib
include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)
QMAKE_RPATHLINKDIR += /home/enrico/…/arm-linux-gnueabihf/lib/arm-linux-gnueabihf
QMAKE_RPATHLINKDIR += /home/enrico/…/arm-linux-gnueabihf/usr/lib/arm-linux-gnueabihf
QMAKE_RPATHLINKDIR += /home/enrico/…/arm-linux-gnueabihf/usr/lib/
QMAKE_COMPILER = arm-linux-gnueabihf-gcc
QMAKE_CC = arm-linux-gnueabihf-gcc
QMAKE_LINK_C = $$QMAKE_CC
QMAKE_LINK_C_SHLIB = $$QMAKE_CC
QMAKE_CXX = arm-linux-gnueabihf-g++
QMAKE_LINK = $$QMAKE_CXX
QMAKE_LINK_SHLIB = $$QMAKE_CXX
load(qt_config)
Note QMAKE_RPATHLINKDIR
, which was not present in the
previous post:
since linking needs to happen against libraries in
/home/enrico/…/arm-linux-gnueabihf/…
, we need to tell the linker not to go
and search in /
.
The extra QMAKE_RPATHLINKDIR
pointing to usr/lib
is a workaround for
libsrtp0
installing files outside multiarch directories
(#765173):
# dpkg -L libsrtp0 | grep usr/lib
/usr/lib
/usr/lib/libsrtp.so.0.0
/usr/lib/libsrtp.so.0
(libsrtp0
is a dependency of libqt5webenginecore5
)
I changed the wrapper /usr/local/bin/qmake-arm-linux-gnueabihf
to point to the chroot:
#!/usr/bin/python3
import sys, os
QT_CONFIG = "/home/enrico/…/arm-linux-gnueabihf/qt.conf"
argv0 = os.path.join(os.path.dirname(sys.argv[0]), "qmake")
if len(sys.argv) == 1:
os.execv("/usr/bin/qmake", [argv0] + sys.argv[1:])
else:
os.execv("/usr/bin/qmake", [argv0] + sys.argv[1:] + ["-qtconf", QT_CONFIG])
And it all works. Even the test application that requires QtWebEngine builds and links fine.
Credits
This has been done as part of my work with Truelite.