Bug#1060267: <triplet>-qmake: emits wrong QT_HOST_LIBEXECS - fix
Package: qmake6
Version: 6.4.2+dfsg-21
Followup-For: Bug #1060267
X-Debbugs-Cc: maarten@railconnected.eu
Dear Maintainer,
Cross building with qmake6 fails due to QT_HOST_LIBEXECS having a wrong
value. For completeness: QT_HOST_LIBEXECS refers to the config file
variable HostLibraryExecutables, and is internally referred to as
QMakeLibraryInfo::HostLibraryExecutablesPath and
QMakeLibraryInfo::LibraryPathQMakeExtras::HostLibraryExecutablesPath in
the qmake source code.
The issue is that HostLibraryExecutables defaults to the *default* value
of LibraryExecutables. LibraryExecutables is set to the right value (a
concatenation of Prefix + LibraryExecutables with the value
"/usr/lib/qt6/libexec"), but its default value is Prefix + "libexec".
As the cross build config /usr/lib/<multiarch>/qt6/qt6.conf specifies
Prefix as "/usr", the default of LibraryExecutables, and hence the
default of HostLibraryExecutables, is now "/usr/libexec", which is the
wrong value.
The simple fix is to supply the value of HostLibraryExecutables in
/usr/lib/<multiarch>/qt6/qt6.conf explicitly:
...
HostLibraryExecutables=lib/qt6/libexec
...
The better fix would possibly be, upstream, to take the *actual* value
of LibraryExecutables as the default value for HostLibraryExecutables,
and not the default value.
This bug was observed on bookworm, trixie and sid, when cross building
on x86-64 for armel, and on each of these releases it was fixed by
adding the proposed line to qt6.conf. A diff to the source package:
*** qt6-base-6.4.2+dfsg/debian/qt.conf.in.orig 2024-02-13 03:28:31.532410597 +0100
--- qt6-base-6.4.2+dfsg/debian/qt.conf.in 2024-02-13 03:28:38.716318378 +0100
***************
*** 10,15 ****
--- 10,16 ----
HostLibraries=lib/@DEB_HOST_MULTIARCH@
Libraries=lib/@DEB_HOST_MULTIARCH@
LibraryExecutables=lib/qt6/libexec
+ HostLibraryExecutables=lib/qt6/libexec
Plugins=lib/@DEB_HOST_MULTIARCH@/qt6/plugins
Qml2Imports=lib/@DEB_HOST_MULTIARCH@/qt6/qml
Settings=/etc/xdg
For completeness I include a script below to demonstrate the problem and
the fix in a self-contained manner; save as gen-mre.sh and run: <<EOF
#!/bin/bash
# This script provides a minimum reproducible example of an issue plus
# fix in the qmake package. It creates an schroot environment and shows
# the failing command, and demonstrates the fix. It can be used to
# quickly test various Debian releases.
# It can be run multiple times without problems.
# Be warned that the resulting schroot environment is easily 2+ Gb in size.
# refuse to be sourced
return 0 2>/dev/null
if [ $# -lt 1 ]
then
echo "Usage: $0 [bookwork|testing|sid|...]"
exit
fi
if ! which debootstrap > /dev/null
then
echo "Cannot find debootstrap; check \$PATH."
echo "Refusing to run sbuild-createchroot."
exit
fi
BASEDIST=$1
MAX_LINE_LEN=$(stty size |awk '{print ($2>80)?$2:80}')
echo "Truncating lines to $MAX_LINE_LEN"
{ # All output is fed through sed to indent subprocess output; lines starting
# with @@ are not indented.
CHROOT_BASENAME=qt6-mre-$BASEDIST
echo "@@Looking for schroots named source.*$CHROOT_BASENAME..."
CHROOT=$(schroot -l |egrep "source.*$CHROOT_BASENAME")
if [ "$CHROOT" == "" ]
then
echo "Not found. Creating schroot..."
sbuild-createchroot --merged-usr --chroot-prefix=$CHROOT_BASENAME \
$BASEDIST $CHROOT_BASENAME
CHROOT=$(schroot -l |egrep "source.*$CHROOT_BASENAME")
if [ "$CHROOT" == "" ]
then
echo "Failed to create chroot, bailing out"
exit
fi
echo "schroot created with name $CHROOT"
else
echo "Found $CHROOT"
fi
run() {
echo "\$ $@"
schroot --chroot $CHROOT --directory /tmp -- "$@"
}
echo "@@Testing schroot..."
run cat /etc/debian_chroot
echo "@@Adding architecture armel..."
run sh -c "dpkg --add-architecture armel && apt-get -q update"
echo "@@Installing base utils..."
run apt-get -q -y install qt6-base-dev qmake6 libqt6core6 libqt6network6
run apt-get -q -y install qt6-base-dev:armel qmake6:armel libqt6core6:armel \
libqt6network6:armel
run apt-get -q -y install g++-arm-linux-gnueabi file wget
echo "@@Fetching demo application..."
for fn in http.pro authenticationdialog.ui httpwindow.cpp httpwindow.h main.cpp
do
URL=https://raw.githubusercontent.com/qt/qtbase/dev/examples/network/http/$fn
run wget -nc --no-verbose $URL
done
echo "@@Performing a simple build on the demo project..."
run sh -c "ls -al && qmake6 && make -j"
echo "@@Resulting binary:"
run ls -alh http
run file http
echo "@@The above is expected to show a valid native binary"
QT6CONF=/usr/lib/arm-linux-gnueabi/qt6/qt6.conf
LINE=HostLibraryExecutables=lib/qt6/libexec
echo "@@Removing proposed patch (will give an error on first run, no worries)"
run cp -v $QT6CONF.orig $QT6CONF
echo "@@Backing up unpatched $QT6CONF..."
run cp -v $QT6CONF $QT6CONF.orig
echo "@@Cross compiling for armel, without patch..."
run sh -c "arm-linux-gnueabi-qmake6 && make"
echo "@@The above is expected to give an error '/usr/libexec/uic: not found'"
echo "This is fixed by adding the following line to $QT6CONF"
echo " $LINE"
run sh -c "echo \"$LINE\" >> $QT6CONF"
echo "@@Cross compiling for armel, with patch..."
run sh -c "make clean && arm-linux-gnueabi-qmake6 && make -j"
echo "@@Resulting binary:"
run ls -alh http
run file http
echo "@@The above is expected to show a valid ARM binary of ~79K"
} 2>&1 | sed -e "s/^/ /;s/^ @@//;s/^\(.\{$MAX_LINE_LEN\}\).*/\1/"
EOF
The script shows various results (failing/succeeding builds) and
indicates what is expected.
Kind regards, Maarten
-- System Information:
Debian Release: trixie/sid
APT prefers testing
APT policy: (500, 'testing')
Architecture: amd64 (x86_64)
Foreign Architectures: armel
Kernel: Linux 4.19.0-10-amd64 (SMP w/8 CPU threads)
Locale: LANG=C.UTF-8, LC_CTYPE=C.UTF-8 (charmap=UTF-8) (ignored: LC_ALL set to C.UTF-8), LANGUAGE not set
Shell: /bin/sh linked to /usr/bin/dash
Init: unable to detect
Versions of packages qmake6 depends on:
ii perl 5.38.2-3
ii qmake6-bin 6.4.2+dfsg-21
qmake6 recommends no packages.
qmake6 suggests no packages.
-- no debconf information
Reply to: