# Packaging-level changes to the wasm32 cross build: no source is patched.
# Everything Debian's own build profiles (xbuild.py PROFILES) cannot express
# is here, one line each, so the whole list can be shown as it is:
#
#   SOURCE  cut DEP      the Build-Depends DEP is left out of SOURCE's build
#                        (its configure finds no DEP and builds without it)
#   SOURCE  keep DEP     DEP is a Build-Depends of SOURCE as well: what a
#                        cut one's own Depends brought the build
#   SOURCE  drop BIN     the binary package BIN is not built (DH_OPTIONS -N)
#   SOURCE  cmake VAR=V  CMake cache VAR forced to V, over what debian/rules
#                        passes (gexcc's toolchain file, after -D)
#   SOURCE  exclude X    debhelper leaves out files (and .install lines) whose
#                        names contain X (DH_OPTIONS -X): what a cut stops
#                        the build making
#   SOURCE  meson OPT=V  meson option OPT set to V, over what debian/rules
#                        passes (the env's meson wrapper, after the rules' -D)
#   SOURCE  make VAR=V   make variable VAR=V over what the makefiles set
#                        (MAKEFLAGS, so a command-line variable to every make)
#   SOURCE  env VAR=V    VAR=V in the environment of SOURCE's build
#   SOURCE  autoconf VAR=V  VAR=V in a site file configure reads after its
#                        options (with_X=no over the rules' --with-X)
#                        (env and autoconf values: @CROSS@ is this directory,
#                        @SYSROOT@ the target's sysroot; cmake values take
#                        both too)
#   SOURCE  profile P    Debian build profile P for SOURCE alone
#   SOURCE  profile !P   SOURCE built without the default profile P
#   SOURCE  arch BIN     BIN's Architecture list (the ports it names) gains
#                        musl-linux-wasm32, as a port adds itself
#   SOURCE  patch FILE   debian/patches/SOURCE/FILE, a source change (debsrc.py
#                        applies it); only where packaging cannot do it
#   SOURCE  suite S      SOURCE's package comes from Debian's suite S (a later
#                        release that has the port) instead of trixie
#   SOURCE  version SUF  SOURCE's binaries are version VERSION+SUF (after a
#                        binNMU's +bN): what differs from Debian's build of
#                        the same version gets a version of its own. Refused
#                        for a source with a Multi-Arch: same binary: apt
#                        installs such a package for two architectures only
#                        at one version, so Debian's arm64 copy, which an
#                        arm64 program apt installs needs, could not go in
#                        beside ours
#   SOURCE  headers BIN  SOURCE is not built: its binary package BIN, Debian's
#                        own build-machine deb, is repacked for the target
#                        (refused if it holds anything compiled); a source
#                        that needs one of SOURCE's other packages (a
#                        compiled library) stops with that said
#
# then `| why | what is lost`. `RUNTIME:` in what is lost marks something a
# Plasma session uses at run time.

