fix(packaging/tray): the .deb must build the tray in its own cargo invocation
punktfunk-tray panicked at every launch on Debian/Ubuntu: zbus-5.16.0/src/abstractions/executor.rs:190 there is no reactor running, must be called from the context of a Tokio 1.x runtime Not a code bug — cargo feature unification. zbus picks its executor from its own feature flags; the host's ashpd enables zbus/tokio while the tray runs ksni's async-io executor with no tokio runtime by design. Features are additive across everything built in ONE invocation, and deb.yml built `-p punktfunk-host -p punktfunk-tray` together, handing the tray a tokio-flavoured zbus with no runtime anywhere near it. The invariant is already established and explained inline in the RPM spec, the Arch PKGBUILD and the Nix packages.nix — all three build the tray alone, and their comments even claim "(Same split the .deb does.)" The .deb did not, in two places at once: the workflow co-built it, and build-deb.sh's own correct standalone build was skipped by an `if [ ! -x "$TRAY_BIN" ]` guard, so it packaged the poisoned artifact. That is also why only Debian/Ubuntu users saw it. Drops the tray from the workflow's host build and makes build-deb.sh's tray build unconditional — cargo no-ops when the artifact is already async-io-resolved and rebuilds it when it is not, so a stale co-built binary can no longer be shipped. Corrects the Nix README note that had recorded deb/rpm/arch as sharing a "latent" crash, and its nix develop recipe, which co-built all four. Verified on a Linux box: co-built reproduces the panic exactly; built alone, the tray reaches the session bus and exits with the intended "no StatusNotifier tray available". Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> (cherry picked from commit f91983a84c56464bd2c18d537963cb7fb3a6e059)
This commit is contained in:
@@ -39,10 +39,16 @@ if [ ! -x "$BIN" ]; then
|
||||
PUNKTFUNK_BUILD_VERSION="$VERSION" cargo build --release -p "$PKG" --locked # stamp --version (build.rs)
|
||||
fi
|
||||
TRAY_BIN="target/release/punktfunk-tray"
|
||||
if [ ! -x "$TRAY_BIN" ]; then
|
||||
echo "==> building punktfunk-tray (release)"
|
||||
cargo build --release -p punktfunk-tray --locked
|
||||
fi
|
||||
# ALWAYS built here, in its OWN cargo invocation — load-bearing, not tidiness, and deliberately not
|
||||
# skipped when the artifact already exists. Cargo unifies features across everything in one build,
|
||||
# so a caller that co-built the tray with the host (the .deb workflow used to) leaves behind a
|
||||
# binary whose zbus took the host's ashpd -> zbus/tokio while the tray runs ksni's async-io
|
||||
# executor with no tokio runtime by design — it then panics at every launch with "there is no
|
||||
# reactor running, must be called from the context of a Tokio 1.x runtime". Skipping the rebuild is
|
||||
# exactly how that binary shipped. Building it alone keeps its zbus on async-io; cargo no-ops this
|
||||
# when the existing artifact was already resolved that way, and rebuilds it when it wasn't.
|
||||
echo "==> building punktfunk-tray (release, own invocation — see comment above)"
|
||||
cargo build --release -p punktfunk-tray --locked
|
||||
|
||||
STAGE="$(mktemp -d)"
|
||||
trap 'rm -rf "$STAGE"' EXIT
|
||||
|
||||
Reference in New Issue
Block a user