Release Artifacts
make dist (alias: make release) produces seven distribution files from a single x86_64 Linux build machine.
Artifact table
| File | Contents | Notes |
|---|---|---|
rustpg-VERSION-linux-x86_64.deb |
rpg + rustpg + keylib-librarian | Full GUI + CLI. Native build, dynamically linked. |
rustpg-VERSION-linux-aarch64.deb |
rpg only | CLI only. Built from aarch64-unknown-linux-musl — static binary packaged as arm64 deb. |
rustpg-VERSION-linux-riscv64.deb |
rpg only | CLI only. Built from riscv64gc-unknown-linux-gnu. |
rustpg-VERSION-linux-musl-x86_64.tar.gz |
rpg | Static binary, no dependencies. |
rustpg-VERSION-linux-musl-aarch64.tar.gz |
rpg | Static binary, no dependencies. |
rustpg-VERSION-linux-musl-riscv64.tar.gz |
rpg | Static binary, no dependencies. |
rustpg-VERSION-windows.zip |
rpg.exe + rustpg.exe + keylib-librarian.exe | Cross-compiled via MinGW-w64. |
All binaries are stripped before packaging.
Why cross-compiled debs are CLI-only
The GUI crates (rustpg, keylib-librarian) depend on GTK3, Wayland, and EGL — C libraries that must be available for the target architecture at link time. Cross-compiling them from x86_64 requires a full target sysroot (arm64 or riscv64 dev packages installed via dpkg --add-architecture). The CLI crate (rpg) has no such C dependencies when keyring is stubbed out, so it cross-compiles cleanly.
If you build natively on an aarch64 or riscv64 machine, make linux-deb produces a full deb with all three binaries — the packaging script detects them automatically.
OS keyring in cross-compiled builds
The real keyring implementation calls into secret-service via libdbus-sys, a C library. Cross-compiled targets get a no-op stub instead:
// rpglib/src/keyring.rs
#[cfg(not(any(target_env = "musl", target_arch = "riscv64")))]pubfn load(slug: &str)-> Option<Zeroizing<String>>{// real: talks to GNOME Keyring / KWallet via dbus
}#[cfg(any(target_env = "musl", target_arch = "riscv64"))]pubfn load(_slug: &str)-> Option<Zeroizing<String>>{None}The two #[cfg] blocks are mutually exclusive — exactly one compiles per target. The conditions:
target_env = "musl"— matches all musl targets (x86_64-unknown-linux-musl,aarch64-unknown-linux-musl,riscv64gc-unknown-linux-musl). Musl builds link everything statically; there is no dbus to link against.target_arch = "riscv64"— matchesriscv64gc-unknown-linux-gnu(the riscv64 deb target). The dbus C library is not present for riscv64 on an x86_64 build machine without a full sysroot, so cross-compilation would fail without this stub.
The same condition gates the keyring crate dependency in rpglib/Cargo.toml, so the C library is not even referenced in the build graph when the stub is active:
[target.'cfg(not(any(target_env = "musl", target_arch = "riscv64")))'.dependencies]
keyring = { version = "3", features = ["sync-secret-service", "crypto-rust"] }
The aarch64 deb sidesteps this entirely by using the musl target — the binary is statically linked and target_env = "musl" already covers it.
One-time setup
# Rust targets
make musl-setup # x86_64 + aarch64 + riscv64 musl
make riscv64-setup # riscv64gc-unknown-linux-gnu
# System cross-compilers (needs sudo)
sudo apt install musl-tools gcc-aarch64-linux-gnu gcc-riscv64-linux-gnu mingw-w64