changelog for v1.2.2-beta3 - 2026-07-14 #270
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |