Skip to content

Building from Source

foonerd edited this page Oct 4, 2026 · 3 revisions

Building from Source

The plugin and every binary it ships are built from the rtlsdr-radio repository. Its README is the reference for building; this page is an overview.

What is in the repository

Path Holds
plugin/ The Volumio plugin: controller, Station Manager, settings, translations, installer. No binaries.
components/rtlsdr/ The RTL-SDR library and tools, packaged as libfn-rtlsdr0 and foonerd-rtlsdr (fn-rtl_fm, fn-rtl_power, ...). Built from osmocom/rtl-sdr.
components/dab/ The DAB/DAB+ decoder fn-dab and the scanner fn-dab-scanner, derived from dab-cmdline.
components/redsea/ The RDS decoder fn-redsea, built from redsea with liquid-dsp.
components/gain/ fn-rtl-gain, which measures the gain a dongle should be set to and surveys the FM band for stations.
docker/ The build environments.
scripts/ Fetching sources, building a target, checking the result, assembling and packaging the plugin, running the tests.
tests/ The plugin's test suite, with stand-ins for the receiver programs.

Everything the plugin runs carries an fn- prefix, so that nothing collides with distribution packages of the same origin.

Targets

Target Runs on
arm Every Raspberry Pi from the Zero and Pi 1 up (ARMv6 hard-float, as Volumio's Pi image)
armv7 32-bit ARMv7 boards
armv8 64-bit ARM
x64 x86-64

Building

Requirements: Docker, git, Python 3, and for the ARM targets on an x86-64 machine, qemu user emulation.

./build.sh                    # all targets
./build.sh arm x64            # the named ones
scripts/assemble-plugin.sh    # dist/rtlsdr_radio/: the plugin with its binaries
scripts/package-plugin.sh     # dist/rtlsdr_radio-<version>.zip: what a player installs
scripts/test-plugin.sh        # the test suite

A build runs in the target's build image with no network: the upstream sources are fetched once, at the commits named in the *.lock files, when the image is made. Every binary is checked afterwards: it must be built for the target's architecture and must start, and fn-rtl-gain must get its measurements right on a signal it makes up.

From sources to the plugin store

flowchart LR
    upstream["Upstream sources<br/>at locked commits"] --> image["Build image<br/>per target"]
    image --> build["Build<br/>(network off)"]
    own["Sources in the repository<br/>(DAB decoder, gain tool)"] --> build
    build --> checks["Checks: architecture,<br/>start, self-test,<br/>reviewed warnings"]
    checks --> components["Components<br/>in the registry"]
    components --> zip["Plugin package<br/>(zip)"]
    plugin["plugin/"] --> tests["Test suite"]
    tests --> zip
    zip --> prerelease["GitHub pre-release<br/>(Preview channel)"]
    prerelease --> store["Volumio plugin store<br/>(Beta, then Stable)"]
Loading

Continuous integration and releases

Workflow When What
ci every push to main, every pull request checks the plugin's JavaScript and runs the test suite
components when a component's source or build changes builds the binaries for all four targets and keeps them, keyed by their content, in the project's container registry
release a tag v<version> tests, fetches the built components, packs the plugin and publishes the ZIP as a pre-release on GitHub

Pre-releases on GitHub are what the Preview update channel offers; see Updating the Plugin. Versions for everyone are published through the Volumio plugin store.

The notes of each version are kept on the Changelog page of this wiki; a release takes its notes from there.

What the plugin is tested on and how its figures were measured is described under Test Setup.

Contributing

Reports and suggestions are welcome in the community thread. The Station Manager's HTTP interface is described on the Station Manager API page.

Clone this wiki locally