Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
02457e1
build: Add build infrastructure and cmake modules
cerwym Mar 22, 2026
2b189e7
build(msvc): Add MSVC/vcpkg native Windows build support
cerwym Mar 23, 2026
2cd352f
fix(msvc): Source compatibility fixes for MSVC compiler
cerwym Mar 23, 2026
bf78357
feat(build): Add AddressSanitizer support for MSVC and GCC/Clang
cerwym Mar 23, 2026
e136237
ci: Add MSVC/CMake build validation workflow
cerwym Mar 23, 2026
d62050a
fix: ensure C-linkage for autostart_multiplayer globals
cerwym Mar 23, 2026
58fa8e0
fix: added compile guards for msvc/gcc mkdir macro
cerwym Mar 23, 2026
0c30890
ci: cache vcpkg binaries to GitHub Packages NuGet feed
cerwym Mar 24, 2026
b751b5a
fix: restore effects.toml gap-filling logic from PR #4626
cerwym Mar 24, 2026
7a02c33
ci: unify CI build workflow with MinGW, Linux, and MSVC jobs
cerwym Mar 24, 2026
3cdf3b7
fix: use _WIN32 platform guard for mkdir instead of compiler guard
cerwym Mar 24, 2026
fce68b4
Merge remote-tracking branch 'upstream/master' into upstream/msvc-vcp…
PieterVdc Apr 21, 2026
e32ce08
add get_struct_base to field
PieterVdc Apr 21, 2026
64ba3e4
Merge remote-tracking branch 'upstream/master' into upstream/msvc-vcp…
PieterVdc Apr 25, 2026
4a99e9c
cmake curl
PieterVdc Apr 26, 2026
e982fb1
Merge remote-tracking branch 'upstream/master' into upstream/msvc-vcp…
PieterVdc Apr 28, 2026
ac9de9f
Merge remote-tracking branch 'upstream/master' into upstream/msvc-vcp…
PieterVdc Apr 28, 2026
ed69b9a
fix matchmaking_connect_thread on msvc
PieterVdc Apr 28, 2026
9f9c12b
Merge remote-tracking branch 'upstream/master' into upstream/msvc-vcp…
PieterVdc May 6, 2026
202a5ac
scrap gfx and sfx submodule
PieterVdc May 6, 2026
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
122 changes: 122 additions & 0 deletions .github/workflows/build-msvc-cmake.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
name: CI Build

on:
push:
branches: [master, develop]
pull_request:
branches: [master, develop]

jobs:
build-mingw-x86:
name: "MinGW Windows x86"
runs-on: ubuntu-24.04

steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0

- uses: dkfans/setup-cpp@master

- name: Update system
run: |
set -eux
sudo apt update
sudo apt install -y build-essential g++-mingw-w64-i686 libpng16-16t64

- name: Build
run: |
set -eux
BUILD_NUMBER=$(git rev-list --count HEAD)
make BUILD_NUMBER=$BUILD_NUMBER standard

build-linux-x86_64:
name: "Linux x86_64"
runs-on: ubuntu-24.04

steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Update system
run: |
set -eux
sudo apt update
sudo apt install -y \
build-essential \
pkg-config \
curl \
libavcodec-dev \
libavformat-dev \
libavutil-dev \
libopenal-dev \
libluajit-5.1-dev \
libminizip-dev \
libnatpmp-dev \
libspng-dev \
libsdl2-dev \
libsdl2-image-dev \
libsdl2-mixer-dev \
libsdl2-net-dev \
libswresample-dev \
libminiupnpc-dev \
zlib1g-dev

- name: Build
run: |
set -eux
BUILD_NUMBER=$(git rev-list --count HEAD)
make BUILD_NUMBER=$BUILD_NUMBER -f linux.mk

build-msvc-x86:
name: "MSVC x86 Release"
runs-on: windows-latest

permissions:
contents: read
packages: write

env:
VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite"

steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Export GitHub Actions cache environment
uses: actions/github-script@v7
with:
script: |
core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || '');
core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || '');

- name: Setup vcpkg binary caching via GitHub Packages
shell: pwsh
env:
GH_PACKAGES_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
$owner = "${{ github.repository_owner }}"
$source = "https://nuget.pkg.github.com/${owner}/index.json"
nuget sources add -Name "GitHub" -Source $source -Username $owner -Password $env:GH_PACKAGES_TOKEN -StorePasswordInClearText
nuget setapikey $env:GH_PACKAGES_TOKEN -Source "GitHub"
$mode = if ("${{ github.event_name }}" -eq "push") { "readwrite" } else { "read" }
echo "VCPKG_BINARY_SOURCES=clear;x-gha,readwrite;nuget,GitHub,${mode}" >> $env:GITHUB_ENV

