The jfjoch_viewer runtime pulled a large dynamic .so tail that traces to two
Qt-side integrations, neither of which the viewer actually needs:
- Qt6::DBus -> system libdbus-1.so -> libsystemd (libzstd/liblz4/libcap/
libgcrypt/libgpg-error) + libselinux (libpcre2). The viewer is a pure
session-bus client (registers ch.psi.jfjoch_viewer + exports an adaptor for
single-instance/remote-control), so the daemon-side systemd/selinux features
are irrelevant. Build a static libdbus from source with those integrations
disabled and link it into the viewer, the same from-source-static pattern
already used for OpenSSL. Swap the dbus dev package for expat (dbus's
configure-time dep; the client libdbus-1 links neither expat nor systemd) so
nothing pulls the system shared dbus back in.
Qt discovers dbus through find_package(DBus1) (its FindWrapDBus1.cmake), NOT
pkg-config -- so point it at our build with -DDBus1_DIR=<prefix>/lib/cmake/
DBus1 (the CMake package config dbus installs, which imports libdbus-1.a) and
force QT_FEATURE_dbus_linked=ON so QtDBus links the archive instead of
dlopen'ing a (now nonexistent) libdbus-1.so.3 at runtime.
- Qt's glib event-dispatcher -> libglib-2.0/libgthread/libpcre. Nothing in the
viewer (or any lib it links) drives a GLib main context, so switch Qt to its
own QEventDispatcherUNIX via QT_FEATURE_glib=OFF and drop the glib dev package.
Applied identically across rocky8, rocky9, ubuntu2204, ubuntu2404.
Note: system libcrypto still appears at runtime, but it is dragged in by the
dynamic system krb5/GSSAPI (built against OpenSSL on RHEL/Rocky), which we keep
dynamic for the planned httpd-reverse-proxy Kerberos auth -- not from Qt or curl,
which both statically link the from-source OpenSSL.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>