cmake_minimum_required(VERSION 3.24)
project(sacred2K LANGUAGES C CXX)

# sacred2.exe is a 32-bit process; everything we inject into it must be 32-bit too.
if(NOT CMAKE_SIZEOF_VOID_P EQUAL 4)
    message(FATAL_ERROR "sacred2K must be built for 32-bit x86 (use the 'x86-*' presets / an x86 MSVC environment).")
endif()
if(NOT MSVC)
    message(FATAL_ERROR "sacred2K requires MSVC (the game's C++ ABI is MSVC's).")
endif()

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Static CRT: no VC++ redistributable needed next to the game.
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")

add_compile_definitions(WIN32_LEAN_AND_MEAN NOMINMAX _CRT_SECURE_NO_WARNINGS)

include(cmake/Detours.cmake)

set(SACRED2K_CXX_FLAGS /W4 /permissive- /utf-8)

# --- sacred2K.dll: injected into sacred2.exe, installs the hooks -----------
add_library(sacred2K SHARED
    src/re/dllmain.cpp
    src/re/hook.cpp
    src/re/module.cpp
    src/re/log.cpp
    src/re/config.cpp
    src/re/patch.cpp
    src/re/crash.cpp
    src/re/sacred2K.def
    src/game/orc/log.cpp
    src/mods/borderless.cpp
)
target_include_directories(sacred2K PRIVATE src)
target_compile_options(sacred2K PRIVATE ${SACRED2K_CXX_FLAGS})
target_link_libraries(sacred2K PRIVATE detours dbghelp bcrypt)

# --- sacred2K.exe: launches sacred2.exe with sacred2K.dll injected ---------
add_executable(sacred2K_launcher WIN32 src/launcher/main.cpp)
set_target_properties(sacred2K_launcher PROPERTIES OUTPUT_NAME sacred2K)
target_compile_options(sacred2K_launcher PRIVATE ${SACRED2K_CXX_FLAGS})
target_link_libraries(sacred2K_launcher PRIVATE detours)
add_dependencies(sacred2K_launcher sacred2K)
