Updated Steam DLL build procedure

This commit is contained in:
Eddoursul 2026-07-30 12:11:22 +02:00
parent 7d152b6158
commit 9c7b31dd60
8 changed files with 131 additions and 147 deletions

View File

@ -533,6 +533,9 @@ FodyWeavers.xsd
build/
# Machine-specific, generated by build.cmd - see cmake/write_user_presets.cmake
CMakeUserPresets.json
contrib/Distribution/**/*.dll
contrib/Distribution/**/*.pdb
contrib/Distribution/**/*.pex

View File

@ -1,31 +1,48 @@
option(ENABLE_VCPKG OFF)
cmake_minimum_required(VERSION 3.21)
message("Using toolchain file ${CMAKE_TOOLCHAIN_FILE}.")
########################################################################################################################
## Define project
########################################################################################################################
project(
EnderalSteam
VERSION 2.1.4
DESCRIPTION "Enderal SE Steam Support"
LANGUAGES CXX)
EnderalSteam
VERSION 2.1.4
DESCRIPTION "Enderal SE Steam Support"
LANGUAGES CXX
)
# Shown as ProductName in the version resource.
set(PROJECT_FRIENDLY_NAME "Enderal SE")
# The binary FILEVERSION/PRODUCTVERSION fields need all four components;
# PROJECT_VERSION_TWEAK is empty when the version above carries only three.
if(NOT PROJECT_VERSION_TWEAK)
set(PROJECT_VERSION_TWEAK 0)
endif()
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION ON)
# Link-time optimization for release builds only (debug builds stay fast).
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION_RELEASE ON)
# CommonLibSSE-NG requires the dynamic CRT. Dependencies used to be supplied by
# vcpkg (which set this via a preset); now that they come from FetchContent we
# set it here so both build.cmd and Visual Studio "Open Folder" pick it up.
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL")
add_compile_definitions(NOMINMAX _USE_MATH_DEFINES WIN32_LEAN_AND_MEAN)
add_definitions(-DUNICODE -D_UNICODE)
add_compile_options(/Zc:preprocessor /EHsc)
include(GNUInstallDirs)
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/cmake/version.rc.in
${CMAKE_CURRENT_BINARY_DIR}/version.rc
@ONLY
)
#include(GNUInstallDirs)
file(
GLOB_RECURSE
sources
@ -41,81 +58,82 @@ source_group(
)
########################################################################################################################
## Configure target DLL
## Fetch dependencies (pinned versions, no vcpkg required)
########################################################################################################################
include(FetchContent)
# DirectXMath
# DirectXMath - required by DirectXTK.
FetchContent_Declare(
DirectXMath
URL "https://github.com/microsoft/DirectXMath/archive/refs/tags/apr2025.tar.gz"
OVERRIDE_FIND_PACKAGE
DOWNLOAD_EXTRACT_TIMESTAMP 1
DOWNLOAD_EXTRACT_TIMESTAMP ON
EXCLUDE_FROM_ALL
SYSTEM
)
FetchContent_MakeAvailable(DirectXMath)
add_library("Microsoft::DirectXMath" ALIAS "DirectXMath")
# DirectXTK
# DirectXTK - required by CommonLibSSE-NG (find_package(directxtk CONFIG REQUIRED)).
# PATCH_COMMAND fixes its shader-compile step under modern CMake (see the script).
FetchContent_Declare(
DirectXTK
URL "https://github.com/microsoft/DirectXTK/archive/refs/tags/jul2025.tar.gz"
DOWNLOAD_EXTRACT_TIMESTAMP 1
DOWNLOAD_EXTRACT_TIMESTAMP ON
OVERRIDE_FIND_PACKAGE
EXCLUDE_FROM_ALL
SYSTEM
PATCH_COMMAND ${CMAKE_COMMAND} -P "${CMAKE_CURRENT_SOURCE_DIR}/cmake/patch_directxtk.cmake"
)
FetchContent_MakeAvailable(DirectXTK)
add_library("Microsoft::DirectXTK" ALIAS "DirectXTK")
# simpleini
# simpleini - used directly (Util.h).
FetchContent_Declare(
simpleini
URL "https://github.com/brofield/simpleini/archive/refs/tags/v4.22.tar.gz"
DOWNLOAD_EXTRACT_TIMESTAMP 1
DOWNLOAD_EXTRACT_TIMESTAMP ON
)
FetchContent_MakeAvailable(simpleini)
INCLUDE_DIRECTORIES(${simpleini_SOURCE_DIR})
# rapidcsv
# rapidcsv - header only, required by CommonLibSSE-NG (find_path "rapidcsv.h").
FetchContent_Declare(
rapidcsv
URL "https://github.com/d99kris/rapidcsv/archive/refs/tags/v8.87.tar.gz"
DOWNLOAD_EXTRACT_TIMESTAMP 1
DOWNLOAD_EXTRACT_TIMESTAMP ON
OVERRIDE_FIND_PACKAGE
)
FetchContent_MakeAvailable(rapidcsv)
set(RAPIDCSV_INCLUDE_DIRS ${rapidcsv_SOURCE_DIR}/src)
# spdlog
set(SPDLOG_INSTALL ON CACHE INTERNAL "Install SPDLOG for CommonLibSSE")
set(SPDLOG_USE_STD_FORMAT ON CACHE INTERNAL "Use std::format in SPDLOG, not fmt")
# spdlog - used directly (PCH.h) and by CommonLibSSE-NG.
set(SPDLOG_INSTALL ON CACHE BOOL " " FORCE)
set(SPDLOG_USE_STD_FORMAT ON CACHE BOOL " " FORCE)
FetchContent_Declare(
spdlog
URL "https://github.com/gabime/spdlog/archive/refs/tags/v1.15.3.tar.gz"
DOWNLOAD_EXTRACT_TIMESTAMP 1
DOWNLOAD_EXTRACT_TIMESTAMP ON
OVERRIDE_FIND_PACKAGE
)
FetchContent_MakeAvailable(spdlog)
# xbyak
# xbyak - required by CommonLibSSE-NG when SKSE_SUPPORT_XBYAK is on.
FetchContent_Declare(
xbyak
URL "https://github.com/herumi/xbyak/archive/v7.28.tar.gz"
DOWNLOAD_EXTRACT_TIMESTAMP 1
DOWNLOAD_EXTRACT_TIMESTAMP ON
)
FetchContent_MakeAvailable(xbyak)
# CommonLibSSE
# CommonLibSSE-NG - pinned commit (SE + AE + VR runtime support).
set(SKSE_SUPPORT_XBYAK ON CACHE BOOL " " FORCE)
set(ENABLE_SKYRIM_SE ON CACHE BOOL " " FORCE)
set(ENABLE_SKYRIM_AE ON CACHE BOOL " " FORCE)
set(ENABLE_SKYRIM_VR ON CACHE BOOL " " FORCE)
set(BUILD_TESTS OFF CACHE BOOL " " FORCE)
message(STATUS "Fetching CommonLibSSE-NG (5e5417e3585c9434295e919bdda27737244e9c5a)...")
message(STATUS "Fetching CommonLibSSE-NG...")
FetchContent_Declare(
CommonLibSSE
GIT_REPOSITORY https://github.com/eddoursul/CommonLibVR.git
@ -123,15 +141,19 @@ FetchContent_Declare(
)
FetchContent_MakeAvailable(CommonLibSSE)
get_target_property(COMMONLIB_SRC_DIR CommonLibSSE SOURCE_DIR)
include(${COMMONLIB_SRC_DIR}/cmake/CommonLibSSE.cmake)
########################################################################################################################
## Configure target DLL
########################################################################################################################
add_commonlibsse_plugin(${PROJECT_NAME} SOURCES ${headers} ${sources})
add_library("${PROJECT_NAME}::${PROJECT_NAME}" ALIAS "${PROJECT_NAME}")
# Steamworks SDK import library, shipped in src/ next to the steam/ headers.
target_link_libraries(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/steam_api64.lib)
target_link_libraries(CommonLibSSE PUBLIC
@ -164,7 +186,6 @@ target_precompile_headers(${PROJECT_NAME}
install(TARGETS ${PROJECT_NAME} DESTINATION "${CMAKE_INSTALL_LIBDIR}")
########################################################################################################################
## Automatic plugin deployment
########################################################################################################################

View File

@ -13,17 +13,6 @@
"CMAKE_CXX_FLAGS": "$env{COMMONLIBSSE_COMPILER} $env{COMMONLIBSSE_PLATFORM} $env{COMMONLIBSSE_TEXT}"
}
},
{
"name": "vcpkg",
"hidden": true,
"cacheVariables": {
"CMAKE_TOOLCHAIN_FILE": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake",
"VCPKG_TARGET_TRIPLET": "x64-windows-skse",
"VCPKG_HOST_TRIPLET": "x64-windows-skse",
"VCPKG_OVERLAY_TRIPLETS": "${sourceDir}/cmake",
"CMAKE_MSVC_RUNTIME_LIBRARY": "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL"
}
},
{
"name": "win32",
"hidden": true,
@ -79,100 +68,68 @@
}
}
},
{
"name": "build-tests",
"displayName": "Build Tests",
"hidden": true,
"description": "Include test suites in the build.",
"cacheVariables": {
"BUILD_TESTS": {
"type": "STRING",
"value": "ON"
}
}
},
{
"name": "build-release-msvc",
"inherits": [
"base",
"vcpkg",
"win32-unicode",
"x64",
"build-tests",
"msvc"
],
"displayName": "Release",
"displayName": "Release (MSVC)",
"description": "Optimized release build.",
"generator": "Ninja",
"binaryDir": "${sourceDir}/build/release-msvc",
"cacheVariables": {
"CMAKE_BUILD_TYPE": {
"type": "STRING",
"value": "Release"
}
"CMAKE_BUILD_TYPE": "Release"
}
},
{
"name": "build-debug-msvc",
"inherits": [
"base",
"vcpkg",
"win32-unicode",
"x64",
"build-tests",
"msvc"
],
"displayName": "Debug",
"displayName": "Debug (MSVC)",
"description": "Debug build for testing.",
"generator": "Ninja",
"binaryDir": "${sourceDir}/build/debug-msvc",
"cacheVariables": {
"CMAKE_BUILD_TYPE": {
"type": "STRING",
"value": "Debug"
}
}
},
{
"name": "build-debug-clang-cl",
"inherits": [
"base",
"vcpkg",
"win32-unicode",
"x64",
"build-tests",
"clang-cl"
],
"displayName": "Debug",
"description": "Debug build for testing.",
"generator": "Ninja",
"binaryDir": "${sourceDir}/build/debug-clang",
"cacheVariables": {
"CMAKE_BUILD_TYPE": {
"type": "STRING",
"value": "Debug"
}
"CMAKE_BUILD_TYPE": "Debug"
}
},
{
"name": "build-release-clang-cl",
"inherits": [
"base",
"vcpkg",
"win32-unicode",
"x64",
"build-tests",
"clang-cl"
],
"displayName": "Release",
"displayName": "Release (Clang)",
"description": "Optimized release build.",
"generator": "Ninja",
"binaryDir": "${sourceDir}/build/release-clang",
"cacheVariables": {
"CMAKE_BUILD_TYPE": {
"type": "STRING",
"value": "Release"
}
"CMAKE_BUILD_TYPE": "Release"
}
},
{
"name": "build-debug-clang-cl",
"inherits": [
"base",
"win32-unicode",
"x64",
"clang-cl"
],
"displayName": "Debug (Clang)",
"description": "Debug build for testing.",
"generator": "Ninja",
"binaryDir": "${sourceDir}/build/debug-clang",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug"
}
}
],
@ -201,52 +158,5 @@
"configurePreset": "build-debug-clang-cl",
"description": "Debug build for testing."
}
],
"testPresets": [
{
"name": "tests-all",
"displayName": "All Tests",
"configurePreset": "build-debug-msvc",
"output": {
"outputOnFailure": true
},
"execution": {
"noTestsAction": "error",
"stopOnFailure": false
}
},
{
"name": "tests-unit",
"displayName": "Unit Tests",
"description": "Runs tests that do not require any Skyrim module loaded into the process.",
"inherits": "tests-all",
"filter": {
"exclude": {
"label": "[integration],[e2e]"
}
}
},
{
"name": "tests-integration",
"displayName": "Integration Tests",
"description": "Runs tests that interact with a Skyrim module at rest (do not require the Skyrim module to have run any main function).",
"inherits": "tests-all",
"filter": {
"include": {
"label": "[integration]"
}
}
},
{
"name": "tests-e2e",
"displayName": "End-to-End Tests",
"description": "Runs test that depend on a fully running Skyrim engine in the process.",
"inherits": "tests-all",
"filter": {
"include": {
"label": "[e2e]"
}
}
}
]
}