qt6-base  cut libgtk-3-dev                | gtk+3.0 alone pulls ~300 sources (colord, sane, Qt5, PulseAudio, samba) | the GTK3 platform theme (GTK file dialogs and colours in Qt apps outside Plasma)
qt6-base  drop qt6-gtk-platformtheme      | it is the GTK3 theme plugin | as above
qt6-base  cmake FEATURE_gtk3=OFF          | debian/rules passes -DFEATURE_gtk3=ON | as above
qt6-base  exclude Qt6QGtk3ThemePlugin      | qt6-base-dev lists the plugin's CMake files | as above
qt6-base  cut default-libmysqlclient-dev  | MySQL client library (mysql-defaults, mariadb) | the QMYSQL SQL driver
qt6-base  drop libqt6sql6-mysql           | it is the QMYSQL driver | as above
qt6-base  cmake FEATURE_sql_mysql=OFF     | debian/rules passes -DFEATURE_sql_mysql=ON | as above
qt6-base  exclude Qt6QMYSQLDriverPlugin    | qt6-base-dev lists the driver's CMake files | as above
qt6-base  cmake FEATURE_xcb_glx_plugin=OFF | gex's libGL has no GLX 1.3 pbuffer or context queries (glXCreatePbuffer, glXQueryContext) | Qt's GLX path on X11; Qt uses EGL there instead
qt6-base  exclude libqxcb-glx-integration.so | the plugin is not built | as above
qt6-base  exclude Qt6QXcbGlxIntegrationPlugin | qt6-base-dev lists the plugin's CMake files | as above
qt6-base  cut libpq-dev                   | PostgreSQL (postgresql-17 pulls systemtap, avahi, gtk3) | the QPSQL SQL driver
qt6-base  drop libqt6sql6-psql            | it is the QPSQL driver | as above
qt6-base  cmake FEATURE_sql_psql=OFF      | debian/rules passes -DFEATURE_sql_psql=ON | as above
qt6-base  exclude Qt6QPSQLDriverPlugin     | qt6-base-dev lists the driver's CMake files | as above
qt6-base  cut firebird-dev                | Firebird (firebird4.0, a database server) | the QIBASE SQL driver (debian/rules turns it off with the package)
qt6-base  drop libqt6sql6-ibase           | it is the QIBASE driver | as above
qt6-base  exclude Qt6QIBaseDriverPlugin    | qt6-base-dev lists the driver's CMake files | as above
qt6-base  cut libcups2-dev                | cups pulls avahi, gnutls, krb5 and apache2 | printing from Qt apps (QPrintDialog lists no printers); there are no printers in the page
qt6-base  cmake FEATURE_cups=OFF          | debian/rules passes -DFEATURE_cups=ON | as above
qt6-base  exclude libcupsprintersupport.so | libqt6printsupport6 lists the CUPS plugin | as above
qt6-base  exclude Qt6QCupsPrinterSupportPlugin | qt6-base-dev lists the plugin's CMake files | as above
qt6-base  cut libproxy-dev                | libproxy pulls NetworkManager, webkit2gtk and duktape | PAC/WPAD proxy discovery (Qt's system proxy reads the environment only)
qt6-base  cmake FEATURE_libproxy=OFF      | debian/rules passes -DFEATURE_libproxy=ON | as above
qt6-base  cut liblttng-ust-dev            | LTTng userspace tracing (ust, liburcu, numactl) | Qt's LTTng trace points
qt6-base  exclude qt-android-runner.py   | installed only by an Android-capable host build | nothing (an Android deployment helper)
qt6-declarative  drop qml6-module-qmltime | its tools built for the target (debian/rules' QT_BUILD_TOOLS_WHEN_CROSSCOMPILING) are qmltime_native, and the module's qmltypes file is named after that | the qmltime benchmark's QML module
qt6-declarative  exclude qmltime_native  | the dropped module's qmltypes file is left in debian/tmp, which dh_missing fails on | as above
qt6-declarative  cmake CMAKE_DISABLE_FIND_PACKAGE_Qt6LinguistTools=ON | the sysroot holds every package built so far, qt6-tools's Qt6LinguistTools among them (built after this source on a first pass); Debian's build has none (not a Build-Depends), and with it the qml-i18n example is built, which no package installs and dh_missing fails on | nothing
dbus      cut libapparmor-dev             | apparmor's source needs apache2-dev (mod_apparmor) | AppArmor mediation in dbus-daemon (gex has no AppArmor)
dbus      meson apparmor=disabled        | debian/rules passes -Dapparmor=enabled | as above
libinput  cut libgtk-3-dev                | gtk+3.0 again (only for libinput's debug-gui tool; meson's debug-gui is auto) | `libinput debug-gui`, a developer tool
harfbuzz  cut libchafa-dev                | chafa pulls tiff, libavif, aom, dav1d | hb-view's terminal (chafa) output
harfbuzz  meson chafa=disabled             | debian/rules passes -Dauto_features=enabled | as above
libtool   cut gfortran                    | a Fortran compiler for the build machine, used only by libtool's own Fortran tests | nothing in libltdl (libtool's Fortran support is configured on the build machine)
xxhash    env CC=wasm32-linux-musl-gcc    | debian/rules' install step runs make without the CC dh_auto_build passed, and relinks xxhsum with `cc` | nothing
# libbsd does not build: src/local-elf.h (for nlist(3), reading a program's
# ELF symbols) stops at "#error Unknown ELF machine type" on wasm32. Its two
# users here take it for arc4random and have their own fallbacks:
libxdmcp  cut libbsd-dev                  | libbsd does not build (above); configure falls back from arc4random_buf to getentropy | nothing
expat     cut libbsd-dev                  | libbsd does not build (above); expat seeds its hash from getrandom instead of arc4random | nothing
# qcoro builds once for Qt 5 and once for Qt 6 (debian/rules configures
# both); Plasma 6 uses the Qt 6 one. Both configures get Qt 6, and the Qt 5
# packages are not built:
qcoro     cut qtbase5-dev                 | Qt 5 (qtbase-opensource-src pulls PulseAudio, samba, cups, gtk3) | the Qt 5 build of qcoro, which nothing in Plasma 6 uses
qcoro     cut qtbase5-private-dev         | as above | as above
qcoro     cut qtdeclarative5-dev          | as above | as above
qcoro     cut qtdeclarative5-private-dev  | as above | as above
qcoro     cut libqt5websockets5-dev       | as above | as above
qcoro     cmake USE_QT_VERSION=6          | debian/rules' first configure passes -DUSE_QT_VERSION=5 | as above
qcoro     drop libqcoro5core0t64          | Qt 5 build | as above
qcoro     drop libqcoro5dbus0t64          | Qt 5 build | as above
qcoro     drop libqcoro5network0t64       | Qt 5 build | as above
qcoro     drop libqcoro5qml0t64           | Qt 5 build | as above
qcoro     drop libqcoro5quick0t64         | Qt 5 build | as above
qcoro     drop libqcoro5websockets0t64    | Qt 5 build | as above
qcoro     drop qcoro-qt5-dev              | Qt 5 build | as above
# Debian's stage1 bootstrap profile, for the sources whose full build needs
# what is built after them (systemd: libsystemd and libudev only)
systemd     profile stage1    | systemd's full build needs much of the archive | everything of systemd but libsystemd and libudev (gex runs no init system)
util-linux  cut systemd                | the init system itself (its stage1 build here is libsystemd and libudev only); util-linux takes only its unit directory from it | nothing (no units are installed for an init that does not run)
pam         profile stage1    | its full build needs libaudit | PAM's audit logging
krb5        profile stage1    | its full build needs openldap and cyrus-sasl2 | Kerberos' LDAP KDB backend and SASL
libffi      cut dejagnu       | the test suite's runner, not guarded by nocheck | nothing (tests are not run)

libgudev  cut libgirepository1.0-dev      | a target gobject-introspection build runs wasm32 programs during the build (cross-exe-wrapper) and pulls cairo and python3 | the GUdev GObject introspection data (gir1.2-gudev-1.0): GUdev from Python or GJS; nothing in a Plasma session
libgudev  drop gir1.2-gudev-1.0           | it is the introspection data | as above
libgudev  meson introspection=disabled    | debian/rules passes -Dintrospection=enabled | as above
libgudev  exclude gir-1.0                 | libgudev-1.0-dev lists usr/share/gir-1.0/ | as above
harfbuzz  cut libgirepository1.0-dev      | as libgudev: a target gobject-introspection | HarfBuzz's introspection data (gir1.2-harfbuzz-0.0); nothing in a Plasma session
harfbuzz  cut gir1.2-freetype2-2.0-dev    | the introspection build's inputs | as above
harfbuzz  cut gir1.2-gobject-2.0-dev      | as above | as above
harfbuzz  drop gir1.2-harfbuzz-0.0        | it is the introspection data | as above
harfbuzz  meson introspection=disabled    | debian/rules passes -Dauto_features=enabled | as above
harfbuzz  exclude .gir                    | libharfbuzz-dev lists the .gir | as above
harfbuzz  cut libcairo2-dev               | cairo is only for hb-view and libharfbuzz-cairo; it pulls ghostscript and more | libharfbuzz-cairo0 (HarfBuzz drawing through cairo); Qt does not use it
harfbuzz  drop libharfbuzz-cairo0         | it is the cairo half | as above
harfbuzz  meson cairo=disabled            | debian/rules passes -Dauto_features=enabled | as above

# Source patches: two, both where the wasm32 port itself is missing
libffi    patch 0001-wasm32-backend.patch      | a missing port: libffi's wasm32 backend is emscripten's (calls through JavaScript); the patch puts in gexcc's plain-C backend, debdemo's debian/libffi-wasm32 (ffi.c, and tramp.inc from its gen.py), from gex's tools/gexcc/debian | nothing; without it there is no libffi (wayland, glib)
glib2.0   patch 0001-no-weak-lsan-on-wasm.patch | an undefined weak function whose address is taken becomes a GOT.func import gex's loader cannot satisfy | nothing (LeakSanitizer hooks); the loader taking weak imports as null would replace it

# Source patches where C calls a function through a pointer of another type
# (wasm checks an indirect call's type and traps)
libxt     patch 0001-resconfig-eh-four-args.patch | Create.c registers the three-argument _XtResourceConfigurationEH as a four-argument XtEventHandler: every Xt program trapped at its shell's first PropertyNotify | nothing (the handler takes the fourth argument, unused)
kf6-ki18n patch 0001-iso-codes-runtime-prefix.patch | gexcc's cross pkg-config gives iso-codes' prefix under the sysroot, and config.h and config-localedata.h compiled that build-machine path in as where iso-codes is at run time (the release leak check's one hit, in libKF6I18nLocaleData) | nothing (the build still reads the sysroot's JSON)
x11-utils patch 0001-xfontsel-free-font-names-work-piece.patch | xfontsel schedules XFreeFontNames (it returns an int) as a void work piece | nothing (a void work piece calls it)

libjpeg-turbo cut default-jdk             | a JDK for the Java binding, which debian/rules builds only on its JAVA_ARCHS (wasm32 is not one) | nothing (libturbojpeg-java is Arch: all, not built here)
icu       make GENCCODE_ASSEMBLY=        | configure picks genccode's `-a gcc` for any *-linux* gcc: ELF assembly (.type x,%object), which the wasm assembler does not take; without it pkgdata writes the data as C | nothing (the same data, compiled from C)
openssl   env OPENSSL_LOCAL_CONFIG_DIR=@CROSS@/openssl | debian/rules configures the target debian-$(DEB_HOST_ARCH), which Debian's 20-debian.conf has only for its own architectures; openssl/50-wasm32.conf adds debian-musl-linux-wasm32 (linux-generic32, no assembly) | nothing (generic C instead of assembly: slower crypto)

# Plasma 6 on Qt 6 only: the Qt 5 half of each source that builds both. debian/rules
# configures its default build directory without a Qt version (Qt 5); the forced
# cache variable makes that directory a second Qt 6 build, and its packages are dropped.
polkit-qt-1 cmake QT_MAJOR_VERSION=6     | debian/rules builds Qt 5 and Qt 6; Qt 5 pulls qtbase-opensource-src and with it PulseAudio, samba, gtk3, Python | polkit-qt for Qt 5 apps
polkit-qt-1 cut qtbase5-dev              | the Qt 5 half's | as above
polkit-qt-1 drop libpolkit-qt5-1-dev     | a Qt 5 package | as above
polkit-qt-1 drop libpolkit-qt5-1-1       | a Qt 5 package | as above
packagekit-qt cmake BUILD_WITH_QT6=ON      | debian/rules builds Qt 5 and Qt 6; Qt 5 pulls qtbase-opensource-src and with it PulseAudio, samba, gtk3, Python | PackageKit for Qt 5 apps
packagekit-qt cut qtbase5-dev              | the Qt 5 half's | as above
packagekit-qt drop libpackagekitqt5-1      | a Qt 5 package | as above
packagekit-qt drop libpackagekitqt5-dev    | a Qt 5 package | as above
qca2       cmake BUILD_WITH_QT6=ON      | debian/rules builds Qt 5 and Qt 6; Qt 5 pulls qtbase-opensource-src and with it PulseAudio, samba, gtk3, Python | QCA for Qt 5 apps
qca2       cut qtbase5-dev              | the Qt 5 half's | as above
qca2       drop libqca-qt5-2            | a Qt 5 package | as above
qca2       drop libqca-qt5-2-plugins    | a Qt 5 package | as above
qca2       drop qca-qt5-2-utils         | a Qt 5 package | as above
qca2       drop libqca-qt5-2-dev        | a Qt 5 package | as above
libqaccessibilityclient cmake BUILD_WITH_QT6=ON      | debian/rules builds Qt 5 and Qt 6; Qt 5 pulls qtbase-opensource-src and with it PulseAudio, samba, gtk3, Python | the accessibility client for Qt 5 apps
libqaccessibilityclient cut qtbase5-dev              | the Qt 5 half's | as above
libqaccessibilityclient drop libqaccessibilityclient-qt5-dev | a Qt 5 package | as above
libqaccessibilityclient drop libqaccessibilityclient-qt5-0 | a Qt 5 package | as above
qtkeychain cmake BUILD_WITH_QT6=ON      | debian/rules builds Qt 5 and Qt 6; Qt 5 pulls qtbase-opensource-src and with it PulseAudio, samba, gtk3, Python | QtKeychain for Qt 5 apps
qtkeychain cut qtbase5-private-dev      | the Qt 5 half's | as above
qtkeychain cut qttools5-dev             | the Qt 5 half's | as above
qtkeychain cut qttools5-dev-tools       | the Qt 5 half's | as above
qtkeychain drop libqt5keychain1         | a Qt 5 package | as above
qtkeychain drop qt5keychain-dev         | a Qt 5 package | as above
qtkeychain drop qtkeychain-qt5-dev      | a Qt 5 package | as above
qtkeychain arch libqt6keychain1         | Debian lists the ports Qt 6 is built on for the Qt 6 half | nothing
qtkeychain arch qtkeychain-qt6-dev      | as above | nothing
breeze     cmake BUILD_QT5=OFF          | debian/rules builds Qt 5 and Qt 6; Qt 5 pulls qtbase-opensource-src and with it PulseAudio, samba, gtk3, Python | VISIBLE: the Breeze widget style for Qt 5 apps (a Qt 5 app would draw in Fusion); no app in our set is Qt 5
breeze     cut libkf5config-dev         | the Qt 5 half's | as above
breeze     cut libkf5configwidgets-dev  | the Qt 5 half's | as above
breeze     cut libkf5coreaddons-dev     | the Qt 5 half's | as above
breeze     cut libkf5guiaddons-dev      | the Qt 5 half's | as above
breeze     cut libkf5i18n-dev           | the Qt 5 half's | as above
breeze     cut libkf5iconthemes-dev     | the Qt 5 half's | as above
breeze     cut libkf5kcmutils-dev       | the Qt 5 half's | as above
breeze     cut libkf5style-dev          | the Qt 5 half's | as above
breeze     cut libkf5windowsystem-dev   | the Qt 5 half's | as above
breeze     cut libqt5x11extras5-dev     | the Qt 5 half's | as above
breeze     cut qtbase5-dev              | the Qt 5 half's | as above
breeze     cut qtdeclarative5-dev       | the Qt 5 half's | as above
breeze     drop kde-style-breeze-qt5    | a Qt 5 package | as above
kdegraphics-mobipocket cmake QT_MAJOR_VERSION=6     | debian/rules builds Qt 5 and Qt 6; Qt 5 pulls qtbase-opensource-src and with it PulseAudio, samba, gtk3, Python | the Qt 5 Mobipocket reader library
kdegraphics-mobipocket cut libkf5kio-dev            | the Qt 5 half's | as above
kdegraphics-mobipocket cut qtbase5-dev              | the Qt 5 half's | as above
kdegraphics-mobipocket drop libqmobipocket-dev      | a Qt 5 package | as above
kdegraphics-mobipocket drop libqmobipocket2         | a Qt 5 package | as above
plasma-desktop cut libkaccounts6-dev     | KAccounts (kaccounts-integration) is built against KF5 too (kio, wallet, kcmutils 5; qcoro-qt5), and pulls signond and libaccounts-qt | the Online Accounts KCM and its integration (no accounts in the page)
libksysguard cut libpcap-dev             | libpcap pulls bluez, and through it alsa's Python, systemtap, avahi and gtk3 | per-application network usage in System Monitor (its network plugin and helper)
libksysguard exclude ksgrd_network_helper | the helper is not built without libpcap | as above
libksysguard exclude ksysguard_plugin_network | the plugin is not built without libpcap | as above
alsa-lib  cut libpython3-dev              | the target's Python is not built; Debian's rules enable the mixer Python module (--enable-mixer-pymods) | the Python mixer module, smixer-python.so in libasound2-plugin-smixer
alsa-lib  autoconf enable_python=no      | as above: without it configure takes the build machine's python3-config include flags | as above
alsa-lib  drop libasound2-plugin-smixer  | Debian's build puts only the Python mixer module in it (the other simple-mixer modules are off) | as above
kf6-solid cut libimobiledevice-dev        | libimobiledevice and libplist build Python bindings with no knob, which pull CPython and through it systemtap, avahi and gtk3 | Solid's iPhone/iPad backend (no USB devices in the page)
kf6-solid cut libplist-dev                | as above | as above
zxing-cpp cut python3-dev                 | the Python module, which pulls CPython (as above) | python3-zxing-cpp (nothing in a Plasma session)
zxing-cpp cmake ZXING_PYTHON_MODULE=OFF   | debian/rules passes -DZXING_PYTHON_MODULE=ON | as above
zxing-cpp drop python3-zxing-cpp          | it is the Python module | as above
libcanberra cut libpulse-dev              | PulseAudio pulls samba, bluez, gtk3 and Qt 5 (as qt6-base's cuts) | RUNTIME: KDE's event sounds have no PulseAudio or GStreamer backend, ALSA only (the page has no ALSA device either: no notification sounds)
libcanberra cut libgstreamer1.0-dev       | GStreamer pulls gobject-introspection and CPython | as above
libcanberra cut libgtk-3-dev              | the GTK3 module only (Plasma does not load it) | libcanberra-gtk3-module (GTK3 apps' event sounds)
libcanberra make DEB_CONFIGURE_EXTRA_FLAGS=--disable-pulse --disable-gstreamer --disable-gtk --disable-gtk3 --disable-gtk-doc --with-builtin=dso --enable-alsa --disable-oss --disable-tdb | debian/rules passes --enable-pulse --enable-gstreamer and --enable-tdb (ALSA as Debian sets it for Linux) | as above
libcanberra drop libcanberra-pulse        | the PulseAudio backend | as above
libcanberra drop libcanberra-gstreamer    | the GStreamer backend | as above
libcanberra drop libcanberra-gtk3-0       | GTK3 | as above
libcanberra drop libcanberra-gtk3-dev     | GTK3 | as above
libcanberra drop libcanberra-gtk3-module  | GTK3 | as above
libcanberra drop libcanberra-gtk-common-dev | GTK3 | as above
libcanberra drop gnome-session-canberra   | GTK3 | as above
libcanberra cut libtdb-dev                | tdb is built by the samba source in trixie | the sound lookup cache (each event sound is looked up again)
libcanberra patch 0001-rules-no-gtk3.patch | debian/rules only (packaging): the rules copy a .desktop file into a directory only the GTK3 module's install makes | nothing beyond the GTK3 lines above
breeze    cut kirigami2-dev               | the Qt 5 half's (Kirigami 2 for the Qt 5 style's config) | as breeze above
kf6-kfilemetadata cut libavcodec-dev      | ffmpeg (and through it SDL, PipeWire, x264, vlc) | Baloo's audio/video metadata (duration, codec) for media files
kf6-kfilemetadata cut libavdevice-dev     | as above | as above
kf6-kfilemetadata cut libavformat-dev     | as above | as above
kf6-kfilemetadata cut libavutil-dev       | as above | as above
kf6-kfilemetadata cut libpostproc-dev     | as above | as above
kf6-kfilemetadata cut libswscale-dev      | as above | as above
plasma5support cut libkf6networkmanagerqt-dev | NetworkManager (libnm) pulls bluez, ModemManager, evolution-data-server | RUNTIME: Plasma's network data engine has no NetworkManager (the page has no NetworkManager either)
plasma5support drop libplasma-geolocation-interface6 | the geolocation data engine is built only with NetworkManagerQt (cut above) | RUNTIME: no geolocation provider (the weather and night-light location come from settings)
plasma5support drop libplasma-geolocation-interface-dev | as above | as above
plasma-workspace cut libkf6networkmanagerqt-dev | as plasma5support | RUNTIME: as above (no network status in Plasma)
plasma-workspace cut libpipewire-0.3-dev  | PipeWire pulls bluez, GStreamer, PulseAudio, libcamera | RUNTIME: no PipeWire: the camera indicator applet; no sound server at all in the session
plasma-workspace cut libkpipewire-dev     | as above (kpipewire is PipeWire and ffmpeg) | PipeWire window thumbnails (Wayland only; X11 thumbnails are KWin's own)
plasma-workspace cut libkf6userfeedback-dev | KUserFeedback pulls Qt Charts and Qt Multimedia | the telemetry KCM (off by default)
plasma-workspace env DEB_CXXFLAGS_MAINT_STRIP=-g DEB_CFLAGS_MAINT_STRIP=-g | wasm-ld (LLD 22) segfaults writing kde-systemd-start-condition's .debug_info from libPlasmaAutostart's plasmaautostart.cpp.o; built without debug info | nothing (dh_strip removes it from the packages, and no -dbgsym is built)
kwin      cut libpipewire-0.3-dev         | as plasma-workspace | RUNTIME: KWin's screencast plugin (Wayland screen sharing; the X11 session does not use it)
kwin      cmake QTWAYLANDSCANNER_KDE_EXECUTABLE=QTWAYLANDSCANNER_KDE_EXECUTABLE-NOTFOUND | debian/rules names Qt's qtwaylandscanner for a cross build, whose code includes the protocol's header by the XML file's name, not the BASENAME kwin gives it (plasma-virtual-desktop); kwin then builds its own scanner (qtwaylandscanner_kde) for the build machine, as upstream does when cross-compiling | nothing
kwin      cmake KF6_HOST_TOOLING=@SYSROOT@/usr/lib/wasm32-linux-musl/cmake | kwin's scanner build asks for it; the target's own tool exports name the build machine's tools (as xbuild keeps them), so they are the host tooling | nothing
kwin      cmake NATIVE_PREFIX=/usr | the prefix that build of the scanner finds the build machine's Qt in (by default taken from KF6_HOST_TOOLING) | nothing
kwin      env DEB_CXXFLAGS_MAINT_APPEND='-include type_traits' | kwin builds as C++23, where libc++'s <utility> no longer pulls in <type_traits>, and Qt 6.8's qcompare_impl.h uses std::is_null_pointer_v having included only <utility> (libstdc++, Debian's compiler, still includes it) | nothing
kf6-kwallet cut libgpgme-dev              | gpgme1.0's rules build its Qt 5 and Python bindings with no knob (--enable-languages="python cpp qt5 qt6"), so gpgme pulls Qt 5 and CPython | GPG-encrypted wallets in KWallet (Blowfish wallets remain)
kf6-kwallet cut libgpgmepp-dev            | as above | as above
kf6-kpty cut libutempter-dev               | KPty runs the utempter helper (a setgid program, as a forked child of the terminal's own child) to write a utmp record for every terminal it opens: one more fork of a Konsole-sized process, about 0.7 s between the window and the shell | utmp records for terminal sessions (who and w do not list Konsole's shells)
kf6-kpty cmake CMAKE_DISABLE_FIND_PACKAGE_UTEMPTER=ON | debian/rules passes -DUTEMPTER_EXECUTABLE, so CMake finds the helper without libutempter-dev | as above
phonon    patch 0001-rules-qt6-only.patch    | debian/rules only (packaging, approved): it deletes two Qt 5 headers with rm -v and makes the Qt 5 library's shlibs, so the Qt 6-only build fails without it | nothing beyond the Qt 5 half below
phonon    cmake PHONON_BUILD_QT5=OFF       | debian/rules builds Qt 5 and Qt 6 in one tree (the option is ON by default); plasma-workspace needs Phonon4Qt6 | Phonon for Qt 5 apps
phonon    cut qtbase5-dev                  | the Qt 5 half's | as above
phonon    cut qttools5-dev                 | the Qt 5 half's | as above
phonon    cut libpulse-dev                 | PulseAudio (as libcanberra) | RUNTIME: Phonon's PulseAudio integration (no sound server in the page)
phonon    drop libphonon4qt5-4t64          | a Qt 5 package | Phonon for Qt 5 apps
phonon    drop libphonon4qt5-dev           | a Qt 5 package | Phonon for Qt 5 apps
phonon    drop libphonon4qt5experimental-dev | a Qt 5 package | Phonon for Qt 5 apps
phonon    drop libphonon4qt5experimental4t64 | a Qt 5 package | Phonon for Qt 5 apps
phonon    drop phonon4qt5                  | a Qt 5 package | Phonon for Qt 5 apps
phonon    drop phonon4qt5-backend-null     | a Qt 5 package | Phonon for Qt 5 apps
phonon    drop phonon4qt5settings          | a Qt 5 package | Phonon for Qt 5 apps
phonon    cmake PHONON_BUILD_SETTINGS=OFF  | the settings program is built for Qt 5 only (settings/CMakeLists.txt links Phonon::phonon4qt5), whatever PHONON_BUILD_QT5 says | Phonon's settings program (phonon4qt5settings, dropped above)
phonon    exclude phonon4qt6widgets        | debian/libphonon4qt6-dev.install takes it from the Qt 5 build's plugin directory (qt5/plugins/designer), where it lands only when Qt 5 is built too | Phonon's widget plugin for Qt Designer
qt6-multimedia cut libavcodec-dev         | ffmpeg pulls SDL, PulseAudio, PipeWire, x264, vlc; Qt only builds its ffmpeg backend with PulseAudio on Linux | RUNTIME: Qt Multimedia has no media backend (no audio/video playback; ALSA output only): Konsole's bell sound, KNotifyConfig's sound preview, Prison's camera scanner
qt6-multimedia cut libavdevice-dev        | as above | as above
qt6-multimedia cut libavfilter-dev        | as above | as above
qt6-multimedia cut libavformat-dev        | as above | as above
qt6-multimedia cut libavutil-dev          | as above | as above
qt6-multimedia cut libswscale-dev         | as above | as above
qt6-multimedia cut libpulse-dev           | PulseAudio (as libcanberra) | as above
qt6-multimedia cut libpipewire-0.3-dev    | PipeWire (as plasma-workspace) | as above
qt6-multimedia cut libpipewire-0.3-0t64   | debian/control names it in libqt6multimedia6's Depends (Qt opens it at run time), so every source built against Qt Multimedia would need PipeWire; the -dev is cut above | nothing more than above
qt6-multimedia cut libgstreamer1.0-dev    | GStreamer pulls gobject-introspection and CPython | as above
qt6-multimedia cut libgstreamer-plugins-base1.0-dev | as above | as above
qt6-multimedia exclude libffmpegmediaplugin | the ffmpeg backend is not built | as above
qt6-speech cut flite1-dev                 | an engine; flite pulls PulseAudio | RUNTIME: Qt TextToSpeech has no engine ("Speak Text" in Kate and KDE text fields does nothing)
qt6-speech cut libspeechd-dev             | speech-dispatcher pulls espeak-ng, PulseAudio, PipeWire | as above
qt6-speech drop qt6-speech-flite-plugin   | the flite engine | as above
qt6-speech drop qt6-speech-speechd-plugin | the speech-dispatcher engine | as above
plasma-desktop cut libsdl2-dev            | SDL pulls PulseAudio, PipeWire, ffmpeg | the game controller KCM
plasma-desktop keep libxkbfile-dev       | the keyboard KCM links X11::xkbfile (Debian's control does not name it) | nothing
plasma-desktop cmake BUILD_KCM_TOUCHPAD_X11=OFF | its X11 backend needs the synaptics driver's SDK (xserver-xorg-input-synaptics-dev) as well | touchpad settings under X11 (the KCM builds, with no X11 backend)
plasma-desktop cut libibus-1.0-dev        | IBus pulls gtk3, dconf, python3-gi | the input method panel's IBus backend (no input methods in the page)
plasma-desktop cut libscim-dev            | SCIM pulls gtk3 | the input method panel's SCIM backend
plasma-desktop exclude */libexec/        | the .install line for the input method panels' helpers (kimpanel-ibus-panel, kimpanel-scim-panel), which the two cuts above stop the build making | as above
plasma-desktop cut libaccounts-qt6-dev    | as libkaccounts6-dev (signond, libaccounts-glib) | as libkaccounts6-dev
plasma-desktop cut signon-plugin-oauth2-dev | as above | as above
plasma-desktop cut signon-plugins-dev     | as above | as above
kf6-ktexteditor cut libcups2-dev          | not used by its CMake (printing is Qt's, and qt6-base is built without CUPS); cups pulls avahi and gtk3 | none
kf6-kfilemetadata cut libpoppler-qt6-dev  | Poppler's Debian build also builds its Qt 5 half and pulls gpgme, nss, lcms | Baloo's PDF text and metadata extractor
kf6-kfilemetadata cut libappimage-dev     | libappimage pulls squashfuse, libarchive's whole chain, librsvg, cairo | metadata for AppImage files
kf6-frameworkintegration cut libappstreamqt-dev | appstream's Debian build also builds its Qt 5 half, with gir and the compose tools | the appstream: URL handler (opening Discover links); no Discover in the page anyway
kf6-frameworkintegration exclude appstreamhandler | not built without AppStreamQt | as above
plasma-workspace cut libappstreamqt-dev   | as kf6-frameworkintegration | the KRunner/Kickoff "install this application" results and the "uninstall" action
zxing-cpp cut pybind11-dev               | pybind11-dev depends on python3-dev, so CPython (as python3-dev above) | as above
qrencode cut libsdl2-dev                 | SDL is for the test suite's QR code viewer (--with-tests builds it when SDL is there); SDL pulls PulseAudio, PipeWire, ibus, fcitx | none (the viewer is not packaged)
libsecret cut libgirepository1.0-dev     | as libgudev: a target gobject-introspection (which pulls CPython, cairo, and through them avahi and gtk3) | libsecret's introspection data and Vala bindings (gir1.2-secret-1): libsecret from Python, GJS or Vala; nothing in a Plasma session
libsecret drop gir1.2-secret-1           | it is the introspection data | as above
libsecret meson introspection=false      | debian/rules passes -Dauto_features=enabled and the option defaults on | as above
libsecret meson vapi=false               | the Vala bindings are generated from the .gir | as above
libsecret meson gtk_doc=false            | gi-docgen documents the .gir | the HTML reference (libsecret-1-dev's usr/share/doc/libsecret-1-dev/html)
libsecret exclude .gir                   | libsecret-1-dev lists the .gir | as above
libsecret exclude .typelib               | gir1.2-secret-1 lists the typelib | as above
libsecret cut valac                      | the Vala bindings are off (vapi=false) | as above
libsecret exclude vala/vapi              | libsecret-1-dev lists them | as above
libsecret cut gi-docgen                  | the reference is off (gtk_doc=false) | the HTML reference, as above
libsecret exclude doc/libsecret-1        | libsecret-1-dev lists the reference | as above
libsecret exclude vala/vapi              | libsecret-1-dev lists the Vala bindings | as above
libsecret exclude doc/libsecret-1        | libsecret-1-dev lists the HTML reference | as above
audit profile pkg.audit.noldap           | audit's LDAP is only for its z/OS remote plugin; openldap and cyrus-sasl2 need each other | audispd's z/OS remote plugin
audit     patch 0001-rules-noldap-fixperms.patch | debian/rules only (packaging): with pkg.audit.noldap there is no audispd-plugins directory, and the rules chmod it unconditionally | nothing beyond the profile above
cyrus-sasl2 profile pkg.cyrus-sasl2.noldap | openldap and cyrus-sasl2 need each other; Debian's profile breaks the cycle on this side | SASL's ldapdb auxprop plugin (SASL accounts kept in LDAP)
cyrus-sasl2 profile pkg.cyrus-sasl2.nosql | the SQL auxprop plugin pulls MariaDB, PostgreSQL and SQLite clients | SASL's SQL auxprop plugin
icu       make PKGDATA_OPTS=-O $$(firstword $$(wildcard pkgdata.inc) $$(top_builddir)/data/icupkg.inc) -w | with no assembly type pkgdata writes an object file by copying the build machine's ELF header (genccode's match-arch), which gexcc's wasm objects are not; -w (--without-assembly) has it write the data as C, which ICU supports on every compiler. -O is each directory's own flags file (uconv's message library has pkgdata.inc, the data icupkg.inc), $$ so the rules' make passes it on unexpanded | nothing (the same data, compiled from C)
icu       patch 0001-data-filter-hook.patch | a hook, ICU_DATA_FILTER, for the list of data items the build packs from Debian's prebuilt archive: ICU filters its data only when it builds it from CLDR sources, which Debian's source does not ship | nothing (unset, the build is as before)
icu       env ICU_DATA_FILTER=@CROSS@/icu/data-filter.sh | libicudata is 31.9 MB, more than half of it the 900 locales' own names, currencies, units, zone names, spell-outs and collation tailorings, which nothing reads in the image's C.UTF-8 session (Qt formats from its own CLDR data); the filter keeps the root and English locales and all of the rest | the other locales' ICU data: an ICU user asked for one of them gets the root's (English names, the root collation order); RUNTIME: none in the session (13.9 MB left, 5.4 MB compressed against 10.2 MB)
# libselinux, then everything built with SELinux: libselinux's restorecon needs fts.h, which musl does not have (glibc's own); gex has no SELinux, so the libraries are built without it
util-linux cut libselinux1-dev           | libselinux needs fts (glibc's, not in musl) | none (gex has no SELinux: SELinux contexts in mount, ls -Z and the like)
util-linux autoconf with_selinux=no      | debian/rules passes --with-selinux | as above
pam       cut libselinux1-dev            | as util-linux | pam_selinux and pam_sepermit (no SELinux in gex)
pam       meson selinux=disabled         | the option is auto, with -Dauto_features=enabled from debhelper | as above
systemd   cut libselinux1-dev            | as util-linux | none (stage1 builds libsystemd and libudev; their SELinux labelling)
systemd   meson selinux=disabled         | debian/rules passes -Dselinux=enabled | as above
glib2.0   cut libselinux1-dev            | as util-linux | GIO's SELinux context attribute (selinux::context)
glib2.0   meson selinux=disabled         | debian/rules passes -Dselinux=enabled on Linux | as above
dbus      cut libselinux1-dev            | as util-linux | dbus-daemon's SELinux access checks
dbus      meson selinux=disabled         | debian/rules passes -Dselinux=enabled | as above
policykit-1 cut libselinux1-dev          | as util-linux; polkit's build does not use it | none
glib2.0   cut libelf-dev                 | elfutils needs fts, obstack and argp, which musl does not have (glibc's) | gresource's listing of resources inside ELF programs (wasm programs are not ELF anyway)
glib2.0   meson libelf=disabled          | the option is auto, with -Dauto_features=enabled from debhelper (Debian's own udeb build disables it) | as above
glib2.0   env GEXCC_LENIENT_CALLS=1      | GLib calls GObject's class and instance initialisers with two arguments where G_DEFINE_TYPE's take one, its marshallers pass a signal handler user data it may leave out, and a GFunc may be g_free: wasm traps on each, so gexcc cuts the trailing arguments as C on a real machine does (gex-dylink lenient-calls) | an indirect call in GLib's libraries costs a table.get and a ref.test more
bash      env GEXCC_LENIENT_CALLS=1      | bash's unwind-protect calls its cleanups through one function pointer type, whatever each takes or returns: wasm traps on the call (bash -c died at its first command's end, Konsole's shell at its start), so gexcc cuts the arguments and drops the result as C on a real machine does | an indirect call in bash costs a table.get and a ref.test more
accountsservice env GEXCC_LENIENT_CALLS=1 | gdbus-codegen's marshallers call each method's handler with the user data g_signal_connect passes, and the daemon's handlers leave it out: wasm trapped on the first call (accounts-daemon died at FindUserByName, so System Settings' Users page had no users) | an indirect call in accounts-daemon costs a table.get and a ref.test more
db5.3     autoconf enable_cxx=no         | its C++ API's sources include db's own atomic.h, whose atomic_init macro breaks libc++'s <atomic> (libstdc++'s headers do not pull it in) | the Berkeley DB C++ API (libdb5.3++); nothing in the closure uses it
db5.3     drop libdb5.3++t64             | as above | as above
db5.3     drop libdb5.3++-dev            | as above | as above
qt6-declarative cut liblttng-ust-dev     | as qt6-base (its trace points follow qtbase's lttng feature, which is off) | Qt Quick's LTTng trace points
libgcrypt20 autoconf enable_jent_support=no | random/jitterentropy-base.c refuses to build when optimised, and gexcc compiles at -O2 when the command line names no level (its Makefile only rewrites a named -O to -O0) | libgcrypt's CPU jitter entropy source; its RNG still seeds from getrandom
db5.3     profile pkg.db5.3.notcl      | its install runs tcltk-depends, a tool tcl-dev carries, which the sysroot has and the build machine does not | the Berkeley DB Tcl binding (libdb5.3-tcl); nothing in the closure uses it
# glibc's NSS modules: musl has no NSS (no <nss.h>, nothing loads them)
systemd   meson nss-myhostname=false     | musl has no NSS to load the module | the NSS modules (gex's libc never loads one)
systemd   meson nss-mymachines=disabled  | as above | as above
systemd   meson nss-resolve=disabled     | as above | as above
systemd   suite forky                    | systemd 257 builds on glibc only; 258 and later build on musl (meson libc=musl, their own kernel headers) | libsystemd's fibers (sd-future: gexcc's libucontext cannot switch stacks, so they fail with ENOSYS); libsystemd and libudev are 262's (their ABI is stable)
systemd   meson libc=musl                | debian/rules builds for glibc (the default) | nothing
systemd   exclude 50-pid-max.conf        | debian/systemd.install names it on every architecture but the 32-bit ones it lists, and wasm32 is not listed; meson installs it on 64-bit ones only | nothing (wasm32 is 32-bit: no such file is made)
systemd   meson nss-systemd=false        | as above | as above
systemd   drop libnss-myhostname         | as above | as above
systemd   drop libnss-mymachines         | as above | as above
systemd   drop libnss-resolve            | as above | as above
systemd   drop libnss-systemd            | as above | as above
krb5      cut libnss-myhostname          | its tests resolve the host name through it; systemd builds no NSS modules here | none (tests only)
pam       patch 0001-install-no-unix-update.patch | debian/libpam-modules-bin.install names unix_update, which pam_unix builds only with SELinux (packaging only) | nothing (the SELinux password helper)
libbsd    patch 0001-no-nlist-on-wasm32.patch | a missing port: nlist() needs the target's ELF machine (src/local-elf.h), and a wasm32 program is no ELF image | nlist() and __fdnlist (no program can have an ELF symbol table to read here)
libglu    meson b_lundef=false          | gex's GL driver (gex-gl) has no evaluators (glMap1f, glMap2f): libGLU's NURBS code leaves them to load time | GLU's NURBS curves and surfaces (an unbound function if called); nothing in the closure draws NURBS
unbound   autoconf with_ssl=@SYSROOT@/usr | its configure looks for OpenSSL's headers on the build machine's paths (a cross build of Debian's has them there; ours are in the sysroot) | nothing
unbound   autoconf with_libevent=@SYSROOT@/usr | as with_ssl: libevent's headers looked for on the build machine's paths | nothing
nghttp2   cut libjemalloc-dev           | jemalloc has no wasm32 port (no quantum for the architecture); only nghttp2's command-line tools use it | the tools' allocator (musl's malloc instead); libnghttp2 never used it
cln       autoconf cross_compiling=no   | its cross path finds each integer type's width by compiling `(type)2*2*...` until it is 0, which clang turns into a variable-length array once it overflows (gcc folds it), so int comes out 31 bits and long long 63; not cross, configure runs its own probe program, which gexcc's programs can on the build machine (through gex) | nothing (the probe's answers are the target's own)
boost1.83 headers libboost1.83-dev    | Plasma uses only header-only Boost (plasma-activities: boost/range, boost/container); Debian's boost has no build profiles, and its build needs MPI, Python with numpy, TeX Live and ports of Boost.Context and Coroutine to wasm32 | every compiled Boost library: none exists for wasm32 (a source needing libboost-*-dev other than the headers stops at its dependencies; CMake's find_package(Boost COMPONENTS ...) finds no component)
draco     cmake DRACO_TINYGLTF_PATH=@SYSROOT@/usr/include/stb | debian/rules names tinygltf's headers on the build machine's path (a cross build of Debian's has them there; ours are in the sysroot) | nothing
gettext   exclude preloadable_libintl     | gettext builds the LD_PRELOAD copy of libintl only on glibc (intl/configure.ac: GLIBC2); musl has its own gettext | preloadable_libintl.so, which traces a program's gettext calls by LD_PRELOAD
libcap2   make PAM_CAP=yes                | Make.Rules builds pam_cap only if the build machine has /usr/include/security/pam_modules.h; the target's PAM headers are in the sysroot | nothing
libcap2   patch 0001-psx-wasm32.patch      | a missing port: libpsx's own rt_sigaction structure lists the architectures it knows, and builds for no other (wasm32's is the generic one, as aarch64's) | nothing
systemd   patch 0001-architecture-wasm32.patch | a missing port: systemd lists the architectures it knows (uname machine, name, multiarch tuple) and builds for no other | nothing
systemd   patch 0002-syscalls-wasm32.patch      | a missing port: systemd numbers the system calls newer than the C library's per architecture; wasm32's are i386's (musl's wasm32 port) | nothing
systemd   patch 0003-dlopen-notes-elf-only.patch | a missing port: the dlopen notes (which libraries a binary may dlopen, for packaging tools) are ELF notes in ELF assembler; a wasm object has none | the .note.dlopen notes (read by packaging tools; nothing reads them at run time)
libverto  autoconf with_libevent=no       | Debian's build has no libevent-dev, so it builds no libevent module and packages none; ours finds libevent in the sysroot and dh_missing stops at the unpackaged module | nothing (Debian ships no libverto libevent module)
tiff      cut liblerc-dev                 | lerc's debian/rules cleans its Python binding with pybuild, which has no wasm32 sysconfig data (no target Python) | LERC-compressed TIFF images (a geospatial raster codec); nothing in a Plasma session
tiff      exclude share/man               | the nodoc profile builds no manual pages (they need sphinx), but the .install files still list their directories | the manual pages
libgudev  meson gtk_doc=false            | gtk-doc's helper runs the build machine's python3 with the target libraries' directories in LD_LIBRARY_PATH (the sysroot's libz.so.1 is wasm) | the HTML reference (libgudev-1.0-doc, Architecture: all, not built here)
libgudev  exclude gtk-doc/html/gudev     | libgudev-1.0-dev lists the reference, which gtk_doc=false does not make | as above
libdrm    exclude amdgpu_test            | the sysroot has CUnit (Debian's build has none, so builds no amdgpu_test and packages none); dh_missing stops at the unpackaged program | nothing (Debian ships no amdgpu_test)
libva     meson with_glx=no              | libva-glx calls GLX functions the GL provider's libGL does not have (glXQueryContext) | VA-API's GLX interop (libva-glx2); the DRM and X11 paths remain
libva     drop libva-glx2                | it is the GLX interop library | as above
krb5      autoconf krb5_cv_attr_constructor_destructor=yes,yes | configure runs a program to see constructor and destructor attributes work, and stops when cross compiling; gexcc runs both (wasm-ld's constructors, destructors through __cxa_atexit) | nothing
libinput  meson debug-gui=false          | 1.28 builds debug-gui by default (true, not auto); its GTK3 is cut above | as the libgtk-3-dev cut
krb5      autoconf ac_cv_func_regcomp=yes | configure runs a program to see regcomp works, and stops when cross compiling; musl's does | nothing
krb5      autoconf ac_cv_printf_positional=yes | configure runs a program to see printf takes positional arguments (%1$s), and stops when cross compiling; musl's does | nothing
# GObject introspection, as libgudev: a target gobject-introspection runs wasm32 programs during the build
at-spi2-core cut gir1.2-glib-2.0-dev     | as libgudev: the introspection build's inputs | the AT-SPI and ATK introspection data (gir1.2-atspi-2.0, gir1.2-atk-1.0): Python and GJS accessibility clients (Orca); Qt's bridge uses libatspi's D-Bus side
at-spi2-core cut gir1.2-gobject-2.0-dev  | as above | as above
at-spi2-core cut gir1.2-dbus-1.0-dev     | as above | as above
at-spi2-core drop gir1.2-atspi-2.0       | it is the introspection data | as above
at-spi2-core drop gir1.2-atk-1.0         | it is the introspection data | as above
at-spi2-core meson introspection=disabled | debian/rules passes -Dintrospection=enabled | as above
at-spi2-core exclude gir-1.0             | the -dev packages list usr/share/gir-1.0/ | as above
policykit-1 cut gir1.2-gio-2.0-dev       | as libgudev: the introspection build's input | polkit's introspection data (gir1.2-polkit-1.0): GJS and Python polkit agents; polkit-qt-1 links libpolkit directly
policykit-1 drop gir1.2-polkit-1.0       | it is the introspection data | as above
policykit-1 meson introspection=false    | debian/rules passes -Dintrospection=true | as above
policykit-1 make configure_flags=-Dgtk_doc=false -Dsession_tracking=logind | in a cross build the rules add --cross-file=wasm32-linux-musl-gobject-introspection.ini, which only a target gobject-introspection installs; these are the rest of the rules' Linux flags | as above
policykit-1 exclude .gir                 | the -dev packages list their .gir | as above
p11-kit   autoconf with_systemd=no        | configure looks for libsystemd itself and finds the sysroot's systemd (not a Build-Depends: Debian's build has none), whose user units debian/*.install does not list | nothing (Debian's p11-kit has no socket activation either)
libgit2   cut libkrb5-dev                | its FindGSSAPI runs krb5-config, a script of the target's krb5 that names the target's headers by absolute paths | Kerberos (GSSAPI) authentication of git over HTTP and SSH (kate's git plugin)
libgit2   cmake USE_GSSAPI=OFF           | debian/rules passes -DUSE_GSSAPI=ON | as above
qt6-tools  cmake CMAKE_DISABLE_FIND_PACKAGE_Qt6QmlLSPrivate=TRUE | qt6-declarative-dev ships the QmlLS target's CMake files without its static library (Debian lists libQt6QmlLS.a as not installed), so importing the target fails against a sysroot | Qt Assistant's help-engine plugin (helpplugin), which Debian does not ship
qt6-tools  exclude designer/libcontainerextension | Qt's Designer examples are not built in a cross build (only the assistant example is), so designer-qt6-plugins' example plugin is never made | Qt Designer's example plugin libcontainerextension.so (Designer itself and the qquickwidget plugin stay)
qt6-tools  exclude designer/libcustomwidgetplugin | Qt's Designer examples are not built in a cross build (only the assistant example is), so designer-qt6-plugins' example plugin is never made | Qt Designer's example plugin libcustomwidgetplugin.so (Designer itself and the qquickwidget plugin stay)
qt6-tools  exclude designer/libtaskmenuextension | Qt's Designer examples are not built in a cross build (only the assistant example is), so designer-qt6-plugins' example plugin is never made | Qt Designer's example plugin libtaskmenuextension.so (Designer itself and the qquickwidget plugin stay)

plasma-integration  cut libkf5config-dev           | its Qt5 half: KDE Frameworks 5 and Qt5 (48 sources) | the Plasma theme for Qt5 programs; the session has none
plasma-integration  cut libkf5configwidgets-dev    | its Qt5 half: KDE Frameworks 5 and Qt5 (48 sources) | the Plasma theme for Qt5 programs; the session has none
plasma-integration  cut libkf5guiaddons-dev        | its Qt5 half: KDE Frameworks 5 and Qt5 (48 sources) | the Plasma theme for Qt5 programs; the session has none
plasma-integration  cut libkf5i18n-dev             | its Qt5 half: KDE Frameworks 5 and Qt5 (48 sources) | the Plasma theme for Qt5 programs; the session has none
plasma-integration  cut libkf5iconthemes-dev       | its Qt5 half: KDE Frameworks 5 and Qt5 (48 sources) | the Plasma theme for Qt5 programs; the session has none
plasma-integration  cut libkf5kio-dev              | its Qt5 half: KDE Frameworks 5 and Qt5 (48 sources) | the Plasma theme for Qt5 programs; the session has none
plasma-integration  cut libkf5notifications-dev    | its Qt5 half: KDE Frameworks 5 and Qt5 (48 sources) | the Plasma theme for Qt5 programs; the session has none
plasma-integration  cut libkf5wayland-dev          | its Qt5 half: KDE Frameworks 5 and Qt5 (48 sources) | the Plasma theme for Qt5 programs; the session has none
plasma-integration  cut libkf5widgetsaddons-dev    | its Qt5 half: KDE Frameworks 5 and Qt5 (48 sources) | the Plasma theme for Qt5 programs; the session has none
plasma-integration  cut libkf5windowsystem-dev     | its Qt5 half: KDE Frameworks 5 and Qt5 (48 sources) | the Plasma theme for Qt5 programs; the session has none
plasma-integration  cut libkf5xmlgui-dev           | its Qt5 half: KDE Frameworks 5 and Qt5 (48 sources) | the Plasma theme for Qt5 programs; the session has none
plasma-integration  cut libqt5waylandclient5-dev   | its Qt5 half: KDE Frameworks 5 and Qt5 (48 sources) | the Plasma theme for Qt5 programs; the session has none
plasma-integration  cut libqt5x11extras5-dev       | its Qt5 half: KDE Frameworks 5 and Qt5 (48 sources) | the Plasma theme for Qt5 programs; the session has none
plasma-integration  cut qtbase5-dev                | its Qt5 half: KDE Frameworks 5 and Qt5 (48 sources) | the Plasma theme for Qt5 programs; the session has none
plasma-integration  cut qtbase5-private-dev        | its Qt5 half: KDE Frameworks 5 and Qt5 (48 sources) | the Plasma theme for Qt5 programs; the session has none
plasma-integration  cut qtdeclarative5-dev         | its Qt5 half: KDE Frameworks 5 and Qt5 (48 sources) | the Plasma theme for Qt5 programs; the session has none
plasma-integration  cut qtquickcontrols2-5-dev     | its Qt5 half: KDE Frameworks 5 and Qt5 (48 sources) | the Plasma theme for Qt5 programs; the session has none
plasma-integration  cut qtwayland5-dev-tools       | its Qt5 half: KDE Frameworks 5 and Qt5 (48 sources) | the Plasma theme for Qt5 programs; the session has none
plasma-integration  drop plasma5-integration  | it is the Qt5 half | as above
plasma-integration  cmake BUILD_QT5=OFF       | debian/rules passes -DBUILD_QT5=ON | as above
cdebconf  profile pkg.cdebconf.nogtk          | its GTK frontend pulls gtk2, gtk3, gobject-introspection, python3 and Qt5 (~280 sources) through base-passwd | debconf's GTK frontend (the image asks no questions)
accountsservice  cut gobject-introspection    | introspection pulls python3.13, systemtap, avahi and gtk3 | accountsservice's GObject introspection data (nothing in the session reads it)
accountsservice  cut gir1.2-gio-2.0-dev       | as above | as above
accountsservice  cut gir1.2-gobject-2.0-dev   | as above | as above
accountsservice  cut libgirepository1.0-dev   | as above | as above
accountsservice  drop gir1.2-accountsservice-1.0 | it is the introspection data | as above
accountsservice  meson introspection=false    | introspection is on by default | as above
accountsservice  cut valac                    | Vala compiler, for its Vala bindings | the Vala API (a build-time file)
accountsservice  meson vapi=false             | the Vala API is on by default | as above
accountsservice  exclude .vapi                | libaccountsservice-dev lists the Vala API files | as above
accountsservice  exclude .gir                 | libaccountsservice-dev lists the introspection XML | as above
accountsservice  exclude gir-1.0              | and its directory | as above
accountsservice  exclude vala                 | libaccountsservice-dev lists the Vala API's directory | as above
sudo  cut libapparmor-dev                 | AppArmor's build pulls python3.13, systemtap, avahi and gtk3 | sudo's AppArmor profile switching; gex has no AppArmor
lvm2  cut libcmap-dev              | lvmlockd's cluster locking: corosync, dlm, pacemaker, sanlock (~20 sources) | shared volume groups across hosts (lvmlockd)
lvm2  cut libcorosync-common-dev   | lvmlockd's cluster locking: corosync, dlm, pacemaker, sanlock (~20 sources) | shared volume groups across hosts (lvmlockd)
lvm2  cut libcpg-dev               | lvmlockd's cluster locking: corosync, dlm, pacemaker, sanlock (~20 sources) | shared volume groups across hosts (lvmlockd)
lvm2  cut libdlm-dev               | lvmlockd's cluster locking: corosync, dlm, pacemaker, sanlock (~20 sources) | shared volume groups across hosts (lvmlockd)
lvm2  cut libdlmcontrol-dev        | lvmlockd's cluster locking: corosync, dlm, pacemaker, sanlock (~20 sources) | shared volume groups across hosts (lvmlockd)
lvm2  cut libquorum-dev            | lvmlockd's cluster locking: corosync, dlm, pacemaker, sanlock (~20 sources) | shared volume groups across hosts (lvmlockd)
lvm2  cut libsanlock-dev           | lvmlockd's cluster locking: corosync, dlm, pacemaker, sanlock (~20 sources) | shared volume groups across hosts (lvmlockd)
lvm2  autoconf enable_lvmlockd_dlm=no      | debian/rules passes --enable-lvmlockd-dlm | as above
lvm2  autoconf enable_lvmlockd_sanlock=no  | debian/rules passes --enable-lvmlockd-sanlock | as above
lvm2  drop lvm2-lockd                      | it is lvmlockd | as above
cryptsetup  cut libssh-dev                 | only for cryptsetup-ssh (the SSH token plugin) | LUKS tokens kept on an SSH server
cryptsetup  autoconf enable_ssh_token=no   | the SSH token plugin builds when libssh is found | as above
cryptsetup  drop cryptsetup-ssh            | it is the SSH token plugin | as above
libblockdev  cut libvolume-key-dev         | volume_key pulls NSS and gpgme | the crypto plugin's key escrow (bd_crypto_escrow_device)
libblockdev  cut libnss3-dev               | as above | as above
libblockdev  autoconf with_escrow=no       | escrow is on by default | as above
libblockdev  cut libndctl-dev              | NVDIMM management library (ndctl) | the NVDIMM plugin; there are no NVDIMMs in a page
libblockdev  autoconf with_nvdimm=no       | the NVDIMM plugin is on by default | as above
libblockdev  drop libblockdev-nvdimm3      | it is the NVDIMM plugin | as above
libblockdev  drop libblockdev-nvdimm-dev   | as above | as above
libblockdev  drop libblockdev-plugins-all  | it depends on every plugin, the NVDIMM one too | as above
libblockdev  cut libpython3-dev            | Python bindings (python3.13 for the target) | the python3 gi overrides (python3-blockdev)
libblockdev  autoconf with_python3=no      | the bindings are on by default | as above
libblockdev  drop python3-blockdev         | it is the bindings | as above
libblockdev  cut dh-sequence-python3       | as above | as above
libblockdev  cut dh-sequence-gir           | GObject introspection pulls python3.13, systemtap, avahi and gtk3 | libblockdev's introspection data (nothing in the session reads it)
libblockdev  cut libgirepository1.0-dev    | as above | as above
libblockdev  autoconf enable_introspection=no | introspection is on when found | as above
libblockdev  drop gir1.2-blockdev-3.0      | it is the introspection data | as above
libblockdev  exclude .gir                  | libblockdev-dev lists the introspection XML | as above
udisks2  cut dh-sequence-gir               | GObject introspection, as for libblockdev | udisks2's introspection data (Plasma's Solid uses D-Bus, not it)
udisks2  cut gobject-introspection         | as above | as above
udisks2  cut libgirepository1.0-dev        | as above | as above
udisks2  autoconf enable_introspection=no  | introspection is on when found | as above
udisks2  drop gir1.2-udisks-2.0            | it is the introspection data | as above
udisks2  exclude .gir                      | libudisks2-dev lists the introspection XML | as above
libbytesize  cut libpython3-dev            | Python bindings (python3.13 for the target, then systemtap, avahi, gtk3) | the python3 module (python3-bytesize)
libbytesize  cut dh-sequence-python3       | as above | as above
libbytesize  autoconf with_python3=no      | debian/rules passes --with-python3 | as above
libbytesize  drop python3-bytesize         | it is the module | as above
bash  profile !nodoc                       | debian/rules fills bash-doc's examples whether or not the profile builds bash-doc | nothing (bash-doc is built)
accountsservice  cut locales-all              | every locale compiled (the test suite's; the build is nocheck) | nothing
json-c  cmake DISABLE_EXTRA_LIBS=ON         | the sysroot's libbsd is found and linked for arc4random, and its libmd has no shlibs entry | nothing (json-c seeds from /dev/urandom instead)
gzip  cut less                             | the test suite's (zless); the build is nocheck | nothing
gawk  cut locales-all                      | every locale compiled (the test suite's; the build is nocheck) | nothing
x11-xserver-utils  autoconf ac_cv_path_CPP_PATH=/usr/bin/mcpp,/usr/bin/cpp | xrdb preprocesses with mcpp (ours) before cpp, which is GCC's (an arm64 compiler in a wasm32 image) | nothing
sed  autoconf with_included_regex=yes        | debian/rules passes --without-included-regex, glibc's GNU regex API, which musl lacks | nothing (gnulib's copy of it is built in)
kf6-kfilemetadata  cut libepub-dev           | libepub.so.0 lives in /usr/lib, where dpkg-shlibdeps finds no package for it in the cross build | EPUB metadata (title, author) in Dolphin's information panel
procps  cut dejagnu                          | the test suite's; the build is nocheck | nothing
psmisc  cut dejagnu                          | the test suite's; the build is nocheck | nothing
coreutils  autoconf gl_cv_func_getlogin_works=yes | gnulib replaces musl's getlogin with one reading the logind sessions through libsystemd, and Makefile.am links logname without libsystemd (on glibc it is not replaced) | logname reports $LOGNAME (musl's getlogin) rather than the session's login name
sed  profile !nodoc                         | sed's tarball ships sed.info and make install installs it, while debian/rules under nodoc removes the info directory expecting it empty | nothing (the info manual is built)
sudo  autoconf with_apparmor=no             | debian/rules passes --with-apparmor (the cut libapparmor-dev above) | as above
libnvme  meson python=disabled              | debian/rules passes -Dpython=enabled; the bindings need python3.13 for the target | the python3 module (python3-libnvme)
libnvme  drop python3-libnvme               | it is the module | as above
libnvme  cut dh-sequence-python3            | as above | as above
kf6-kfilemetadata  cmake CMAKE_DISABLE_FIND_PACKAGE_EPub=ON | the sysroot holds ebook-tools' libepub (built for another source), which find_package(EPub) finds although the Build-Depends is cut | as above
lvm2  patch 0001-standard-fds-freopen.patch | musl's stdin, stdout and stderr are const; lvm reassigns them when fd 0, 1 or 2 is closed | nothing (the stream is reopened in place on the same fd)
# Not built at all: udisks2 and what only it needs (libblockdev, cryptsetup,
# parted, libnvme, lvm2, volume-key and NSS under it); the KDE image leaves
# udisks2 out (kde/leave-out.txt), so Dolphin's Devices panel and Plasma's
# device notifier list no drives
perl  patch 0001-cross-config-musl-linux-wasm32.patch | Debian's cross build takes each port's probed configuration from debian/cross/ARCH, which has none for musl-linux-wasm32 | nothing (packaging files only: perl's Configure run once with the wasm32 compiler)
dpkg  patch 0001-cputable-wasm32.patch | dpkg's configure takes the host architecture from its own data/cputable, which has no wasm32 | nothing
util-linux  patch 0001-install-musl-no-col-enosys.patch | debian/*.install only: on musl col is not built (configure requires glibc) nor enosys (no audit architecture for wasm32) | col (filters reverse line feeds) and enosys
newt  patch 0001-rules-nodoc-tutorial.patch | debian/rules builds the tutorial with docbook2html whatever the profile (docbook-utils pulls TeX Live, 36 packages, into the build machine) | libnewt-dev's HTML tutorial
newt  cut docbook-utils | as above | as above
perl  env DEB_BUILD_OPTIONS="nocheck nodoc noautodbgsym parallel=1" | debian/rules configures the static, shared and debug perls as parallel targets, and each cross configuration first builds the native miniperl in the same tree (one removes the others' host/ mid-build) | nothing (a serial build)
apt  profile pkg.apt.nosqv                | sqv is Rust (sequoia), and there is no Rust for wasm32 here; Debian's profile verifies with gpgv instead | nothing (gpgv checks the archive signatures)
apt  cmake SQV_EXECUTABLE=SQV_EXECUTABLE-NOTFOUND | CMake finds the build machine's sqv (the chroot's own apt needs it) and apt would call sqv at run time | as above
apt  patch 04-rules-nosqv-gpgv.patch | debian/rules only: under pkg.apt.nosqv the gpgv dependency, not the build machine's /usr/bin/sqv deciding | as above
# The KDE applications' closure (kdenlive, okular, gwenview, elisa,
# kimageformats): optional build dependencies through which each would pull
# hundreds of sources (a Qt 5, PulseAudio, Samba, Python, GTK, VLC, SDL,
# OpenCV) that the image has no other use for
v4l-utils  cut qtbase5-dev | qv4l2 and qvidcap, its Qt 5 tools, pull a whole Qt 5 and PulseAudio | the Qt tools (the libraries and command-line tools stay)
v4l-utils  cut libqt5opengl5-dev | as above | as above
sane-backends  cut libv4l-dev | the v4l backend (webcams as scanners) | that backend
colord  cut libsane-dev | colord's scanner support | that support
gtk+3.0  cut libcolord-dev | colour management, which pulls colord and SANE | colord profiles in GTK 3 programs
avahi  profile pkg.avahi.nogui | avahi's GTK browser tools | those tools
imath  cut libboost-python-dev | the Python bindings, which pull Python 3.13 and Boost.Python | Imath's Python module
imath  cut python3-dev | as above | as above
imath  cut libpython3-dev | as above | as above
imath  cut python3-numpy | as above | as above
imath  cut dh-python | as above | as above
libtheora  profile pkg.libtheora.nosdl | its SDL example player | that example
x264  profile stage1 | ffms2 input (x264 reading other video formats), which pulls FFmpeg's whole closure into x264's | x264 reads raw and y4m input only
ffmpeg  profile pkg.ffmpeg.stage1 | Debian's bootstrap profile: no JACK, PulseAudio, SDL2 (ffplay), Blu-ray, Chromaprint or ZVBI | those inputs and outputs, and ffplay
ffmpeg  cut libopenal-dev | OpenAL capture | that input
mlt  cut libopencv-dev | MLT's OpenCV filters (motion tracking), which pull OpenCV, VTK, GDAL and HDF5 | kdenlive's motion tracker
okular  cut libkf6purpose-dev | the Share menu (KDE Purpose), which pulls KAccounts and a KF5 stack | Okular's Share menu
gwenview  cut libkf6purpose-dev | as okular | Gwenview's Share menu
gwenview  cut libcfitsio-dev | FITS (astronomy) images | that format
kdenlive  cut libkf6purpose-dev | as okular | kdenlive's Share menu
elisa-player  cut libvlc-dev | the VLC backend, which pulls VLC's closure; Elisa plays through Qt Multimedia without it | the VLC backend
elisa-player  cut libvlccore-dev | as above | as above
kf6-kimageformats  cut libheif-dev | HEIF images, which pull libheif's codecs (x265, libde265, kvazaar) | the HEIF format
kf6-kimageformats  cut libjxl-dev | JPEG XL images | the JPEG XL format
kf6-kimageformats  cut libavif-dev | AVIF images, which pull AV1 codecs (aom, dav1d, SVT-AV1) | the AVIF format
poppler  cut qtbase5-dev | poppler-qt5, which pulls a whole Qt 5 (and PulseAudio, Samba, Python through it); Okular uses poppler-qt6 | the Qt 5 binding
mlt  cut libqt5opengl5-dev | MLT's Qt 5 module (kdenlive uses the Qt 6 one) | that module
mlt  cut libqt5svg5-dev | as above | as above
mlt  cut libsdl1.2-compat-dev | MLT's SDL consumers (kdenlive previews through Qt) | those consumers
mlt  cut libsdl2-dev | as above | as above
mlt  cut libjack-dev | MLT's JACK module | that module
mlt  cut libxine2-dev | MLT's xine producer | that producer
poppler  cut libgtk-3-dev | the GLib binding's GTK demo, which pulls GTK 3 and through it GObject introspection and CPython | that demo
poppler  cut libgdk-pixbuf-2.0-dev | as above | as above
poppler  cut libgirepository1.0-dev | poppler-glib's introspection data (gir1.2-poppler), which pulls gobject-introspection and CPython | introspection (the GLib binding itself stays)
poppler  cut dh-sequence-gir | as above | as above
poppler  cut gir1.2-cairo-1.0-dev | as above | as above
poppler  cut gir1.2-gio-2.0-dev | as above | as above
poppler  cut gir1.2-gobject-2.0-dev | as above | as above
poppler  cmake ENABLE_GOBJECT_INTROSPECTION=OFF | as above | as above
poppler  drop gir1.2-poppler-0.18 | as above | as above
poppler  cut libgpgme-dev | signature checking through GPGME, whose own build insists on its Qt 5 and Python bindings (debian/rules --enable-languages) and so pulls a whole Qt 5 | checking signed PDFs' GPG signatures (NSS signatures stay)
poppler  cut libgpgmepp-dev | as above | as above
poppler  cmake ENABLE_GPGME=OFF | as above | as above
gwenview  cut libkimageannotator-qt6-dev | the annotation tool, whose libraries (kImageAnnotator, kColorPicker) build their Qt 5 and Qt 6 versions together and so pull a whole Qt 5 | Gwenview's annotate tool
gwenview  cut libkcolorpicker-qt6-dev | as above | as above
gwenview  cut libkdcrawqt6-dev | libkdcraw builds its Qt 5 and Qt 6 versions together and so pulls a whole Qt 5 | Gwenview's own RAW decoding (kimageformats' RAW plugin, through libraw, still opens RAW files)
discount  env DEB_CFLAGS_MAINT_APPEND=-Wno-error=implicit-int | its option parser is K&R C with an undeclared (implicit int) parameter, an error since clang 16; the archive's build predates that | nothing
xorg-server headers xserver-xorg-dev     | the X server's SDK, for the Mouse KCM's X11 backend and kapplymousetheme (startplasma-x11 sets the cursor theme with it): only its headers are used, and the server itself is not built (the page's X server is Xwayland) | nothing
mesa       headers mesa-common-dev       | the GL headers the X server's SDK depends on; gex's libGL is the target's GL (Mesa is not built for the session) | nothing
