cmake_minimum_required(VERSION 3.15.0 FATAL_ERROR) set(CMAKE_SYSTEM_VERSION 8.1 CACHE STRING "" FORCE) project(SkyrimOutfitSystemSE CXX) ################################################################################ # Set target arch type if empty. Visual studio solution generator provides it. ################################################################################ if(NOT CMAKE_CL_64) message(FATAL_ERROR "Must use a 64-bit toolchain!") endif() if(NOT "${VCPKG_TARGET_TRIPLET}" STREQUAL "x64-windows-static") message(FATAL_ERROR "Must set VCPKG_TARGET_TRIPLET to x64-windows-static! It is currently ${VCPKG_TARGET_TRIPLET}") endif() ################################################################################ # Global configuration types ################################################################################ set(CMAKE_CONFIGURATION_TYPES "Debug" "Release" CACHE STRING "" FORCE ) ################################################################################ # Nuget packages function stub. ################################################################################ function(use_package TARGET PACKAGE VERSION) message(WARNING "No implementation of use_package. Create yours. " "Package \"${PACKAGE}\" with version \"${VERSION}\" " "for target \"${TARGET}\" is ignored!") endfunction() ################################################################################ # Use solution folders feature ################################################################################ set_property(GLOBAL PROPERTY USE_FOLDERS ON) ################################################################################ # Sub-projects ################################################################################ set(SKSE_SUPPORT_XBYAK 1) find_package(CommonLibSSE REQUIRED) ################################################################################ # MSVC runtime library ################################################################################ string(CONCAT "MSVC_RUNTIME_LIBRARY_STR" $<$:MultiThreadedDebug> $<$:MultiThreaded>) ################################################################################ # Rust Stuff ################################################################################ include(FetchContent) FetchContent_Declare( Corrosion GIT_REPOSITORY https://github.com/corrosion-rs/corrosion.git GIT_TAG v0.2.1 # Optionally specify a commit hash, version tag or branch here ) FetchContent_MakeAvailable(Corrosion) corrosion_import_crate(MANIFEST_PATH Cargo.toml) get_target_property(RE_INCLUDE CommonLibSSE::CommonLibSSE INTERFACE_INCLUDE_DIRECTORIES) get_target_property(RE_OPTIONS CommonLibSSE::CommonLibSSE INTERFACE_COMPILE_OPTIONS) get_target_property(RE_DEFINITIONS CommonLibSSE::CommonLibSSE INTERFACE_COMPILE_DEFINITIONS) set(RUST_HEADER_PATH ${CMAKE_CURRENT_BINARY_DIR}/rust-include/) if (CMAKE_BUILD_TYPE STREQUAL "Release") set(CMAKE_RUST_MSVC_RUNTIME_LIBRARY "/MT") else() set(CMAKE_RUST_MSVC_RUNTIME_LIBRARY "/MTd") endif() corrosion_set_env_vars(sos INCLUDE_PATHS="${RE_INCLUDE}" OPTIONS="${RE_OPTIONS}" DEFINITIONS="${RE_DEFINITIONS}" HEADER_GEN="${RUST_HEADER_PATH}" CRATE_CC_NO_DEFAULTS=1 CXXFLAGS="${CMAKE_RUST_MSVC_RUNTIME_LIBRARY}") add_library(sos-proxy STATIC ${RUST_HEADER_PATH}/bindings.h src/cpp/dummy.cpp) add_custom_command(OUTPUT ${RUST_HEADER_PATH}/bindings.h COMMAND ${CMAKE_COMMAND} -E copy_if_different ${RUST_HEADER_PATH}/bindings.h.tmp ${RUST_HEADER_PATH}/bindings.h DEPENDS sos-static) target_link_libraries(sos-proxy PUBLIC sos-static) target_include_directories(sos-proxy INTERFACE ${RUST_HEADER_PATH} src/rust/) ################################################################################ # Target ################################################################################ add_library(SkyrimOutfitSystemSE SHARED src/cpp/include/version.h src/cpp/version.rc src/cpp/include/SOS_PCH.h src/cpp/main.cpp src/cpp/include/OutfitSystem.h src/cpp/OutfitSystem.cpp src/cpp/include/PlayerSkinning.h src/cpp/hooking/Hooks_AE.cpp src/cpp/hooking/Hooks_PRE_AE.cpp src/cpp/hooking/Patches.cpp src/cpp/Utility.cpp src/cpp/include/RE/REAugments.h src/cpp/RE/REAugments.cpp src/cpp/RustSymbols.cpp) set(ROOT_NAMESPACE SkyrimOutfitSystemSE) set_target_properties(SkyrimOutfitSystemSE PROPERTIES VS_GLOBAL_KEYWORD "Win32Proj" ) set_target_properties(SkyrimOutfitSystemSE PROPERTIES INTERPROCEDURAL_OPTIMIZATION_RELEASE "TRUE" ) target_include_directories(SkyrimOutfitSystemSE PUBLIC src/cpp/include/ ) target_precompile_headers(SkyrimOutfitSystemSE PRIVATE src/cpp/include/SOS_PCH.h ) target_compile_definitions(SkyrimOutfitSystemSE PRIVATE XBYAK_NO_OP_NAMES ENABLE_SKYRIM_SE ENABLE_SKYRIM_AE ENABLE_COMMONLIBSSE_TESTING ) target_compile_features(SkyrimOutfitSystemSE PRIVATE cxx_std_20 ) if(MSVC) target_compile_options(SkyrimOutfitSystemSE PRIVATE "/sdl" # Enable Additional Security Checks "/utf-8" # Set Source and Executable character sets to UTF-8 "/Zi" # Debug Information Format "/EHsc" # C++ exception handling "/Zc:preprocessor" # Enable preprocessor conformance mode "/experimental:external" "/external:anglebrackets" "/external:W0" "/wd4200" # nonstandard extension used : zero-sized array in struct/union ) target_link_options(SkyrimOutfitSystemSE PRIVATE "$<$:/INCREMENTAL;/OPT:NOREF;/OPT:NOICF>" "$<$:/INCREMENTAL:NO;/OPT:REF;/OPT:ICF;/DEBUG:FULL>" ) set_target_properties(SkyrimOutfitSystemSE PROPERTIES MSVC_RUNTIME_LIBRARY ${MSVC_RUNTIME_LIBRARY_STR}) endif() ################################################################################ # Compile definitions ################################################################################ ################################################################################ # Install steps ################################################################################ add_custom_command(TARGET SkyrimOutfitSystemSE POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy $ "${CMAKE_CURRENT_SOURCE_DIR}/mod_files/SKSE/Plugins/SkyrimOutfitSystemSE.dll" ) ################################################################################ # Dependencies ################################################################################ # Link with other targets. find_package(span-lite REQUIRED CONFIG) find_package(spdlog REQUIRED CONFIG) find_package(xbyak REQUIRED CONFIG) target_link_libraries(SkyrimOutfitSystemSE PUBLIC CommonLibSSE::CommonLibSSE nonstd::span-lite spdlog::spdlog xbyak::xbyak sos-proxy ) target_include_directories(SkyrimOutfitSystemSE PRIVATE)