2026-07-28 16:51:24 +02:00
2026-07-28 16:39:04 +02:00
2026-07-28 16:39:04 +02:00
2026-07-28 16:39:04 +02:00
2026-07-28 16:51:24 +02:00

satdump_fedora

Satdump packaged for Fedora

Building SatDump 1.2.2 as an RPM on Fedora 44

This spec has been through several real rpmbuild runs on an actual Fedora 44 system and now produces a working, installable RPM (satdump

  • satdump-devel). These notes cover how to build it, the non-obvious fixes baked into the spec and why they're there, and what's still worth double-checking.

Building

sudo dnf install rpm-build rpmdevtools
rpmdev-setuptree

# rpmbuild doesn't fetch Source URLs itself - spectool does that, pulling
# down the main tarball plus the two patched sol2 header files (see below)
cd ~/SOURCES
spectool -g ~/SPECS/satdump.spec

sudo dnf builddep ~/SPECS/satdump.spec
rpmbuild -ba ~/SPECS/satdump.spec

Resulting packages land in ~/RPMS/x86_64/. Optional features can be trimmed at build time:

# headless build, e.g. for a relay/server box
rpmbuild -ba ~/SPECS/satdump.spec --without gui --without live

# bladeRF support (off by default - see below)
rpmbuild -ba ~/SPECS/satdump.spec --with bladerf

If you only changed something in %files or later and don't need a full recompile, --short-circuit skips straight past %prep/%build using what's already in ~/BUILD/:

rpmbuild -bb --short-circuit ~/SPECS/satdump.spec

Why the spec patches two things before building

sol2 (Lua binding library), via Source1/Source2. 1.2.2 vendors sol2 3.2.3, which has a real bug: sol::optional<T&>::emplace() calls a construct() member that doesn't exist on that partial specialization. Older GCC never checked that unreached branch closely enough to catch it; GCC 13+ (Fedora 44 ships GCC 15) turns it into a hard build failure. This is upstream's own bug, not something Fedora-specific — traced their git history to the exact commit (2b0a874f3) where they fixed it by bumping the vendored header to a newer generated release (the same fix Debian's 1.2.2 package ships). Since SatDump 2.0 drops Lua entirely for AngelScript, there's no later tagged release with the fix to pull a clean tarball from, so Source1/Source2 point at the two files from that exact commit, and %prep copies them over the vendored ones. This is done via proper Source tags rather than a mid-build curl, since Fedora's real build systems (mock, koji, Copr) run %build with no network access.

Vendored libacars (inmarsat_support plugin), via sed in %prep. GCC 15 switched its default C dialect from -std=gnu17 to -std=gnu23. C23 changed what an unprototyped declaration like void (*node_free)() means — from "unspecified arguments" (compatible with anything) to "takes no arguments." The plugin's vendored libacars copy declares its callback-list functions (la_list_free_full, la_list_foreach, la_list_free_full_with_ctx in list.h/list.c) exactly the old way, so every real call site now mismatches. This isn't libacars-specific — it's a known, wide-reaching GCC 15 migration issue. Forcing -std=gnu17 globally via CMAKE_C_STANDARD does not reliably work here: this plugin's own CMakeLists.txt has a nested cmake_minimum_required(VERSION 3.12), which resets CMake's effective policy version for that subdirectory below 3.22 (CMP0128, which governs -std= flag selection), so CMake can silently skip emitting the flag at all. The actual fix is narrower and more reliable: give the three declarations/definitions real prototypes matching how every call site already uses them (verified against every call site in the plugin, not just one file, and compile-tested against GCC's C23 behavior with zero errors).

Other decisions baked into the spec

  • %global debug_package %{nil} — this build's LTO flags (-flto=auto -ffat-lto-objects, applied across ~15 plugin .sos plus the core library) confuse Fedora's automatic debuginfo extraction into leaving orphaned /usr/lib/debug/... files that never make it into an auto-generated -debuginfo/-debugsource package, which fails the build with "installed but unpackaged files." Skipping debuginfo packaging entirely is the simplest reliable fix. If you want real debuginfo later (e.g. distributing this more broadly), disabling LTO for the build is the more likely fix than fighting find-debuginfo.sh.
  • bladeRF is off by default (%bcond_with bladerf, note this is the one bcond that defaults off, unlike all the others). Fedora's repos don't carry Nuand's bladeRF/libbladeRF at all — confirmed directly against a live Fedora 44 system (dnf: "No match for argument: bladeRF-devel"). SatDump's own bladerf_sdr_support plugin already handles a missing bladeRF gracefully via find_library() and just skips building that one plugin with a log message, so this was never going to hard-fail the build either way — pass --with bladerf and install bladeRF-devel yourself only if you've already built libbladeRF from source.
  • OpenCL-ICD-Loader-devel, not ocl-icd-devel. Fedora replaced the ocl-icd OpenCL loader with the Khronos-official OpenCL-ICD-Loader; the two conflict by design (both provide the same functionality), and Fedora 44 installs the latter by default.
  • No hicolor icon-theme entry. SatDump doesn't use the standard /usr/share/icons/hicolor/<size>/apps/... layout most GUI apps do — it installs a single flat icon.png under /usr/share/satdump/, and satdump.desktop's Icon= line points at that exact absolute path (valid per the desktop-entry spec, just less common than icon-name lookup). That's already covered by the general %{_datadir}/satdump/ line in %files, so there's nothing extra to add here.
  • satdump-devel subpackage. SatDump installs a full public C++ SDK: libsatdump_core.so and libsatdump_interface.so as real shared libraries (which the CLI, SDR server, and every plugin .so link against at runtime, so both live in the main package, not devel-only), plus roughly 400 headers under /usr/include/satdump/, which get their own satdump-devel subpackage (Requires: satdump = ...).

Things that might still need attention

NNG version. SatDump's docs mention needing a minimum NNG version and, on distros where the packaged one is too old, building it from source (git clone https://github.com/nanomsg/nng.git -b v1.9.0). Fedora 44 ships nng-devel at 1.9.0, which has built cleanly so far — but if a future SatDump release bumps its minimum and find_package(nng) starts failing, the fallback is vendoring NNG as an additional SourceN tarball and building it in %build before SatDump's own %cmake step.

Lua 5.5. Not a problem on Fedora 44 (still on Lua 5.4 — the bump to 5.5 is a Fedora 45 change), but if this spec ever gets rebased for Fedora 45+: SatDump 1.2.2's Lua binding code doesn't compile against 5.5 (removed LUA_ERRGCMM etc., the same break other distro packagers have hit). The next major SatDump release drops Lua for AngelScript entirely, so this only matters for 1.2.x.

OpenCL at runtime. OpenCL-ICD-Loader-devel/opencl-headers get you the build-time loader; the runtime machine still needs an actual ICD installed (intel-opencl, rocm, a vendor driver, etc.) for -DBUILD_OPENCL=ON to do anything — otherwise projections silently run on CPU instead.

Desktop file validation. %check runs desktop-file-validate on satdump.desktop. If a future upstream change to that template fails strict validation (missing Icon=, categories, etc.), either patch it in %prep or drop the %check section rather than let a cosmetic issue block the whole build.

Sanity-check after install

sudo dnf install ~/RPMS/x86_64/satdump-1.2.2-1.fc44.x86_64.rpm
satdump --help
satdump-ui   # if built with GUI support
S
Description
Satdump packaged for Fedora
Readme GPL-3.0
34 MiB
2026-07-28 16:55:05 +02:00
Languages
C++ 100%