cmake_minimum_required(VERSION 3.20)
project(XboxNativePort C CXX)
# must match GAME_NAME_A / GAME_DLL_A in src/game_config.h
set(GAME_NAME "Grabbed by the Ghoulies")
set(GAME_DLL_NAME "ghoulies")
if(NOT CMAKE_SIZEOF_VOID_P EQUAL 4)
  message(FATAL_ERROR "Must be built 32-bit (vcvars32): the original Xbox x86 code runs natively in-process")
endif()
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
add_compile_options($<$<COMPILE_LANGUAGE:C>:/std:c17> /W3 /Zi /wd4996 /wd4244 /wd4018 /wd4267 /utf-8)
add_compile_definitions(WIN32_LEAN_AND_MEAN NOMINMAX _CRT_SECURE_NO_WARNINGS)

# --- stub EXE: fixed base 0x10000, its image reserves the Xbox address range 0x11000..0x577000
add_executable(game WIN32 src/stub/stub.c res/stub.rc)
target_compile_options(game PRIVATE /GS- /O1)
target_link_options(game PRIVATE /NODEFAULTLIB /ENTRY:stub_entry /BASE:0x10000 /FIXED /DYNAMICBASE:NO
  /LARGEADDRESSAWARE /SAFESEH:NO /SECTION:.xbe,RWE /STACK:0x200000 /INCREMENTAL:NO)
target_link_libraries(game PRIVATE kernel32 user32)

# --- runtime DLL: loader, Xbox kernel replacement, library replacements (D3D9, XAudio2, XInput)
file(GLOB RT_SRC CONFIGURE_DEPENDS src/rt/*.c src/rt/*.cpp)
add_library(runtime SHARED ${RT_SRC})
target_link_options(runtime PRIVATE /SAFESEH:NO /LARGEADDRESSAWARE /INCREMENTAL:NO /OPT:REF)
target_link_libraries(runtime PRIVATE winmm d3d9 d3dcompiler xinput xaudio2 bcrypt shlwapi hid setupapi)
set_target_properties(runtime PROPERTIES OUTPUT_NAME "${GAME_DLL_NAME}")
add_dependencies(game runtime)
set_target_properties(game PROPERTIES OUTPUT_NAME "${GAME_NAME}")

# --- installer: one exe with the runtime embedded; turns the player's own game copy (ISO or folder) into the PC version
set(SETUP_EXE "${CMAKE_BINARY_DIR}/bin/${GAME_NAME}.exe")
set(SETUP_DLL "${CMAKE_BINARY_DIR}/bin/${GAME_DLL_NAME}.dll")
configure_file(res/setup.rc.in ${CMAKE_BINARY_DIR}/setup.rc @ONLY)
add_executable(setup WIN32 src/setup/setup.c ${CMAKE_BINARY_DIR}/setup.rc)
set_source_files_properties(${CMAKE_BINARY_DIR}/setup.rc PROPERTIES OBJECT_DEPENDS "${SETUP_EXE};${SETUP_DLL};${CMAKE_SOURCE_DIR}/res/setup.manifest;${CMAKE_SOURCE_DIR}/src/game_config.h")
target_compile_options(setup PRIVATE /O1)
target_link_options(setup PRIVATE /MANIFEST:NO /INCREMENTAL:NO)
target_link_libraries(setup PRIVATE comctl32 shell32 ole32 uuid shlwapi advapi32 user32 gdi32)
add_dependencies(setup game runtime)
set_target_properties(setup PROPERTIES OUTPUT_NAME "${GAME_NAME} Setup" RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/dist)
