Skip to content

changelog for v1.2.2-beta3 - 2026-07-14 #270

changelog for v1.2.2-beta3 - 2026-07-14

changelog for v1.2.2-beta3 - 2026-07-14 #270

Workflow file for this run

name: Build Binaries
on:
push:
branches-ignore:
- nightly
tags:
- 'v[0-9]*.[0-9]*.[0-9]*'
pull_request:
branches-ignore:
- nightly
workflow_dispatch:
# Least privilege at the workflow level: the 20+ build jobs (which run
# third-party code through Docker/Gradle) only need read. contents: write is
# granted per-job on update_nightly_release/create_release, the only jobs that
# publish releases.
permissions:
contents: read
actions: read # Standard workflow permission
env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
jobs:
prepare:
# Version read, AppImage change-detection, and tag validation in one job:
# they all just need a single full-history checkout and none warrant
# their own runner.
runs-on: ubuntu-latest
outputs:
version: ${{ steps.read.outputs.version }}
version_full: ${{ steps.read.outputs.version_full }}
appimage: ${{ steps.filter.outputs.appimage }}
steps:
- uses: actions/checkout@v5
with:
fetch-depth: 0
- name: Read version
id: read
run: |
eval "$(scripts/get_version.sh "$GITHUB_WORKSPACE")"
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "version_full=$VERSION_FULL" >> $GITHUB_OUTPUT
# On PRs, AppImage builds are gated on whether AppImage-relevant files changed
# (saves ~30 min of CI on the average PR). On push/tag/dispatch, always build.
- id: filter
run: |
if [ "${{ github.event_name }}" != "pull_request" ]; then
echo "appimage=true" >> $GITHUB_OUTPUT
exit 0
fi
BASE="${{ github.event.pull_request.base.sha }}"
# AppImage packaging depends on:
# - the appimage build scripts and reusable workflow
# - the orchestrator workflow (matrix changes)
# - the desktop file (referenced by linuxdeploy)
# - the root and core CMakeLists (install paths, INSTALL_PREFIX define)
# - CMakePresets.json (the ci-appimage configure preset)
# - sdrpp_module.cmake (plugin install destination)
# - core.cpp (resource/module path resolution + APPDIR override)
# - command_args.cpp (config root directory selection)
# - core curl/HTTP wrappers and curl-using modules
# - the icon resource (referenced by the desktop file)
if git diff --name-only "$BASE...HEAD" | \
grep -qE '^(docker_builds/appimage/|deps/|\.github/workflows/build_appimage\.yml|\.github/workflows/build_all\.yml|sdrpp-iak\.desktop|CMakeLists\.txt|CMakePresets\.json|core/CMakeLists\.txt|sdrpp_module\.cmake|cmake/sdrpp_collect_required_deps\.cmake|cmake/sdrpp_dep_list_helpers\.cmake|cmake/sdrpp_find_dep\.cmake|core/src/core\.cpp|core/src/command_args\.cpp|core/src/utils/curl_init\.(cpp|h)|core/src/utils/proto/curl_http\.(cpp|h)|misc_modules/spots/|root/res/icons/)'; then
echo "appimage=true" >> $GITHUB_OUTPUT
else
echo "appimage=false" >> $GITHUB_OUTPUT
fi
# On tag pushes, verify the tag matches the version in version.h before
# starting expensive platform builds; fails the job (and everything
# depending on it) rather than being a separate no-op job on non-tag runs.
- name: Check tag vs version.h
if: github.ref_type == 'tag'
env:
TAG: ${{ github.ref_name }}
HEADER_VER: ${{ steps.read.outputs.version }}
run: |
EXPECTED="v${HEADER_VER}"
if [ "$TAG" != "$EXPECTED" ]; then
echo "ERROR: tag '${TAG}' does not match version.h ('${EXPECTED}')"
exit 1
fi
echo "Tag ${TAG} matches version.h — OK"
build_windows:
strategy:
fail-fast: false
matrix:
include:
- arch: x64
vcvars_arg: x64
preset: msvc-x64-release
deps_build_dir: build-default-Release
- arch: arm64
vcvars_arg: x64_arm64
preset: msvc-arm64-release
deps_build_dir: build-default-arm64-Release
needs: [prepare]
runs-on: windows-2025-vs2026
steps:
- uses: actions/checkout@v5
- uses: actions/setup-python@v6
with:
python-version: '3.12'
- name: Install Python package for volk
shell: pwsh
run: |
& "$env:pythonLocation\python.exe" -m pip install --user mako
& "$env:pythonLocation\python.exe" -c "import sys, mako; print('VOLK Python:', sys.executable); print('Mako:', mako.__version__)"
- name: Cache deps
uses: ./.github/actions/deps-cache
with:
destdir-path: deps/${{ matrix.deps_build_dir }}/destdir
key-suffix: windows-${{ matrix.arch }}
- name: Configure
working-directory: ${{ github.workspace }}
shell: cmd
run: |
call "C:\Program Files\Microsoft Visual Studio\18\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" ${{ matrix.vcvars_arg }}
cmake --preset ${{ matrix.preset }} "-DPython3_EXECUTABLE=%pythonLocation%\python.exe"
- name: Build
working-directory: ${{ github.workspace }}
shell: cmd
run: |
call "C:\Program Files\Microsoft Visual Studio\18\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" ${{ matrix.vcvars_arg }}
cmake --build build-${{ matrix.preset }} --config Release --verbose
- name: Create Archive
working-directory: ${{runner.workspace}}
run: '&($Env:GITHUB_WORKSPACE + "/make_windows_package.ps1") ($Env:GITHUB_WORKSPACE + "/build-${{ matrix.preset }}") ($Env:GITHUB_WORKSPACE + "/root") Release ${{ matrix.arch }}'
# Renamed to the artifact name here (rather than in create_full_archive)
# so the file inside the artifact already has its final published name.
- name: Rename Archive
working-directory: ${{runner.workspace}}
run: Move-Item sdrpp_windows_${{ matrix.arch }}.zip sdrpp-iak-${{ needs.prepare.outputs.version_full }}-windows-${{ matrix.arch }}.zip
- name: Save Archive
uses: actions/upload-artifact@v6
with:
name: sdrpp-iak-${{ needs.prepare.outputs.version_full }}-windows-${{ matrix.arch }}
path: ${{runner.workspace}}/sdrpp-iak-${{ needs.prepare.outputs.version_full }}-windows-${{ matrix.arch }}.zip
build_macos:
strategy:
fail-fast: false
matrix:
include:
- runner: macos-15-intel
artifact_suffix: macos-intel
preset: ci-macos-intel
- runner: macos-15
artifact_suffix: macos-arm
preset: ci-macos-arm
needs: [prepare]
uses: ./.github/workflows/build_macos.yml
with:
runner: ${{ matrix.runner }}
artifact: sdrpp-iak-${{ needs.prepare.outputs.version_full }}-${{ matrix.artifact_suffix }}
preset: ${{ matrix.preset }}
build_linux:
strategy:
fail-fast: false
matrix:
include:
- base_image: debian:bullseye
runner: ubuntu-latest
artifact: debian-bullseye-amd64
volk_package: libvolk2-dev
extra_apt: ''
curl_source: bundled
- base_image: debian:bullseye
runner: ubuntu-24.04-arm
artifact: debian-bullseye-aarch64
volk_package: libvolk2-dev
extra_apt: ''
curl_source: bundled
- base_image: debian:bookworm
runner: ubuntu-latest
artifact: debian-bookworm-amd64
volk_package: libvolk2-dev
extra_apt: ''
curl_source: bundled
- base_image: debian:bookworm
runner: ubuntu-24.04-arm
artifact: debian-bookworm-aarch64
volk_package: libvolk2-dev
extra_apt: ''
curl_source: bundled
- base_image: debian:trixie
runner: ubuntu-latest
artifact: debian-trixie-amd64
volk_package: libvolk-dev
extra_apt: ''
curl_source: system
- base_image: debian:trixie
runner: ubuntu-24.04-arm
artifact: debian-trixie-aarch64
volk_package: libvolk-dev
extra_apt: ''
curl_source: system
# Sid's tpm-udev can otherwise pull full systemd, whose
# systemd-tpm dependency creates a dpkg configure cycle.
- base_image: debian:sid
runner: ubuntu-latest
artifact: debian-sid-amd64
volk_package: libvolk-dev
extra_apt: ca-certificates systemd-standalone-sysusers
curl_source: system
- base_image: debian:sid
runner: ubuntu-24.04-arm
artifact: debian-sid-aarch64
volk_package: libvolk-dev
extra_apt: ca-certificates systemd-standalone-sysusers
curl_source: system
- base_image: ubuntu:focal
runner: ubuntu-latest
artifact: ubuntu-focal-amd64
volk_package: libvolk2-dev
extra_apt: ''
curl_source: bundled
- base_image: ubuntu:focal
runner: ubuntu-24.04-arm
artifact: ubuntu-focal-aarch64
volk_package: libvolk2-dev
extra_apt: ''
curl_source: bundled
- base_image: ubuntu:jammy
runner: ubuntu-latest
artifact: ubuntu-jammy-amd64
volk_package: libvolk2-dev
extra_apt: ''
curl_source: bundled
- base_image: ubuntu:jammy
runner: ubuntu-24.04-arm
artifact: ubuntu-jammy-aarch64
volk_package: libvolk2-dev
extra_apt: ''
curl_source: bundled
- base_image: ubuntu:noble
runner: ubuntu-latest
artifact: ubuntu-noble-amd64
volk_package: libvolk-dev
extra_apt: ''
curl_source: system
- base_image: ubuntu:noble
runner: ubuntu-24.04-arm
artifact: ubuntu-noble-aarch64
volk_package: libvolk-dev
extra_apt: ''
curl_source: system
- base_image: ubuntu:resolute
runner: ubuntu-latest
artifact: ubuntu-resolute-amd64
volk_package: libvolk-dev
extra_apt: ''
curl_source: system
- base_image: ubuntu:resolute
runner: ubuntu-24.04-arm
artifact: ubuntu-resolute-aarch64
volk_package: libvolk-dev
extra_apt: ''
curl_source: system
needs: [prepare]
uses: ./.github/workflows/build_linux.yml
with:
base_image: ${{ matrix.base_image }}
runner: ${{ matrix.runner }}
artifact: sdrpp-iak-${{ needs.prepare.outputs.version_full }}-${{ matrix.artifact }}
volk_package: ${{ matrix.volk_package }}
extra_apt: ${{ matrix.extra_apt }}
curl_source: ${{ matrix.curl_source }}
version_full: ${{ needs.prepare.outputs.version_full }}
build_appimage:
strategy:
fail-fast: false
matrix:
include:
- runner: ubuntu-latest
arch: x86_64
artifact_suffix: linux-appimage-x86_64
- runner: ubuntu-24.04-arm
arch: aarch64
artifact_suffix: linux-appimage-aarch64
needs: [prepare]
if: needs.prepare.outputs.appimage == 'true'
uses: ./.github/workflows/build_appimage.yml
with:
runner: ${{ matrix.runner }}
arch: ${{ matrix.arch }}
artifact: sdrpp-iak-${{ needs.prepare.outputs.version_full }}-${{ matrix.artifact_suffix }}
version_full: ${{ needs.prepare.outputs.version_full }}
build_android:
needs: [prepare]
uses: ./.github/workflows/build_android.yml
with:
version_full: ${{ needs.prepare.outputs.version_full }}
secrets:
ANDROID_KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }}
ANDROID_KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
ANDROID_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }}
create_full_archive:
needs: [
'prepare',
'build_windows',
'build_macos',
'build_linux',
'build_appimage',
'build_android'
]
# build_appimage may be skipped on PRs that don't touch AppImage files.
if: |
always() &&
needs.prepare.result == 'success' &&
needs.build_windows.result == 'success' &&
needs.build_macos.result == 'success' &&
needs.build_linux.result == 'success' &&
needs.build_android.result == 'success' &&
(needs.build_appimage.result == 'success' || needs.build_appimage.result == 'skipped')
runs-on: ubuntu-latest
steps:
# A default depth-1 checkout is enough: this job only runs `git archive
# HEAD`, which needs the working tree, not full history.
- uses: actions/checkout@v5
# Every build job names its output file after its own artifact name
# (sdrpp-iak-${VER}-<suffix>.<ext>), so merging them by pattern needs
# no per-artifact rename table here — new matrix entries just flow
# through. Optional artifacts (AppImages, signed release APKs) simply
# aren't present when skipped; nothing to guard.
- name: Download All Builds
uses: actions/download-artifact@v7
with:
path: sdrpp_all
pattern: sdrpp-iak-*
merge-multiple: true
- name: Add source archive
env:
VER: ${{ needs.prepare.outputs.version_full }}
run: git archive --format=tar.gz --prefix=sdrpp-iak-${VER}/ HEAD -o sdrpp_all/sdrpp-iak-${VER}-source.tar.gz
- uses: actions/upload-artifact@v6
with:
name: sdrpp-iak-${{ needs.prepare.outputs.version_full }}-all
path: sdrpp_all/
update_nightly_release:
needs: [prepare, create_full_archive]
runs-on: ubuntu-latest
permissions:
contents: write
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }}
steps:
# Only the merged -all bundle is needed here; pulling it by name (into a
# dir of the same name) avoids re-downloading all ~25 per-platform
# artifacts that create_full_archive already merged into it.
- name: Download All Builds
uses: actions/download-artifact@v7
with:
name: sdrpp-iak-${{ needs.prepare.outputs.version_full }}-all
path: sdrpp-iak-${{ needs.prepare.outputs.version_full }}-all
- name: Create or Update Nightly Release
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
VER: ${{ needs.prepare.outputs.version_full }}
run: |
NOTES="Nightly build — v${VER} (commit ${{ github.sha }}) built $(date -u '+%Y-%m-%d %H:%M UTC')"
# Create the release if it does not exist yet
gh release view nightly -R ${{github.repository}} 2>/dev/null || \
gh release create nightly -R ${{github.repository}} --title "Nightly Build" --notes "$NOTES" --prerelease
# Always refresh the release notes so they reflect the latest commit
gh release edit nightly -R ${{github.repository}} --notes "$NOTES"
# Remove assets from the previous build that are no longer produced
gh release view nightly -R ${{github.repository}} --json assets --jq '.assets[].name' | while read -r asset; do
if [ -n "$asset" ] && [ ! -f "sdrpp-iak-${VER}-all/$asset" ]; then
gh release delete-asset nightly "$asset" -R ${{github.repository}} --yes
fi
done
# Upload artifacts (--clobber overwrites existing files with the same name)
gh release upload nightly sdrpp-iak-${VER}-all/* -R ${{github.repository}} --clobber
create_release:
needs: [prepare, create_full_archive]
runs-on: ubuntu-latest
permissions:
contents: write
if: github.ref_type == 'tag'
steps:
# Only the merged -all bundle is needed here; pulling it by name (into a
# dir of the same name) avoids re-downloading all ~25 per-platform
# artifacts that create_full_archive already merged into it.
- name: Download All Builds
uses: actions/download-artifact@v7
with:
name: sdrpp-iak-${{ needs.prepare.outputs.version_full }}-all
path: sdrpp-iak-${{ needs.prepare.outputs.version_full }}-all
- name: Publish GitHub Release
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
VER: ${{ needs.prepare.outputs.version_full }}
run: |
# Mark alpha/beta/rc tags as pre-releases on GitHub.
PRERELEASE_FLAG=""
if echo "${{ github.ref_name }}" | grep -qE '\-(alpha|beta|rc)[0-9]*$'; then
PRERELEASE_FLAG="--prerelease"
fi
gh release create "${{ github.ref_name }}" \
sdrpp-iak-${VER}-all/* \
--title "SDR++ iak ${{ github.ref_name }}" \
--generate-notes \
$PRERELEASE_FLAG \
--repo ${{ github.repository }}
check_spelling:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Install codespell
run: pip install --user codespell
# Advisory only: codespell has no ignore-words-list tuned for this repo
# (RF/SDR jargon, vendor names, etc. read as typos), so its output is
# noisy enough that gating CI on it would block unrelated PRs. Read
# the job's log for hits rather than relying on its (always-green)
# conclusion.
- name: Running codespell
run: cd $GITHUB_WORKSPACE && codespell -q 2 || true
check_formatting:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
# Advisory only: formatting diffs should be visible in CI logs,
# but should not block packaging/release jobs.
- name: Run clang-format check
run: cd $GITHUB_WORKSPACE && chmod +x ./clang_format.sh && ./clang_format.sh --check || true