View File

@ -0,0 +1,47 @@
@echo off
rem ---------------------------------------------------------------------------
rem Command-line build wrapper.
rem
rem Sets up the MSVC x64 environment (the piece Visual Studio configures for you
rem automatically) and then drives the exact same CMake presets that Visual
rem Studio uses, so both build paths stay in sync.
rem
rem Usage: build.cmd [preset]
rem preset defaults to "release-msvc". Other options: debug-msvc,
rem release-clang-cl, debug-clang-cl (must match a name in CMakePresets.json).
rem ---------------------------------------------------------------------------
setlocal
set "PRESET=%~1"
if "%PRESET%"=="" set "PRESET=release-msvc"
set "CONFIGURE_PRESET=build-%PRESET%"
cd /d "%~dp0"
rem --- Locate Visual Studio (or the C++ Build Tools) ---
set "VSWHERE=%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe"
if not exist "%VSWHERE%" (
echo [ERROR] vswhere.exe not found. Install Visual Studio 2022 or the C++ Build Tools.
exit /b 1
)
set "VSINSTALL="
for /f "usebackq delims=" %%i in (`"%VSWHERE%" -latest -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath`) do set "VSINSTALL=%%i"
if not defined VSINSTALL (
echo [ERROR] No Visual Studio installation with the C++ toolset was found.
exit /b 1
)
rem --- Import the MSVC x64 developer environment ---
call "%VSINSTALL%\VC\Auxiliary\Build\vcvars64.bat" || exit /b 1
rem --- Point Visual Studio at this same CMake, so the two drivers can share the
rem build tree incrementally (see cmake\write_user_presets.cmake) ---
cmake -P cmake\write_user_presets.cmake || exit /b 1
rem --- Configure and build using the shared presets ---
cmake --preset %CONFIGURE_PRESET% || exit /b 1
cmake --build --preset %PRESET% || exit /b 1
echo.
echo [OK] Built preset "%PRESET%". Plugin deployed to SKSE\Plugins\.

BIN
source/Steam DLL/cmake/patch_directxtk.cmake (Stored with Git LFS) Normal file

Binary file not shown.

BIN
source/Steam DLL/cmake/version.rc.in (Stored with Git LFS)

Binary file not shown.

BIN
source/Steam DLL/cmake/write_user_presets.cmake (Stored with Git LFS) Normal file

Binary file not shown.

Binary file not shown.