From 9c7b31dd60ae331af40777d53672a39a9d2fcdde Mon Sep 17 00:00:00 2001 From: Eddoursul Date: Thu, 30 Jul 2026 12:11:22 +0200 Subject: [PATCH] Updated Steam DLL build procedure --- source/Steam DLL/.gitignore | 3 + source/Steam DLL/CMakeLists.txt | 81 +++++++---- source/Steam DLL/CMakePresets.json | 134 +++--------------- source/Steam DLL/build.cmd | 47 ++++++ source/Steam DLL/cmake/patch_directxtk.cmake | 3 + source/Steam DLL/cmake/version.rc.in | 4 +- .../Steam DLL/cmake/write_user_presets.cmake | 3 + source/Steam DLL/cmake/x64-windows-skse.cmake | 3 - 8 files changed, 131 insertions(+), 147 deletions(-) create mode 100644 source/Steam DLL/build.cmd create mode 100644 source/Steam DLL/cmake/patch_directxtk.cmake create mode 100644 source/Steam DLL/cmake/write_user_presets.cmake delete mode 100644 source/Steam DLL/cmake/x64-windows-skse.cmake diff --git a/source/Steam DLL/.gitignore b/source/Steam DLL/.gitignore index a9e29a97f..823193147 100644 --- a/source/Steam DLL/.gitignore +++ b/source/Steam DLL/.gitignore @@ -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 diff --git a/source/Steam DLL/CMakeLists.txt b/source/Steam DLL/CMakeLists.txt index 92616ddb8..a67cca9a8 100644 --- a/source/Steam DLL/CMakeLists.txt +++ b/source/Steam DLL/CMakeLists.txt @@ -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$<$: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 @@ -156,7 +178,7 @@ target_include_directories(${PROJECT_NAME} PUBLIC $ ) - + target_precompile_headers(${PROJECT_NAME} PRIVATE src/PCH.h @@ -164,7 +186,6 @@ target_precompile_headers(${PROJECT_NAME} install(TARGETS ${PROJECT_NAME} DESTINATION "${CMAKE_INSTALL_LIBDIR}") - ######################################################################################################################## ## Automatic plugin deployment ######################################################################################################################## diff --git a/source/Steam DLL/CMakePresets.json b/source/Steam DLL/CMakePresets.json index 566eb6bb2..bb4bbee12 100644 --- a/source/Steam DLL/CMakePresets.json +++ b/source/Steam DLL/CMakePresets.json @@ -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$<$: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]" - } - } - } ] } diff --git a/source/Steam DLL/build.cmd b/source/Steam DLL/build.cmd new file mode 100644 index 000000000..57d0082c4 --- /dev/null +++ b/source/Steam DLL/build.cmd @@ -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\. diff --git a/source/Steam DLL/cmake/patch_directxtk.cmake b/source/Steam DLL/cmake/patch_directxtk.cmake new file mode 100644 index 000000000..ab00b79a5 --- /dev/null +++ b/source/Steam DLL/cmake/patch_directxtk.cmake @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:49e65631d5c750bd9711048c94ce39805140809ecc3835bcc5ae80230d11d1fe +size 1238 diff --git a/source/Steam DLL/cmake/version.rc.in b/source/Steam DLL/cmake/version.rc.in index cada76e84..fbbaba1ae 100644 --- a/source/Steam DLL/cmake/version.rc.in +++ b/source/Steam DLL/cmake/version.rc.in @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:338bcd8d7333f8887df6a7ec026a0a7bbd52116163eec592042d3974f57b1183 -size 941 +oid sha256:2e9bdb72c2a13eb8bf16df3ff636884e73787bc7f86fbd2e88100bfc65908eb0 +size 985 diff --git a/source/Steam DLL/cmake/write_user_presets.cmake b/source/Steam DLL/cmake/write_user_presets.cmake new file mode 100644 index 000000000..619c18dbd --- /dev/null +++ b/source/Steam DLL/cmake/write_user_presets.cmake @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f5bb2e02efa9c61ae468c21aa10d28a2780c65c1bf0642bbdf829b9d9b38901 +size 4382 diff --git a/source/Steam DLL/cmake/x64-windows-skse.cmake b/source/Steam DLL/cmake/x64-windows-skse.cmake deleted file mode 100644 index 4eedaa8f3..000000000 --- a/source/Steam DLL/cmake/x64-windows-skse.cmake +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a16e5b30471c2f50b6fe6bae55f973efa2768d5871966ae4ee51c5339873ef42 -size 227