Skip to content

Enable RADE in Windows CI and official installer builds#2324

Merged
ten9876 merged 1 commit intoten9876:mainfrom
NF0T:fix/windows-rade-ci
May 3, 2026
Merged

Enable RADE in Windows CI and official installer builds#2324
ten9876 merged 1 commit intoten9876:mainfrom
NF0T:fix/windows-rade-ci

Conversation

@NF0T
Copy link
Copy Markdown
Contributor

@NF0T NF0T commented May 3, 2026

Summary

Fixes #2207 — RADE digital voice mode is absent from the official Windows installer because both the installer workflow and the Windows CI job were explicitly passing -DENABLE_RADE=OFF at CMake configure time. Local builds work because ENABLE_RADE defaults to ON in CMakeLists.txt; only CI-produced artifacts were silently missing the feature.

Root Cause

Both workflow files opted out of RADE:

# windows-installer.yml line 47 (before this PR)
cmake -B build -G "Ninja" -DCMAKE_BUILD_TYPE=Release -DENABLE_RADE=OFF -DMQTT_TLS=OFF

# ci.yml line 131 (before this PR)
"-DENABLE_RADE=OFF",

This is a packaging decision, not a source-code limitation. The build infrastructure to support RADE on Windows already exists and is correct:

  • third_party/radae/cmake/BuildOpus.cmake has a complete WIN32 branch that builds a RADE-capable static Opus (-DOPUS_DRED=ON -DOPUS_OSCE=ON) via CMake ExternalProject
  • third_party/opus-rade/opus-rade-prepared.tar.gz is vendored in the repository
  • The Linux AppImage workflow (appimage.yml) already ships with RADE enabled and uses an identical Build Opus step pattern
  • @wa2n-code's local MSVC build (reported in RADE not availble on Windows 11 unless compiled from source locally #2207) confirms the Windows path works end-to-end

Changes

Two workflow files, no source changes:

File Change
.github/workflows/windows-installer.yml Remove -DENABLE_RADE=OFF; add Build Opus (RADE dependency) step
.github/workflows/ci.yml Remove -DENABLE_RADE=OFF from check-windows job; add Build Opus (RADE dependency) step

Why a Separate build_opus Step?

