Building the bundles yourself
All release artifacts are produced by shell scripts in the repository root. You can build any single bundle, or everything at once.
Build everything: build-all.sh
./build-all.sh [OUTPUT_DIR] # default output: ./artifacts
Runs all seven bundle scripts plus the Android release APK, then collects the
resulting .tar.gz / .zip / .apk files into one directory together with a
SHA256SUMS.txt manifest. Each step uses a different toolchain, so a missing
toolchain fails only that step — the script always finishes and prints a
PASS/FAIL summary (its exit code is the number of failed steps).
Prerequisites by target
| Target | Toolchain |
|---|---|
| Linux & Windows bundles (proxy and GUI) | cross (cargo install cross) and a running Docker daemon. cross builds inside Docker images that carry the ALSA/X11/Wayland (Linux) or mingw-w64 (Windows) toolchains — a bare cargo build --target … from macOS fails on the C dependencies. |
| macOS bundles | Native cargo on a Mac (CoreAudio frameworks only exist there), plus Xcode command-line tools (lipo, codesign). Both x86_64-apple-darwin and aarch64-apple-darwin rust targets must be installed; the scripts pin MACOSX_DEPLOYMENT_TARGET=11.0 so binaries run on Big Sur and later. |
| Web client (inside every server bundle) | rustup target add wasm32-unknown-unknown and cargo install wasm-bindgen-cli. The pipeline is cargo build --target wasm32-unknown-unknown --release + wasm-bindgen --target web — not wasm-pack. |
| Android APK | Android SDK + NDK 27 (sdkmanager 'ndk;27.2.12479018'), rustup target add aarch64-linux-android. Built with Gradle (./gradlew :app:assembleRelease in crates/podsdr-android/android), which drives cargo itself. |
Rust targets for the cross-compiled bundles must also be installed first, e.g.:
rustup target add aarch64-unknown-linux-gnu x86_64-unknown-linux-gnu x86_64-pc-windows-gnu
Each script checks its own prerequisites up front and exits with an installation hint if something is missing.
Individual bundle scripts
| Script | Produces |
|---|---|
./bundle-proxy-pi.sh | podsdr-proxy-pi-bundle.tar.gz (aarch64 Linux) |
./bundle-proxy-x86_64.sh | podsdr-proxy-x86_64-bundle.tar.gz |
./bundle-proxy-macos.sh | podsdr-proxy-macos-bundle.tar.gz (universal) |
./bundle-proxy-windows.sh | podsdr-proxy-windows-bundle.zip¹ |
./bundle-gui-linux.sh | podsdr-gui-linux-x86_64.tar.gz |
./bundle-gui-macos.sh | podsdr-gui-macos-universal.tar.gz |
./bundle-gui-windows.sh | podsdr-gui-windows-x86_64.zip¹ |
¹ Falls back to .tar.gz when zip isn’t available on the build host.
Every server bundle script builds the WASM web client, cross-compiles
podsdr-proxy and podsdr-emu in one invocation, and writes the
launchers, service unit and README.txt described in
Downloads.
Development runs (no bundle)
For working directly from a source checkout:
./run-web.sh [port] # build WASM + serve it via a locally built proxy (plain HTTP, default port 8080)
./run-proxy-cloud.sh [name] # build + run the proxy against the public cloud broker
./run-digimodes-web.sh [port] # standalone FT8/FT4 web decoder
cargo run --release -p podsdr-gui # desktop GUI
cargo run --release -p podsdr-emu -- --radio hermeslite # emulator