Skip to content

MINGW: convert resource file to ANSI. #96

MINGW: convert resource file to ANSI.

MINGW: convert resource file to ANSI. #96

Workflow file for this run

name: windows-build
on:
push:
pull_request:
permissions:
contents: read
jobs:
build:
runs-on: windows-latest
strategy:
fail-fast: false
matrix:
include:
- arch: x64
cmake_platform: x64
configuration: Release
cmake_extra_args: ""
vcpkg_triplet: x64-windows
- arch: x86
cmake_platform: Win32
configuration: Release
cmake_extra_args: -DWITH_ASM=OFF
vcpkg_triplet: x86-windows
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
- name: Select Visual Studio generator
id: vs_generator
shell: pwsh
run: |
$ErrorActionPreference = "Stop"
$vswhere = Join-Path ${env:ProgramFiles(x86)} "Microsoft Visual Studio\Installer\vswhere.exe"
$vsInstances = & $vswhere -latest -products * -format json | ConvertFrom-Json
$vsInstance = @($vsInstances)[0]
if ($null -eq $vsInstance) {
Write-Error "No Visual Studio installation was found."
exit 1
}
$vsVersion = [string]$vsInstance.installationVersion
if ([string]::IsNullOrWhiteSpace($vsVersion)) {
Write-Error "Visual Studio installation did not report a version."
exit 1
}
$vcToolsVersionFile = Join-Path $vsInstance.installationPath "VC\Auxiliary\Build\Microsoft.VCToolsVersion.default.txt"
if (-not (Test-Path $vcToolsVersionFile)) {
Write-Error "Visual Studio was found, but C++ tools were not found at $vcToolsVersionFile."
exit 1
}
$major = [int]($vsVersion.Split(".")[0])
if ($major -ge 18) {
$generator = "Visual Studio 18 2026"
} elseif ($major -eq 17) {
$generator = "Visual Studio 17 2022"
} else {
Write-Error "Unsupported Visual Studio version: $vsVersion"
exit 1
}
$cmake = Get-Command cmake -ErrorAction SilentlyContinue
if ($null -eq $cmake) {
Write-Error "CMake was not found on PATH."
exit 1
}
$cmakeHelp = & $cmake.Source --help | Out-String
if (-not $cmakeHelp.Contains($generator)) {
Write-Error "The installed CMake does not support the '$generator' generator."
exit 1
}
"cmake_generator=$generator" | Out-File -FilePath $env:GITHUB_OUTPUT -Append
"vs_major=$major" | Out-File -FilePath $env:GITHUB_OUTPUT -Append
Write-Host "Using CMake generator: $generator"
- name: Cache vcpkg
uses: actions/cache@v4
with:
path: |
C:\vcpkg\downloads
C:\vcpkg\archives
C:\vcpkg\buildtrees
C:\vcpkg\packages
C:\vcpkg\binarycache
key: ${{ runner.os }}-${{ matrix.arch }}-vs${{ steps.vs_generator.outputs.vs_major }}-vcpkg-${{ hashFiles('vcpkg.json', 'vcpkg-configuration.json') }}
- name: Install FFmpeg (vcpkg)
shell: pwsh
run: |
$vcpkgRoot = "C:\vcpkg"
if (-not (Test-Path $vcpkgRoot)) {
git clone https://github.com/microsoft/vcpkg $vcpkgRoot
}
& "$vcpkgRoot\bootstrap-vcpkg.bat"
$env:VCPKG_BINARY_SOURCES = "clear;files,C:\vcpkg\binarycache,readwrite"
Push-Location $env:GITHUB_WORKSPACE
& "$vcpkgRoot\vcpkg.exe" install --triplet ${{ matrix.vcpkg_triplet }}
Pop-Location
- name: Cache CMake deps
uses: actions/cache@v4
with:
path: Projects/VS/_deps
key: ${{ runner.os }}-${{ matrix.arch }}-vs${{ steps.vs_generator.outputs.vs_major }}-cmake-deps-${{ hashFiles('CMakeLists.txt') }}
- name: Configure
run: cmake -S . -B Projects/VS -G "${{ steps.vs_generator.outputs.cmake_generator }}" -A ${{ matrix.cmake_platform }} ${{ matrix.cmake_extra_args }} -DOPENFODDER_ENABLE_FFMPEG=ON -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=${{ matrix.vcpkg_triplet }}
- name: Build
run: cmake --build Projects/VS --config ${{ matrix.configuration }}
- name: Test
shell: pwsh
run: |
$runDir = "$env:GITHUB_WORKSPACE\Run"
$stashDir = "$env:RUNNER_TEMP\openfodder-runtime"
$ffmpegBin = "$env:GITHUB_WORKSPACE\vcpkg_installed\${{ matrix.vcpkg_triplet }}\bin"
if (-not (Test-Path $ffmpegBin)) {
$ffmpegBin = "C:\vcpkg\installed\${{ matrix.vcpkg_triplet }}\bin"
}
New-Item -ItemType Directory -Path $stashDir -Force | Out-Null
Copy-Item "$runDir\openfodder.exe" -Destination $stashDir -Force -ErrorAction SilentlyContinue
Copy-Item "$runDir\SDL3.dll" -Destination $stashDir -Force -ErrorAction SilentlyContinue
Copy-Item "$runDir\SDL3_mixer.dll" -Destination $stashDir -Force -ErrorAction SilentlyContinue
$dataRepoDir = "$env:RUNNER_TEMP\openfodder-data"
if (Test-Path $dataRepoDir) { Remove-Item $dataRepoDir -Recurse -Force }
git clone --single-branch https://github.com/OpenFodder/data.git $dataRepoDir
if (Test-Path $runDir) { Remove-Item $runDir -Recurse -Force }
New-Item -ItemType Directory -Path $runDir -Force | Out-Null
Copy-Item "$dataRepoDir\*" $runDir -Recurse -Force
Copy-Item "$stashDir\openfodder.exe" -Destination $runDir -Force -ErrorAction SilentlyContinue
Copy-Item "$stashDir\SDL3.dll" -Destination $runDir -Force -ErrorAction SilentlyContinue
Copy-Item "$stashDir\SDL3_mixer.dll" -Destination $runDir -Force -ErrorAction SilentlyContinue
if (Test-Path "$runDir/Tests") { Remove-Item "$runDir/Tests" -Recurse -Force }
git clone https://github.com/OpenFodder/tests.git $runDir/Tests
Copy-Item "$ffmpegBin\avcodec*.dll" -Destination $runDir -Force
Copy-Item "$ffmpegBin\avformat*.dll" -Destination $runDir -Force
Copy-Item "$ffmpegBin\avutil*.dll" -Destination $runDir -Force
Copy-Item "$ffmpegBin\swscale*.dll" -Destination $runDir -Force
Copy-Item "$ffmpegBin\swresample*.dll" -Destination $runDir -Force
Push-Location $runDir
.\openfodder.exe --appveyor --unit-test-headless
if ($LASTEXITCODE -ne 0) {
exit $LASTEXITCODE
}
Pop-Location
- name: Package
shell: pwsh
run: |
$archive = "OpenFodder-${{ matrix.arch }}-${{ matrix.configuration }}-latest.zip"
$ffmpegBin = "$env:GITHUB_WORKSPACE\vcpkg_installed\${{ matrix.vcpkg_triplet }}\bin"
if (-not (Test-Path $ffmpegBin)) {
$ffmpegBin = "C:\vcpkg\installed\${{ matrix.vcpkg_triplet }}\bin"
}
if (-not (Test-Path $ffmpegBin)) {
Write-Error "FFmpeg binaries not found in vcpkg_installed or C:\vcpkg\installed for ${{ matrix.vcpkg_triplet }}."
exit 1
}
$ffmpegDlls = Get-ChildItem $ffmpegBin -Filter *.dll | Where-Object {
$_.Name -match "^(avcodec|avformat|avutil|swscale|swresample)"
} | Select-Object -ExpandProperty FullName
$items = @(
"$env:GITHUB_WORKSPACE\Run\openfodder.exe",
"$env:GITHUB_WORKSPACE\Run\SDL3.dll",
"$env:GITHUB_WORKSPACE\Run\SDL3_mixer.dll",
"$env:GITHUB_WORKSPACE\README.md",
"$env:GITHUB_WORKSPACE\COPYING",
"$env:GITHUB_WORKSPACE\openfodder.ini.example"
) + $ffmpegDlls
if (Test-Path $archive) { Remove-Item $archive -Force }
Compress-Archive -Path $items -DestinationPath $archive
- name: Upload artifact
uses: actions/upload-artifact@v4
id: upload_artifact
with:
name: OpenFodder-${{ matrix.arch }}-${{ matrix.configuration }}-latest
path: OpenFodder-${{ matrix.arch }}-${{ matrix.configuration }}-latest.zip
- name: Configure AWS credentials
if: github.event_name == 'push' && github.ref == 'refs/heads/master'
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.AWS_REGION || 'us-east-1' }}
- name: Upload build zip to S3
if: github.event_name == 'push' && github.ref == 'refs/heads/master'
shell: pwsh
run: |
$zipName = "OpenFodder-${{ matrix.arch }}-${{ matrix.configuration }}-latest.zip"
aws s3 cp "$zipName" "s3://openfodder-builds/$zipName" --acl public-read
- name: Discord notification
if: always() && github.event_name == 'push' && github.ref == 'refs/heads/master'
shell: pwsh
env:
DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
run: |
if ([string]::IsNullOrWhiteSpace($env:DISCORD_WEBHOOK_URL)) { exit 0 }
$status = if ("${{ job.status }}" -eq "success") { "Success" } else { "Failure" }
$color = if ("${{ job.status }}" -eq "success") { 3066993 } else { 15158332 }
$title = "OpenFodder Windows build $status (${{ matrix.arch }})"
$runUrl = "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}"
$artifactUrl = "https://s3.amazonaws.com/openfodder-builds/OpenFodder-${{ matrix.arch }}-${{ matrix.configuration }}-latest.zip"
$event = Get-Content $env:GITHUB_EVENT_PATH -Raw | ConvertFrom-Json
$commitMessage = $event.head_commit.message
if (-not $commitMessage) { $commitMessage = $event.pull_request.title }
if (-not $commitMessage) { $commitMessage = "N/A" }
$payload = @{
username = "GitHub Actions"
embeds = @(
@{
title = $title
url = $runUrl
color = $color
fields = @(
@{ name = "Commit"; value = "${{ github.sha }}"; inline = $true }
@{ name = "Branch"; value = "${{ github.ref_name }}"; inline = $true }
@{ name = "Config"; value = "${{ matrix.configuration }}"; inline = $true }
@{ name = "Commit Message"; value = $commitMessage; inline = $false }
@{ name = "Download"; value = $artifactUrl; inline = $false }
)
}
)
} | ConvertTo-Json -Depth 5
Invoke-RestMethod -Method Post -Uri $env:DISCORD_WEBHOOK_URL -ContentType "application/json" -Body $payload