BuildOpus.cmake correctly declares BUILD_BYPRODUCTS and add_dependencies(opus build_opus), so the Ninja dependency graph would handle ordering automatically. The explicit step is kept for two defensive reasons (matching the AppImage workflow's established pattern):

  1. CI failure attribution — if the Opus ExternalProject fails, the step name makes the problem immediately obvious rather than surfacing as a cryptic link error inside the main Build step
  2. Ninja/ExternalProject ordering — ExternalProject + IMPORTED targets + Ninja have a history of parallel-build ordering edge cases across CMake versions; the explicit step eliminates that class of flakiness entirely with no downside

Packaging Impact

  • RADE Opus is BUILD_SHARED_LIBS=OFF → statically linked into AetherSDR.exe
  • No new DLLs to add to the deploy step or Inno Setup script
  • Neural-net weights are compiled in via rade_enc_data.c / rade_dec_data.c — no external model files to bundle
  • setup-opus.ps1 (generic Opus for SmartLink compressed audio) remains in place; when RADE_FOUND=TRUE, CMakeLists.txt routes all Opus linkage through the vendored RADE build, so the prebuilt generic Opus is unused but harmless
  • AetherSDR.exe will be larger (~8–12 MB, matching the AppImage delta) due to compiled-in weights

Known CI Impact

CMAKE_C_COMPILER_LAUNCHER=sccache is not forwarded into the ExternalProject subprocess, so the Opus build will not benefit from the sccache cache. Expect the Windows CI job to run approximately 2–4 minutes longer than before. This is the same situation as the AppImage workflow and is not a blocker. A follow-on actions/cache step keyed on the tarball hash could eliminate the cold-build penalty if it becomes a concern.

Testing

  • @wa2n-code's local MSVC build with ENABLE_RADE=ON confirms the feature works on Windows
  • Linux AppImage with an identical build path has shipped with RADE enabled for multiple releases
  • CI will validate the Windows RADE build path on every PR going forward

🤖 Generated with Claude Code

The official Windows installer and CI check-windows job were explicitly
passing -DENABLE_RADE=OFF at configure time. ENABLE_RADE defaults to ON
in CMakeLists.txt, so local builds have always had RADE; only the
packaged artifacts were silently missing it.

The vendored build path (third_party/radae + third_party/opus-rade) is
already used by the Linux AppImage workflow and validated by local MSVC
builds. No source changes are required — the CMake ExternalProject in
third_party/radae/cmake/BuildOpus.cmake has a complete WIN32 path that
builds a RADE-capable static Opus (OPUS_DRED=ON, OPUS_OSCE=ON) using
the tarball vendored at third_party/opus-rade/opus-rade-prepared.tar.gz.

Changes:
- Remove -DENABLE_RADE=OFF from windows-installer.yml configure step
- Remove -DENABLE_RADE=OFF from ci.yml check-windows configure step
- Add explicit "Build Opus (RADE dependency)" step before the main build
  in both workflows, mirroring the AppImage workflow pattern

The explicit build_opus step is not strictly required (BUILD_BYPRODUCTS
+ add_dependencies correctly chain ExternalProject into the Ninja graph),
but it provides clear CI failure attribution if the Opus build fails and
eliminates any Ninja parallel-build ordering edge cases with IMPORTED
targets across CMake versions.

The RADE Opus is built as a static library and linked directly into
AetherSDR.exe. No new DLLs are added to the deploy or packaging steps.
The existing setup-opus.ps1 step (generic Opus for SmartLink audio) is
harmless to leave in place — when RADE is enabled, CMakeLists.txt routes
all Opus linkage through the vendored RADE build instead.

Fixes ten9876#2207

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
Copy link
Copy Markdown
Contributor

@aethersdr-agent aethersdr-agent Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the careful writeup, @NF0T — this is a model bug report-and-fix.

I verified the claims:

  • third_party/radae/cmake/BuildOpus.cmake lines 46-72 already implement the Windows path (MSVC opus.lib / MinGW libopus.a resolution, OPUS_DRED=ON, OPUS_OSCE=ON).
  • third_party/opus-rade/opus-rade-prepared.tar.gz is vendored.
  • appimage.yml line 79-80 uses the identical Build Opus (RADE dependency) step, so the new step is consistent with the established pattern.
  • The two workflow diffs match the PR description exactly — no scope creep, no source-code changes.

A couple of small observations, none blocking:

  1. setup-opus.ps1 becomes dead weight in the installer workflow. Once RADE is on, CMakeLists.txt routes Opus linkage through the vendored RADE build, so the SmartLink prebuilt is unused. You acknowledge this in the PR description ("unused but harmless") and I agree it's safer to leave it in place for now in case someone disables RADE locally — just worth a follow-up cleanup once this has soaked.

  2. CI runtime hit. The 2–4 min penalty is real because CMAKE_C_COMPILER_LAUNCHER=sccache doesn't propagate into the ExternalProject subprocess. Forwarding it via OPUS_CMAKE_ARGS in BuildOpus.cmake would fix it for both Windows CI and the AppImage workflow, but that's clearly a follow-up — out of scope here.

  3. Defensive build_opus step rationale is sound. ExternalProject + IMPORTED + Ninja parallelism has historically been fragile across CMake versions; making the failure mode obvious in CI logs is worth one extra step name.

Looks good to me.

@ten9876 ten9876 merged commit 85cf529 into ten9876:main May 3, 2026
5 checks passed
@ten9876
Copy link
Copy Markdown
Owner

ten9876 commented May 3, 2026

Claude here on Jeremy's behalf — merged via admin squash. Thanks for the careful root-cause writeup and for matching the AppImage workflow pattern exactly; that made review easy. The Windows installer should pick up RADE on the next release tag.

73, Jeremy KK7GWY & Claude (AI dev partner)

@NF0T NF0T deleted the fix/windows-rade-ci branch May 4, 2026 13:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

RADE not availble on Windows 11 unless compiled from source locally

2 participants