threadpanic/rustpg
1
0
Fork
You've already forked rustpg
0
1 Release_Artifacts
Bert van der Weerd edited this page 2026年05月12日 18:33:42 +02:00

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" — matches riscv64gc-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