Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 82 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
name: Release

on:
push:
tags:
- "v*"

permissions:
contents: write

jobs:
windows_release:
name: Windows Release (NSIS)
runs-on: windows-latest

steps:
- name: Checkout (full history)
uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 0

- name: Ensure tag commit is on develop
shell: bash
run: |
set -euo pipefail
git fetch origin develop:refs/remotes/origin/develop

TAG_SHA="$(git rev-list -n 1 "$GITHUB_REF")"
echo "Tag ref: $GITHUB_REF"
echo "Tag SHA: $TAG_SHA"

if git merge-base --is-ancestor "$TAG_SHA" "origin/develop"; then
echo "OK: Tag commit is reachable from origin/develop"
else
echo "::error::Tag commit is NOT on develop. Refusing to release."
exit 1
fi

- name: Decide prerelease flag
shell: bash
# Pattern must match vMAJOR.MINOR.PATCH-beta.N; keep in sync with the
# regex used in CMakeLists.txt for git-tag-based version extraction.
run: |
set -euo pipefail
TAG="${GITHUB_REF_NAME}"
if [[ "$TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+-beta\.[0-9]+$ ]]; then
IS_PRERELEASE=true
else
IS_PRERELEASE=false
fi
echo "PRERELEASE=${IS_PRERELEASE}" >> "$GITHUB_ENV"
echo "Tag: ${TAG}, Prerelease: ${IS_PRERELEASE}"

- name: Install NSIS
run: choco install nsis -y

- name: Configure (CMake)
run: cmake -S . -B build -DBUILD_EXAMPLES=OFF -DBUILD_TESTING=OFF -Wno-dev

- name: Build + Package (CPack/NSIS)
run: cmake --build build --config Release --target package

- name: Find installer
# CPack places the generated installer under this fixed directory when
# targeting the NSIS generator on Windows (win64). The same path is
# used in build.yml's upload-artifact step.
shell: pwsh
run: |
$installer = Get-ChildItem -Path "build/_CPack_Packages/win64/NSIS" -Filter *.exe -Recurse | Select-Object -First 1
if (-not $installer) { throw "Installer .exe not found" }
"INSTALLER_PATH=$($installer.FullName)" | Out-File -FilePath $env:GITHUB_ENV -Append
Write-Host "Found installer: $($installer.FullName)"

- name: Create GitHub Release and upload NSIS installer
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ github.ref_name }}
name: ${{ github.ref_name }}
generate_release_notes: true
prerelease: ${{ env.PRERELEASE }}
files: ${{ env.INSTALLER_PATH }}
25 changes: 25 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,31 @@ set(PROJECT_VERSION
"${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}"
)

find_package(Git QUIET)
if(GIT_FOUND)
execute_process(
COMMAND ${GIT_EXECUTABLE} describe --tags --exact-match HEAD
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE GIT_TAG
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
if(GIT_TAG MATCHES "^v([0-9]+)\\.([0-9]+)\\.([0-9]+)(-beta\\.[0-9]+)?$")
set(PROJECT_VERSION_MAJOR ${CMAKE_MATCH_1})
set(PROJECT_VERSION_MINOR ${CMAKE_MATCH_2})
set(PROJECT_VERSION_PATCH ${CMAKE_MATCH_3})
if(CMAKE_MATCH_4)
set(PROJECT_VERSION
"${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}${CMAKE_MATCH_4}"
)
else()
set(PROJECT_VERSION
"${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}"
)
endif()
message(
STATUS "Building from git tag: ${GIT_TAG}, version: ${PROJECT_VERSION}")
endif()
endif()

set(BUILD_EXAMPLES OFF)
set(BUILD_TESTING OFF)

Expand Down
Loading