Skip to content

Vulkan: extract volumetric fog pass to vk_volumetric_pass_compute.c #576

Vulkan: extract volumetric fog pass to vk_volumetric_pass_compute.c

Vulkan: extract volumetric fog pass to vk_volumetric_pass_compute.c #576

Workflow file for this run

name: build
# CI matrix: Windows (MSYS/MSVC), Ubuntu (x86_64/ARM), macOS, Android
permissions:
contents: read
on:
pull_request:
paths-ignore:
- '**/*.md'
- '**/LICENSE*'
- '**/.gitignore'
- 'docs/**'
push:
branches:
- main
- next-gen
- next-gen-2
- next-gen-3
- next-gen-4
- next-gen-5
- proximity-voice-chat
paths-ignore:
- '**/*.md'
- '**/LICENSE*'
- '**/.gitignore'
- 'docs/**'
release:
types: [published]
workflow_dispatch:
jobs:
windows-msys:
name: ${{ matrix.btype }} Windows-${{ matrix.cc }} ${{ matrix.arch }}
runs-on: windows-2022
strategy:
fail-fast: false
matrix:
# removed 32-bit x86
arch: [x86_64]
cc: [gcc]
btype: [Release, Debug]
include:
- arch: x86_64
msystem: MINGW64
prefix: mingw-w64-x86_64
defaults:
run:
shell: msys2 {0}
steps:
- uses: msys2/setup-msys2@v2
with:
install: >-
base-devel
coreutils
file
${{ matrix.prefix }}-binutils
${{ matrix.prefix }}-make
${{ matrix.prefix }}-${{ matrix.cc }}
${{ matrix.prefix }}-cmake
${{ matrix.prefix }}-ninja
${{ matrix.prefix }}-pkgconf
msystem: ${{ matrix.msystem }}
path-type: minimal
release: false
update: true
cache: true
- name: Install MSYS2 deps (retry on slow mirrors)
shell: msys2 {0}
run: |
set -e
pkgs="${{ matrix.prefix }}-SDL2 ${{ matrix.prefix }}-openal ${{ matrix.prefix }}-freetype ${{ matrix.prefix }}-lua ${{ matrix.prefix }}-openssl"
for attempt in 1 2 3 4 5; do
pacman -S --needed --noconfirm $pkgs && exit 0
echo "pacman attempt $attempt failed, retrying in $((attempt * 20))s..."
sleep $((attempt * 20))
done
exit 1
- uses: actions/checkout@v4
- name: Build Vulkan
if: ${{ github.event_name != 'release' || matrix.btype != 'Debug' }}
env:
CFLAGS: "-DSKIP_IDPAK_CHECK=1"
CXXFLAGS: "-DSKIP_IDPAK_CHECK=1"
run: |
mkdir -p build-vk-${{ matrix.btype }}
cmake -S . -B build-vk-${{ matrix.btype }} -G Ninja \
-DCMAKE_BUILD_TYPE=${{ matrix.btype }} \
-DCI_BUILD=OFF \
-DUSE_STB_TRUETYPE=ON \
-DBUILD_FREETYPE=ON \
-DENABLE_FORTIFY_SOURCE=OFF \
-DENABLE_ASAN=OFF \
-DBUILD_SERVER=ON \
-DUSE_VULKAN=ON \
-DRENDERER_DEFAULT=vulkan \
-DSKIP_IDPAK_CHECK=ON \
-DSKIP_SHADER_REGEN=ON \
-Wno-dev
cmake --build build-vk-${{ matrix.btype }} -j$(nproc)
mkdir -p bin
cp -f build-vk-${{ matrix.btype }}/idtech3* bin/ || true
bash ./scripts/stage_mingw_runtime_dlls.sh bin
- name: Build OpenGL
if: ${{ github.event_name != 'release' || matrix.btype != 'Debug' }}
env:
CFLAGS: "-DSKIP_IDPAK_CHECK=1"
CXXFLAGS: "-DSKIP_IDPAK_CHECK=1"
run: |
mkdir -p build-gl-${{ matrix.btype }}
cmake -S . -B build-gl-${{ matrix.btype }} -G Ninja \
-DCMAKE_BUILD_TYPE=${{ matrix.btype }} \
-DCI_BUILD=OFF \
-DUSE_STB_TRUETYPE=ON \
-DBUILD_FREETYPE=ON \
-DENABLE_FORTIFY_SOURCE=OFF \
-DENABLE_ASAN=OFF \
-DBUILD_SERVER=ON \
-DUSE_VULKAN=ON \
-DRENDERER_DEFAULT=opengl \
-DSKIP_IDPAK_CHECK=ON \
-DSKIP_SHADER_REGEN=ON \
-Wno-dev
cmake --build build-gl-${{ matrix.btype }} -j$(nproc)
cp -f build-gl-${{ matrix.btype }}/idtech3* bin/ || true
bash ./scripts/stage_mingw_runtime_dlls.sh bin
- name: Verify PE architecture (native compat)
if: matrix.cc == 'gcc' && matrix.btype == 'Release'
shell: pwsh
run: ./scripts/windows_native_compat_check.ps1 -BinDir bin
- name: Verify PE exports (optional game DLLs; CMake disables dlopen renderer on Windows)
if: matrix.cc == 'gcc' && matrix.btype == 'Release'
shell: pwsh
run: ./scripts/windows_pe_exports_check.ps1 -BinDir bin -SkipRendererDlls
- name: Smoke test
if: ${{ github.event_name != 'release' && matrix.btype != 'Debug' }}
run: |
mkdir -p release
cp -f bin/idtech3* release/ || true
chmod +x scripts/smoke_test.sh
./scripts/smoke_test.sh release
- uses: actions/upload-artifact@v4
if: matrix.cc == 'gcc' && matrix.btype == 'Release'
with:
name: windows-${{ matrix.cc }}-${{ matrix.arch }}
path: bin
if-no-files-found: warn
retention-days: 5
windows-msvc:
name: ${{ matrix.btype }} Windows-MSVC ${{ matrix.arch }}
runs-on: windows-2022
strategy:
fail-fast: false
matrix:
include:
# vcxproj TargetName differs Debug vs Release; never pass /p:TargetName on msbuild (breaks zlib via ProjectReference).
- arch: arm64
platform: ARM64
suffix: .arm64
pkg_suffix: arm64
btype: Release
msvc_out_ded: idtech3_server.exe
msvc_out_cli: idtech3.exe
- arch: arm64
platform: ARM64
suffix: .arm64
pkg_suffix: arm64
btype: Debug
msvc_out_ded: idtech3_server-debug.exe
msvc_out_cli: idtech3-debug.exe
- arch: x64
platform: x64
suffix: .x64
pkg_suffix: x86_64
btype: Release
msvc_out_ded: idtech3_server.exe
msvc_out_cli: idtech3.exe
- arch: x64
platform: x64
suffix: .x64
pkg_suffix: x86_64
btype: Debug
msvc_out_ded: idtech3_server-debug.exe
msvc_out_cli: idtech3-debug.exe
steps:
- uses: microsoft/setup-msbuild@v2
- uses: actions/checkout@v4
- name: Install OpenSSL (Win64) for DTLS
shell: pwsh
run: |
choco install openssl -y --no-progress
# GITHUB_ENV must not be written with unquoted paths containing spaces (cmd "echo a=b>>file" breaks at the first space).
$roots = @(
'C:\Program Files\OpenSSL-Win64',
'C:\Program Files\OpenSSL'
)
$found = $null
foreach ($r in $roots) {
$evp = Join-Path $r 'include\openssl\evp.h'
if (Test-Path -LiteralPath $evp) {
$found = $r
break
}
}
if (-not $found) {
$dirs = Get-ChildItem -Path 'C:\Program Files' -Directory -Filter 'OpenSSL*' -ErrorAction SilentlyContinue
foreach ($d in $dirs) {
$evp = Join-Path $d.FullName 'include\openssl\evp.h'
if (Test-Path -LiteralPath $evp) { $found = $d.FullName; break }
}
}
if (-not $found) {
throw "OpenSSL install did not expose include/openssl/evp.h under Program Files (DTLS MSVC build needs headers)."
}
Write-Host "OPENSSL_ROOT_DIR=$found"
"OPENSSL_ROOT_DIR=$found" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
- name: Build
if: ${{ github.event_name != 'release' || matrix.btype != 'Debug' }}
shell: cmd
run: |
if not exist bin mkdir bin
if "%OPENSSL_ROOT_DIR%"=="" (
echo ERROR: OPENSSL_ROOT_DIR is not set — OpenSSL install/discovery step failed.
exit /b 1
)
if not exist "%OPENSSL_ROOT_DIR%\include\openssl\evp.h" (
echo ERROR: OpenSSL headers not found at "%OPENSSL_ROOT_DIR%\include\openssl\evp.h"
exit /b 1
)
set MSBUILD_COMMON=/m ^
/p:Configuration=${{ matrix.btype }} ^
/p:Platform=${{ matrix.platform }} ^
/p:PlatformToolset=v143 ^
/p:TreatWarningsAsErrors=false
rem --- Dedicated server (TargetName is idtech3_server in vcxproj; do not pass /p:TargetName — it poisons ProjectReference builds like zlib) ---
msbuild src\platform\win32\msvc2017\quake3e-ded.vcxproj ^
%MSBUILD_COMMON%
if errorlevel 1 exit /b 1
if not exist src\platform\win32\msvc2017\output\${{ matrix.msvc_out_ded }} (
echo ERROR: missing output\${{ matrix.msvc_out_ded }} after ded build
dir /b src\platform\win32\msvc2017\output 2>nul
exit /b 1
)
copy /Y src\platform\win32\msvc2017\output\${{ matrix.msvc_out_ded }} bin\idtech3_server${{ matrix.suffix }}.exe
if errorlevel 1 exit /b 1
msbuild src\platform\win32\msvc2017\quake3e-ded.vcxproj ^
%MSBUILD_COMMON% ^
/t:Clean
rem --- OpenGL renderer + client ---
msbuild src\platform\win32\msvc2017\opengl.vcxproj ^
%MSBUILD_COMMON%
if errorlevel 1 exit /b 1
msbuild src\platform\win32\msvc2017\quake3e.vcxproj ^
%MSBUILD_COMMON% ^
/p:UseWasapi=0
if errorlevel 1 exit /b 1
if not exist src\platform\win32\msvc2017\output\${{ matrix.msvc_out_cli }} (
echo ERROR: missing output\${{ matrix.msvc_out_cli }} after OpenGL client build
dir /b src\platform\win32\msvc2017\output 2>nul
exit /b 1
)
copy /Y src\platform\win32\msvc2017\output\${{ matrix.msvc_out_cli }} bin\idtech3${{ matrix.suffix }}.exe
if errorlevel 1 exit /b 1
msbuild src\platform\win32\msvc2017\quake3e.vcxproj ^
%MSBUILD_COMMON% ^
/t:Clean ^
/p:UseWasapi=0
msbuild src\platform\win32\msvc2017\opengl.vcxproj ^
%MSBUILD_COMMON% ^
/t:Clean
rem --- Vulkan renderer + client ---
msbuild src\platform\win32\msvc2017\vulkan.vcxproj ^
%MSBUILD_COMMON%
if errorlevel 1 exit /b 1
msbuild src\platform\win32\msvc2017\quake3e.vcxproj ^
%MSBUILD_COMMON% ^
/p:UseWasapi=0
if errorlevel 1 exit /b 1
if not exist src\platform\win32\msvc2017\output\${{ matrix.msvc_out_cli }} (
echo ERROR: missing output\${{ matrix.msvc_out_cli }} after Vulkan client build
dir /b src\platform\win32\msvc2017\output 2>nul
exit /b 1
)
copy /Y src\platform\win32\msvc2017\output\${{ matrix.msvc_out_cli }} bin\idtech3-vulkan${{ matrix.suffix }}.exe
if errorlevel 1 exit /b 1
msbuild src\platform\win32\msvc2017\quake3e.vcxproj ^
%MSBUILD_COMMON% ^
/t:Clean ^
/p:UseWasapi=0
msbuild src\platform\win32\msvc2017\vulkan.vcxproj ^
%MSBUILD_COMMON% ^
/t:Clean
dir /b bin
- name: Verify MSVC staging (Release artifact prep)
if: ${{ matrix.btype == 'Release' }}
shell: pwsh
run: |
$root = $env:GITHUB_WORKSPACE
$bin = Join-Path $root 'bin'
$out = Join-Path $root 'src/platform/win32/msvc2017/output'
$sfx = '${{ matrix.suffix }}'
Write-Host "PWD: $(Get-Location)"
Write-Host "`n--- bin ---"
if (Test-Path -LiteralPath $bin) { Get-ChildItem -LiteralPath $bin -File | ForEach-Object { $_.Name } } else { Write-Host '(missing)' }
Write-Host "`n--- msvc2017/output ---"
if (Test-Path -LiteralPath $out) {
Get-ChildItem -LiteralPath $out -File -Filter '*.exe' -ErrorAction SilentlyContinue | ForEach-Object { $_.Name }
} else { Write-Host '(missing)' }
$need = @(
"idtech3_server$sfx.exe",
"idtech3$sfx.exe",
"idtech3-vulkan$sfx.exe"
)
$missing = @()
foreach ($n in $need) {
$p = Join-Path $bin $n
if (-not (Test-Path -LiteralPath $p)) { $missing += $n }
}
if ($missing.Count -gt 0) {
Write-Host "`nAttempting fallback copy from output\ ..."
New-Item -ItemType Directory -Force -Path $bin | Out-Null
$ded = Join-Path $out '${{ matrix.msvc_out_ded }}'
$cli = Join-Path $out '${{ matrix.msvc_out_cli }}'
if (Test-Path -LiteralPath $ded) {
Copy-Item -LiteralPath $ded -Destination (Join-Path $bin "idtech3_server$sfx.exe") -Force
}
if (Test-Path -LiteralPath $cli) {
Copy-Item -LiteralPath $cli -Destination (Join-Path $bin "idtech3$sfx.exe") -Force
Copy-Item -LiteralPath $cli -Destination (Join-Path $bin "idtech3-vulkan$sfx.exe") -Force
}
$missing = @()
foreach ($n in $need) {
if (-not (Test-Path -LiteralPath (Join-Path $bin $n))) { $missing += $n }
}
}
if ($missing.Count -gt 0) {
Write-Host "`nSearch idtech3*.exe under msvc2017:"
Get-ChildItem -Path (Join-Path $root 'src/platform/win32/msvc2017') -Recurse -File -Filter 'idtech3*.exe' -ErrorAction SilentlyContinue |
ForEach-Object { $_.FullName }
throw "Staging incomplete; missing in bin: $($missing -join ', ')"
}
Write-Host "`nStaging OK for artifact upload."
- name: Verify PE architecture (native compat)
if: ${{ matrix.btype == 'Release' }}
shell: pwsh
run: ./scripts/windows_native_compat_check.ps1 -BinDir bin
- name: Verify PE exports (static renderer — no plugin DLLs)
if: ${{ matrix.btype == 'Release' }}
shell: pwsh
run: ./scripts/windows_pe_exports_check.ps1 -BinDir bin -SkipRendererDlls
- uses: actions/upload-artifact@v4
if: ${{ matrix.btype == 'Release' }}
with:
name: windows-msvc-${{ matrix.pkg_suffix }}
path: bin
if-no-files-found: warn
retention-days: 5
ubuntu-x86_64:
name: ${{ matrix.btype }} Ubuntu x86_64 ${{ matrix.cc }}
runs-on: ubuntu-24.04
strategy:
fail-fast: false
matrix:
cc: [gcc, clang]
btype: [Release, Debug]
exclude:
# Clang Debug: covered by asan job
- cc: clang
btype: Debug
steps:
- name: Install tools
run: |
sudo rm -f /etc/apt/sources.list.d/azure-cli.list
sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list
sudo apt-get -qq update
sudo apt-get -y install cmake ninja-build g++ libstdc++-14-dev clang ccache
sudo apt-get -y install libcurl4-openssl-dev libssl-dev mesa-common-dev libxxf86dga-dev libxrandr-dev libxxf86vm-dev libasound-dev libsdl2-dev libopenal-dev libfreetype6-dev lua5.4 liblua5.4-dev glslang-tools python3
- uses: actions/checkout@v4
- name: Cache ccache
uses: actions/cache@v4
with:
path: ~/.ccache
key: ccache-ubuntu-x64-${{ matrix.cc }}-${{ matrix.btype }}-${{ github.sha }}
restore-keys: |
ccache-ubuntu-x64-${{ matrix.cc }}-${{ matrix.btype }}-
- name: Verify shader compilation
if: ${{ github.event_name != 'release' || matrix.btype != 'Debug' }}
run: ./scripts/compile_shaders.sh
- name: Build Vulkan
if: ${{ github.event_name != 'release' || matrix.btype != 'Debug' }}
env:
CFLAGS: "-DSKIP_IDPAK_CHECK=1"
CXXFLAGS: "-DSKIP_IDPAK_CHECK=1"
run: |
CMAKE_EXTRA=""
if [ "${{ matrix.cc }}" = "clang" ]; then
CMAKE_EXTRA="-DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++"
fi
mkdir -p build-vk-${{ matrix.btype }}
cmake -S . -B build-vk-${{ matrix.btype }} $CMAKE_EXTRA \
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
-DCMAKE_BUILD_TYPE=${{ matrix.btype }} \
-DCI_BUILD=${{ (matrix.cc == 'gcc' && matrix.btype == 'Release') && 'ON' || 'OFF' }} \
-DUSE_STB_TRUETYPE=ON \
-DBUILD_FREETYPE=ON \
-DENABLE_FORTIFY_SOURCE=ON \
-DENABLE_ASAN=OFF \
-DBUILD_SERVER=ON \
-DUSE_VULKAN=ON \
-DRENDERER_DEFAULT=vulkan \
-DSKIP_IDPAK_CHECK=ON \
-DSKIP_SHADER_REGEN=ON \
-Wno-dev
cmake --build build-vk-${{ matrix.btype }} -j$(nproc)
mkdir -p bin
cp -f build-vk-${{ matrix.btype }}/idtech3* bin/ || true
- name: Build OpenGL
if: ${{ github.event_name != 'release' || matrix.btype != 'Debug' }}
env:
CFLAGS: "-DSKIP_IDPAK_CHECK=1"
CXXFLAGS: "-DSKIP_IDPAK_CHECK=1"
run: |
CMAKE_EXTRA=""
if [ "${{ matrix.cc }}" = "clang" ]; then
CMAKE_EXTRA="-DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++"
fi
mkdir -p build-gl-${{ matrix.btype }}
cmake -S . -B build-gl-${{ matrix.btype }} $CMAKE_EXTRA \
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
-DCMAKE_BUILD_TYPE=${{ matrix.btype }} \
-DCI_BUILD=OFF \
-DUSE_STB_TRUETYPE=ON \
-DBUILD_FREETYPE=ON \
-DENABLE_FORTIFY_SOURCE=ON \
-DENABLE_ASAN=OFF \
-DBUILD_SERVER=ON \
-DUSE_VULKAN=ON \
-DRENDERER_DEFAULT=opengl \
-DSKIP_IDPAK_CHECK=ON \
-DSKIP_SHADER_REGEN=ON \
-Wno-dev
cmake --build build-gl-${{ matrix.btype }} -j$(nproc)
cp -f build-gl-${{ matrix.btype }}/idtech3* bin/ || true
- name: Smoke test
if: ${{ github.event_name != 'release' || matrix.btype != 'Debug' }}
run: |
mkdir -p release
cp -f bin/idtech3* release/ || true
chmod +x scripts/smoke_test.sh
./scripts/smoke_test.sh release
- name: CTest (make test)
if: ${{ github.event_name != 'release' || matrix.btype != 'Debug' }}
run: |
cd build-vk-${{ matrix.btype }} && ctest -C ${{ matrix.btype }} --output-on-failure -V
- uses: actions/upload-artifact@v4
if: matrix.cc == 'gcc' && matrix.btype == 'Release'
with:
name: linux-x86_64
path: bin
if-no-files-found: error
retention-days: 5
ubuntu-asan:
name: Ubuntu x86_64 ASAN (Debug)
runs-on: ubuntu-24.04
steps:
- name: Install tools
run: |
sudo apt-get -qq update
sudo apt-get -y install cmake ninja-build g++ libstdc++-14-dev libcurl4-openssl-dev libssl-dev mesa-common-dev libxxf86dga-dev libxrandr-dev libxxf86vm-dev libasound-dev libsdl2-dev libopenal-dev libfreetype6-dev lua5.4 liblua5.4-dev glslang-tools python3
- uses: actions/checkout@v4
- name: Build Vulkan (ASAN)
env:
CFLAGS: "-DSKIP_IDPAK_CHECK=1"
CXXFLAGS: "-DSKIP_IDPAK_CHECK=1"
run: |
mkdir -p build-vk-asan
cmake -S . -B build-vk-asan \
-DCMAKE_BUILD_TYPE=Debug \
-DCI_BUILD=OFF \
-DUSE_STB_TRUETYPE=ON \
-DBUILD_FREETYPE=ON \
-DENABLE_FORTIFY_SOURCE=OFF \
-DENABLE_ASAN=ON \
-DBUILD_SERVER=ON \
-DUSE_VULKAN=ON \
-DRENDERER_DEFAULT=vulkan \
-DSKIP_IDPAK_CHECK=ON \
-DSKIP_SHADER_REGEN=ON \
-Wno-dev
cmake --build build-vk-asan -j$(nproc)
- name: Smoke test (ASAN)
run: |
mkdir -p release
cp -f build-vk-asan/idtech3* release/ || true
chmod +x scripts/smoke_test.sh
./scripts/smoke_test.sh release
asan:
name: AddressSanitizer (Debug)
runs-on: ubuntu-24.04
steps:
- name: Install tools
run: |
sudo apt-get -qq update
sudo apt-get -y install cmake ninja-build g++ libstdc++-14-dev libcurl4-openssl-dev libssl-dev mesa-common-dev libxxf86dga-dev libxrandr-dev libxxf86vm-dev libasound-dev libsdl2-dev libopenal-dev libfreetype6-dev lua5.4 liblua5.4-dev glslang-tools python3
- uses: actions/checkout@v4
- name: Build with ASAN
env:
CFLAGS: "-DSKIP_IDPAK_CHECK=1"
CXXFLAGS: "-DSKIP_IDPAK_CHECK=1"
run: |
./scripts/compile_shaders.sh
mkdir -p build-asan
cmake -S . -B build-asan -G Ninja \
-DCMAKE_BUILD_TYPE=Debug \
-DCI_BUILD=OFF \
-DUSE_STB_TRUETYPE=ON \
-DBUILD_FREETYPE=ON \
-DENABLE_FORTIFY_SOURCE=OFF \
-DENABLE_ASAN=ON \
-DBUILD_SERVER=ON \
-DUSE_VULKAN=ON \
-DRENDERER_DEFAULT=vulkan \
-DSKIP_IDPAK_CHECK=ON \
-DSKIP_SHADER_REGEN=ON \
-Wno-dev
cmake --build build-asan -j$(nproc)
- name: Smoke test (ASAN)
run: |
mkdir -p release
cp -f build-asan/idtech3* release/ || true
chmod +x scripts/smoke_test.sh
./scripts/smoke_test.sh release
static-analysis:
name: Static analysis (clang-tidy, cppcheck)
runs-on: ubuntu-24.04
continue-on-error: true
steps:
- name: Install tools
run: |
sudo apt-get -qq update
sudo apt-get -y install cmake ninja-build g++ libstdc++-14-dev clang-tidy cppcheck ccache
sudo apt-get -y install libcurl4-openssl-dev libssl-dev mesa-common-dev libxxf86dga-dev libxrandr-dev libxxf86vm-dev libasound-dev libsdl2-dev libopenal-dev libfreetype6-dev lua5.4 liblua5.4-dev glslang-tools python3
- uses: actions/checkout@v4
- name: Cache ccache
uses: actions/cache@v4
with:
path: ~/.ccache
key: ccache-static-${{ github.sha }}
restore-keys: |
ccache-static-
- name: Build (compile_commands.json)
env:
CFLAGS: "-DSKIP_IDPAK_CHECK=1"
CXXFLAGS: "-DSKIP_IDPAK_CHECK=1"
run: |
mkdir -p build-static
cmake -S . -B build-static -G Ninja \
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
-DCI_BUILD=OFF \
-DUSE_STB_TRUETYPE=ON \
-DBUILD_FREETYPE=ON \
-DBUILD_SERVER=ON \
-DUSE_VULKAN=ON \
-DRENDERER_DEFAULT=vulkan \
-DSKIP_IDPAK_CHECK=ON \
-DSKIP_SHADER_REGEN=ON \
-Wno-dev
cmake --build build-static -j$(nproc)
- name: Run cppcheck
run: |
./scripts/run_cppcheck.sh 2>&1 | tee cppcheck.log | tail -80
- name: Run clang-tidy
env:
BUILD_DIR: ${{ github.workspace }}/build-static
run: |
./scripts/run_clang_tidy.sh 2>&1 | tee clang-tidy.log | tail -80
ubuntu-arm:
name: ${{ matrix.btype }} Ubuntu [ARM] ${{ matrix.arch }}
runs-on: ubuntu-24.04
strategy:
fail-fast: false
matrix:
arch: [aarch64, armv7]
cc: [gcc]
btype: [Release, Debug]
include:
- btype: Release
rule: install
- btype: Debug
rule: debug
steps:
- uses: actions/checkout@v4
- name: Build ${{ matrix.arch }}
if: ${{ github.event_name != 'release' || matrix.btype != 'Debug' }}
uses: uraimo/run-on-arch-action@v3
with:
arch: ${{ matrix.arch }}
distro: ubuntu24.04
githubToken: ${{ github.token }}
shell: /bin/sh
run: |
set -eux
export CFLAGS=""
export CXXFLAGS=""
export LDFLAGS=""
if [ "${{ matrix.arch }}" = "armv7" ]; then
export CFLAGS="-mfpu=neon -mfloat-abi=hard"
export CXXFLAGS="-mfpu=neon -mfloat-abi=hard"
export LDFLAGS="-mfpu=neon -mfloat-abi=hard"
fi
apt-get -qq update
apt-get install -y make gcc g++ cmake ninja-build libstdc++-14-dev
apt-get -y install libcurl4-openssl-dev libssl-dev mesa-common-dev libxxf86dga-dev libxrandr-dev libxxf86vm-dev libasound-dev libsdl2-dev libopenal-dev libfreetype6-dev lua5.4 liblua5.4-dev glslang-tools
OUTDIR="${GITHUB_WORKSPACE}/bin"
mkdir -p "$OUTDIR"
mkdir -p build-vk-${{ matrix.btype }}
cmake -S . -B build-vk-${{ matrix.btype }} \
-DCMAKE_BUILD_TYPE=${{ matrix.btype }} \
-DCI_BUILD=OFF \
-DUSE_STB_TRUETYPE=ON \
-DBUILD_FREETYPE=ON \
-DENABLE_FORTIFY_SOURCE=OFF \
-DENABLE_ASAN=OFF \
-DBUILD_SERVER=ON \
-DUSE_VULKAN=ON \
-DRENDERER_DEFAULT=vulkan \
-DSKIP_IDPAK_CHECK=ON \
-DSKIP_SHADER_REGEN=ON \
-Wno-dev
cmake --build build-vk-${{ matrix.btype }} -j"$(nproc)"
find "build-vk-${{ matrix.btype }}" -maxdepth 2 -type f -name 'idtech3*' -print -exec cp -f {} "$OUTDIR/" \;
mkdir -p build-gl-${{ matrix.btype }}
cmake -S . -B build-gl-${{ matrix.btype }} \
-DCMAKE_BUILD_TYPE=${{ matrix.btype }} \
-DCI_BUILD=OFF \
-DUSE_STB_TRUETYPE=ON \
-DBUILD_FREETYPE=ON \
-DENABLE_FORTIFY_SOURCE=OFF \
-DENABLE_ASAN=OFF \
-DBUILD_SERVER=ON \
-DUSE_VULKAN=ON \
-DRENDERER_DEFAULT=opengl \
-DSKIP_IDPAK_CHECK=ON \
-DSKIP_SHADER_REGEN=ON \
-Wno-dev
cmake --build build-gl-${{ matrix.btype }} -j"$(nproc)"
find "build-gl-${{ matrix.btype }}" -maxdepth 2 -type f -name 'idtech3*' -print -exec cp -f {} "$OUTDIR/" \;
test -n "$(ls -A "$OUTDIR")"
ls -al "$OUTDIR"
mkdir -p release
cp -f "$OUTDIR"/idtech3* release/ || true
chmod +x scripts/smoke_test.sh
./scripts/smoke_test.sh release
- uses: actions/upload-artifact@v4
if: matrix.cc == 'gcc' && matrix.btype == 'Release'
with:
name: linux-${{ matrix.arch }}
path: bin
if-no-files-found: warn
retention-days: 5
macos:
name: ${{ matrix.btype }} macOS ${{ matrix.arch }}
runs-on: macos-14
strategy:
fail-fast: false
matrix:
# Apple Silicon only
arch: [aarch64]
cc: [clang]
btype: [Release, Debug]
steps:
- name: Install tools
run: brew install coreutils sdl2 openal-soft cmake ninja freetype lua molten-vk
- uses: actions/checkout@v4
- name: Build Vulkan
if: ${{ github.event_name != 'release' || matrix.btype != 'Debug' }}
env:
CFLAGS: "-DSKIP_IDPAK_CHECK=1"
CXXFLAGS: "-DSKIP_IDPAK_CHECK=1"
LIBRARY_PATH: "/opt/homebrew/lib"
CMAKE_PREFIX_PATH: "/opt/homebrew"
run: |
SDL2_PREFIX=$(brew --prefix sdl2)
OPENAL_PREFIX=$(brew --prefix openal-soft)
mkdir -p build-vk-${{ matrix.btype }}
cmake -S . -B build-vk-${{ matrix.btype }} \
-DCMAKE_BUILD_TYPE=${{ matrix.btype }} \
-DCI_BUILD=OFF \
-DCMAKE_OSX_ARCHITECTURES=arm64 \
-DSDL2_PATH="${SDL2_PREFIX}" \
-DSDL2_INCLUDE_DIR="${SDL2_PREFIX}/include" \
-DSDL2_LIBRARY="${SDL2_PREFIX}/lib/libSDL2.dylib" \
-DOPENAL_INCLUDE_DIR="${OPENAL_PREFIX}/include" \
-DOPENAL_LIBRARY="${OPENAL_PREFIX}/lib/libopenal.dylib" \
-DUSE_STB_TRUETYPE=ON \
-DBUILD_FREETYPE=ON \
-DENABLE_FORTIFY_SOURCE=OFF \
-DENABLE_ASAN=OFF \
-DBUILD_SERVER=ON \
-DUSE_VULKAN=ON \
-DRENDERER_DEFAULT=vulkan \
-DSKIP_IDPAK_CHECK=ON \
-DSKIP_SHADER_REGEN=ON \
-DCMAKE_INCLUDE_PATH="${OPENAL_PREFIX}/include" \
-DCMAKE_LIBRARY_PATH="${OPENAL_PREFIX}/lib" \
-Wno-dev
cmake --build build-vk-${{ matrix.btype }} -j$(sysctl -n hw.logicalcpu)
mkdir -p bin
cp -f build-vk-${{ matrix.btype }}/idtech3* bin/ || true
# Bundle .app trees are directories; copy the actual Mach-O binaries for smoke_test / artifacts.
for app in build-vk-${{ matrix.btype }}/idtech3*.app; do
[ -d "$app" ] || continue
ex="$app/Contents/MacOS/$(basename "$app" .app)"
[ -f "$ex" ] && cp -f "$ex" bin/ || true
done
- name: Build OpenGL
if: ${{ github.event_name != 'release' || matrix.btype != 'Debug' }}
env:
CFLAGS: "-DSKIP_IDPAK_CHECK=1"
CXXFLAGS: "-DSKIP_IDPAK_CHECK=1"
LIBRARY_PATH: "/opt/homebrew/lib"
CMAKE_PREFIX_PATH: "/opt/homebrew"
run: |
SDL2_PREFIX=$(brew --prefix sdl2)
OPENAL_PREFIX=$(brew --prefix openal-soft)
mkdir -p build-gl-${{ matrix.btype }}
cmake -S . -B build-gl-${{ matrix.btype }} \
-DCMAKE_BUILD_TYPE=${{ matrix.btype }} \
-DCI_BUILD=OFF \
-DCMAKE_OSX_ARCHITECTURES=arm64 \
-DSDL2_PATH="${SDL2_PREFIX}" \
-DSDL2_INCLUDE_DIR="${SDL2_PREFIX}/include" \
-DSDL2_LIBRARY="${SDL2_PREFIX}/lib/libSDL2.dylib" \
-DOPENAL_INCLUDE_DIR="${OPENAL_PREFIX}/include" \
-DOPENAL_LIBRARY="${OPENAL_PREFIX}/lib/libopenal.dylib" \
-DUSE_STB_TRUETYPE=ON \
-DBUILD_FREETYPE=ON \
-DENABLE_FORTIFY_SOURCE=OFF \
-DENABLE_ASAN=OFF \
-DBUILD_SERVER=ON \
-DUSE_VULKAN=ON \
-DRENDERER_DEFAULT=opengl \
-DSKIP_IDPAK_CHECK=ON \
-DSKIP_SHADER_REGEN=ON \
-DCMAKE_INCLUDE_PATH="${OPENAL_PREFIX}/include" \
-DCMAKE_LIBRARY_PATH="${OPENAL_PREFIX}/lib" \
-Wno-dev
cmake --build build-gl-${{ matrix.btype }} -j$(sysctl -n hw.logicalcpu)
cp -f build-gl-${{ matrix.btype }}/idtech3* bin/ || true
for app in build-gl-${{ matrix.btype }}/idtech3*.app; do
[ -d "$app" ] || continue
ex="$app/Contents/MacOS/$(basename "$app" .app)"
[ -f "$ex" ] && cp -f "$ex" bin/ || true
done
- name: Smoke test
if: ${{ github.event_name != 'release' && matrix.btype != 'Debug' }}
run: |
mkdir -p release
cp -f bin/idtech3* release/ || true
chmod +x scripts/smoke_test.sh
./scripts/smoke_test.sh release
- uses: actions/upload-artifact@v4
if: matrix.cc == 'clang' && matrix.btype == 'Release'
with:
name: macos-${{ matrix.arch }}
path: bin
if-no-files-found: warn
retention-days: 5
android:
name: ${{ matrix.btype }} Android ${{ matrix.abi }}
runs-on: ubuntu-24.04
strategy:
fail-fast: false
matrix:
abi: [arm64-v8a, armeabi-v7a]
btype: [Release, Debug]
steps:
- uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17
- name: Set up Android SDK
uses: android-actions/setup-android@v3
- name: Install NDK
run: |
sdkmanager --install "ndk;27.0.12077973" "cmake;3.22.1"
- name: Build ${{ matrix.btype }} (${{ matrix.abi }})
if: ${{ github.event_name != 'release' || matrix.btype != 'Debug' }}
working-directory: android
run: |
# Use direct CMake cross-compile instead of Gradle to avoid
# wrapper/SDK bootstrapping complexity in CI.
NDK_HOME="${ANDROID_NDK_HOME:-$ANDROID_SDK_ROOT/ndk/27.0.12077973}"
TOOLCHAIN="$NDK_HOME/build/cmake/android.toolchain.cmake"
if [ "${{ matrix.abi }}" = "arm64-v8a" ]; then
ANDROID_ABI="arm64-v8a"
else
ANDROID_ABI="armeabi-v7a"
fi
mkdir -p build-android-${{ matrix.btype }}-${{ matrix.abi }}
cmake -S .. -B build-android-${{ matrix.btype }}-${{ matrix.abi }} \
-DCMAKE_TOOLCHAIN_FILE="$TOOLCHAIN" \
-DANDROID_ABI="$ANDROID_ABI" \
-DANDROID_PLATFORM=android-26 \
-DANDROID_STL=c++_shared \
-DCMAKE_BUILD_TYPE=${{ matrix.btype }} \
-DBUILD_SERVER=OFF \
-DUSE_VULKAN=ON \
-DUSE_RENDERER_DLOPEN=OFF \
-DRENDERER_DEFAULT=vulkan \
-DSKIP_IDPAK_CHECK=ON \
-DSKIP_SHADER_REGEN=ON \
-DUSE_SDL=OFF \
-DUSE_OPENAL=OFF \
-DUSE_CURL=OFF \
-DUSE_LUA=OFF \
-DUSE_DUKTAPE=OFF \
-DUSE_RECAST_NAV=OFF \
-DUSE_BULLET_PHYSICS=OFF \
-DBUILD_FREETYPE=OFF \
-DUSE_STB_TRUETYPE=ON \
-DENABLE_FORTIFY_SOURCE=OFF \
-DENABLE_ASAN=OFF \
-DCI_BUILD=OFF \
-Wno-dev
cmake --build build-android-${{ matrix.btype }}-${{ matrix.abi }} -j$(nproc)
mkdir -p ../bin
find build-android-${{ matrix.btype }}-${{ matrix.abi }} -maxdepth 2 \
\( -name 'libidtech3*' -o -name 'idtech3*' \) -type f \
-exec cp -f {} ../bin/ \;
ls -la ../bin/
- uses: actions/upload-artifact@v4
if: matrix.btype == 'Release'
with:
name: android-${{ matrix.abi }}
path: bin
if-no-files-found: warn
retention-days: 5
release-attach:
name: Attach artifacts to release
if: always() && !cancelled() && github.event_name == 'release' && github.event.action == 'published'
needs: [windows-msys, windows-msvc, ubuntu-x86_64, ubuntu-arm, macos, android]
runs-on: ubuntu-24.04
permissions:
contents: write
steps:
- uses: actions/download-artifact@v4
with:
path: artifacts
- name: Create release archives
id: archive
run: |
mkdir -p dist
tag="${{ github.event.release.tag_name }}"
for dir in artifacts/*/; do
[ -d "$dir" ] || continue
name=$(basename "$dir")
zip -r "dist/idtech3-${tag}-${name}.zip" "$dir"
done
ls -la dist/
echo "count=$(ls dist/*.zip 2>/dev/null | wc -l | tr -d ' ')" >> $GITHUB_OUTPUT
- name: Attach binaries to release
if: steps.archive.outputs.count != '0'
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ github.event.release.tag_name }}
files: dist/*.zip
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}