- name: Init vcpkg submodule
run: git submodule update --init external/vcpkg

- name: Bootstrap vcpkg
shell: cmd
run: .\external\vcpkg\bootstrap-vcpkg.bat -disableMetrics

- uses: ilammy/msvc-dev-cmd@v1
with:
arch: x86

- name: Configure
run: cmake --preset x86-windows-static-release

- name: Build
run: cmake --build --preset x86-windows-static-release
22 changes: 19 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,8 @@
/config/fxdata/*.dat
/config/fxdata/*.fon
.vs/
build*/
/out/*
*.cache
.vscode
/libexterns
docs/html
docs/latex
Expand All @@ -32,15 +30,33 @@ res/keeperfx_icon.ico
/deps/zlib
/deps/spng
/deps/astronomy
/deps/centijson
/deps/ffmpeg
/deps/openal
/deps/luajit
/deps/miniupnpc
/deps/libnatpmp
/deps/*.tar.gz
/cppcheck.cache

# vcpkg installed packages — build output, never committed.
# Placed one level up (../vcpkg_installed) so all worktrees share one copy.
vcpkg_installed/

/src/ver_defs.h
keeperfx.log
crash_log.txt
.local/
.deploy/

# Python cache
__pycache__/
*.pyc
*.pyo
*.pyd
.Python

# Generated documentation/audit reports
*_AUDIT_REPORT.md
*_DEPENDENCIES_*.md
*_SECURITY_AUDIT.md
.vscode/.sonar-token
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[submodule "external/vcpkg"]
path = external/vcpkg
url = https://github.com/microsoft/vcpkg
108 changes: 32 additions & 76 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,91 +10,47 @@ project(keeperfx C CXX)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 20)

# Get the abbreviated commit Id of the head.
find_package(Git REQUIRED)
execute_process(COMMAND "${GIT_EXECUTABLE}" describe --always OUTPUT_VARIABLE COMMIT_ID OUTPUT_STRIP_TRAILING_WHITESPACE)

# Version information
set(VER_MAJOR 1)
set(VER_MINOR 2)
set(VER_RELEASE 0)
set(VER_MINOR 3)
set(VER_RELEASE 1)
set(VER_BUILD 0)
set(VER_STRING "${VER_MAJOR}.${VER_MINOR}.${VER_RELEASE}.${VER_BUILD} ${PACKAGE_SUFFIX}")
set(PACKAGE_SUFFIX "")
set(GIT_REVISION "${COMMIT_ID}")

# CMAKE_BINARY_DIR is defined in CMakePresets.json.
set(KEEPERFX_VER_DEFS_H_IN ${CMAKE_SOURCE_DIR}/ver_defs.h.in)
set(KEEPERFX_VER_DEFS_H_OUT ${CMAKE_SOURCE_DIR}/ver_defs.h)
# Extract git revision
find_package(Git QUIET)
if(GIT_FOUND)
execute_process(
COMMAND ${GIT_EXECUTABLE} describe --always
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE GIT_REVISION
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)
else()
set(GIT_REVISION "unknown")
endif()

# Generate version header
set(KEEPERFX_VER_DEFS_H_IN ${CMAKE_SOURCE_DIR}/build/ver_defs.h.in)
set(KEEPERFX_VER_DEFS_H_OUT ${CMAKE_SOURCE_DIR}/src/ver_defs.h)
configure_file(${KEEPERFX_VER_DEFS_H_IN} ${KEEPERFX_VER_DEFS_H_OUT})

find_package(SDL2 CONFIG REQUIRED)
find_package(SDL2_image CONFIG REQUIRED)
find_package(SDL2_mixer CONFIG REQUIRED)
find_package(SDL2_net CONFIG REQUIRED)

# Global definitions.
add_compile_definitions(_CRT_NONSTDC_NO_WARNINGS _CRT_SECURE_NO_WARNINGS)

file(GLOB_RECURSE KEEPERFX_SOURCES_C "src/*.c")
file(GLOB_RECURSE KEEPERFX_SOURCES_CXX "src/*.cpp")

# Global definitions for all targets.
add_compile_definitions("DEBUG=$<IF:$<CONFIG:Debug>,1,0>")
add_compile_definitions("SPNG_STATIC=1")

# Add two executable targets: keeperfx and keeperfx_hvlog.
add_executable(keeperfx ${KEEPERFX_SOURCES_C} ${KEEPERFX_SOURCES_CXX})

target_compile_definitions(keeperfx PUBLIC BFDEBUG_LEVEL=0)
target_sources(keeperfx PRIVATE "res/keeperfx_stdres.rc")
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# Load CMake Modules
# See: build/cmake/modules/
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/build/cmake/modules)

add_executable(keeperfx_hvlog ${KEEPERFX_SOURCES_C} ${KEEPERFX_SOURCES_CXX})
include(Helpers)
include(Platforms)
include(Dependencies)
include(BuildTargets)

target_compile_definitions(keeperfx_hvlog PUBLIC BFDEBUG_LEVEL=10)
target_sources(keeperfx_hvlog PRIVATE "res/keeperfx_stdres.rc")

message(STATUS "We are using ${CMAKE_CXX_COMPILER_ID}")

# The default bfd linker in MinGW is extremely slow. LLVM linker (LLD) is much much faster.
set_property(TARGET keeperfx PROPERTY LINKER_TYPE LLD)
set_property(TARGET keeperfx_hvlog PROPERTY LINKER_TYPE LLD)

set(WARNFLAGS -Wall -W -Wshadow -Wno-sign-compare -Wno-unused-parameter -Wno-strict-aliasing -Wno-unknown-pragmas -Werror)
set(GNU_COMPILER_FLAG -march=x86-64 -fno-omit-frame-pointer -fmessage-length=0)
set(GNU_LINK_FLAG -mwindows -Wl,--enable-auto-import)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wimplicit")
target_compile_options(keeperfx PRIVATE ${WARNFLAGS} ${GNU_COMPILER_FLAG})
target_compile_options(keeperfx_hvlog PRIVATE ${WARNFLAGS} ${GNU_COMPILER_FLAG})
target_link_options(keeperfx PRIVATE ${GNU_LINK_FLAG} -Wl,-Map,keeperfx.map)
target_link_options(keeperfx_hvlog PRIVATE ${GNU_LINK_FLAG} -Wl,-Map,keeperfx_hvlog.map)
target_link_libraries (keeperfx PUBLIC -static stdc++ winpthread -dynamic)
target_link_libraries (keeperfx_hvlog PUBLIC -static stdc++ winpthread -dynamic)

# System libraries.
target_link_libraries(keeperfx PRIVATE imagehlp dbghelp)
target_link_libraries(keeperfx_hvlog PRIVATE imagehlp dbghelp)

# Go into submodules.
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# Subdirectories
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
add_subdirectory(deps)
add_subdirectory(tools)

# External libraries.
target_link_libraries(keeperfx
PRIVATE
$<IF:$<TARGET_EXISTS:SDL2::SDL2>,SDL2::SDL2,SDL2::SDL2-static>)
target_link_libraries(keeperfx
PRIVATE $<IF:$<TARGET_EXISTS:SDL2_mixer::SDL2_mixer>,SDL2_mixer::SDL2_mixer,SDL2_mixer::SDL2_mixer-static>)
target_link_libraries(keeperfx
PRIVATE $<IF:$<TARGET_EXISTS:SDL2_net::SDL2_net>,SDL2_net::SDL2_net,SDL2_net::SDL2_net-static>)
target_link_libraries(keeperfx
PRIVATE $<IF:$<TARGET_EXISTS:SDL2_image::SDL2_image>,SDL2_image::SDL2_image,SDL2_image::SDL2_image-static>)

target_link_libraries(keeperfx_hvlog
PRIVATE
$<IF:$<TARGET_EXISTS:SDL2::SDL2>,SDL2::SDL2,SDL2::SDL2-static>)
target_link_libraries(keeperfx_hvlog
PRIVATE $<IF:$<TARGET_EXISTS:SDL2_mixer::SDL2_mixer>,SDL2_mixer::SDL2_mixer,SDL2_mixer::SDL2_mixer-static>)
target_link_libraries(keeperfx_hvlog
PRIVATE $<IF:$<TARGET_EXISTS:SDL2_net::SDL2_net>,SDL2_net::SDL2_net,SDL2_net::SDL2_net-static>)
target_link_libraries(keeperfx_hvlog
PRIVATE $<IF:$<TARGET_EXISTS:SDL2_image::SDL2_image>,SDL2_image::SDL2_image,SDL2_image::SDL2_image-static>)
Loading
Loading