cmake_minimum_required(VERSION 3.20)
project(NFSCRecompiled C)
if(NOT MSVC OR NOT CMAKE_SIZEOF_VOID_P EQUAL 4)
  message(FATAL_ERROR "The Windows validation host requires MSVC x86")
endif()
set(PCRECOMP "${CMAKE_SOURCE_DIR}/../pcrecomp" CACHE PATH "Existing patched pcrecomp")
set(NFS_CORE "${CMAKE_SOURCE_DIR}/../nfsu2-recompiled" CACHE PATH "Read-only Underground 2 infrastructure")
set(RT "${PCRECOMP}/runtime")
set(GEN "${CMAKE_SOURCE_DIR}/src/recomp/gen")
file(GLOB GENERATED CONFIGURE_DEPENDS "${GEN}/recomp_*.c")
if(NOT GENERATED)
  message(FATAL_ERROR "Generate the Carbon catalog and lift first")
endif()
set(INCLUDES "${RT}/recomp32" "${RT}/native32" "${RT}/hybrid" "${NFS_CORE}/src/runtime" "${NFS_CORE}/src/platform" "${GEN}")
set(DEFINITIONS RECOMP_FLAT_MEMORY RECOMP_STRICT_ICALL RECOMP_NATIVE_RANGE _CRT_SECURE_NO_WARNINGS)
add_library(mw_generated OBJECT ${GENERATED})
target_include_directories(mw_generated PRIVATE ${INCLUDES})
target_compile_definitions(mw_generated PRIVATE ${DEFINITIONS})
target_compile_options(mw_generated PRIVATE /O1 /w /bigobj /GS- /fp:precise)
# Reuse generic observers and shims without changing sibling projects.
# Give their environment switches and logs this game's identity at configure time.
set(SHARED_SOURCES)
foreach(relative src/host/profiler.c src/runtime/d3d9_trace.c src/runtime/native_range.c src/platform/nfs_log.c src/shims/win32_shims.c)
  file(READ "${NFS_CORE}/${relative}" source)
  string(REPLACE "NFSU2" "NFSC" source "${source}")
  get_filename_component(name "${relative}" NAME)
  file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/shared/${name}" "${source}")
  list(APPEND SHARED_SOURCES "${CMAKE_CURRENT_BINARY_DIR}/shared/${name}")
  set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${NFS_CORE}/${relative}")
endforeach()
add_executable(NFSC-Recompiled
  src/host/main.c src/runtime/nfs_runtime.c src/runtime/overrides.c src/runtime/dinput_trace.c src/runtime/widescreen.c src/shims/mw_shims.c
  ${SHARED_SOURCES} "${RT}/native32/native32.c"
  "${RT}/hybrid/hybrid.c" "${RT}/recomp32/image_loader.c" "${RT}/recomp32/recomp_trace.c"
  $<TARGET_OBJECTS:mw_generated>)
target_include_directories(NFSC-Recompiled PRIVATE ${INCLUDES})
target_compile_definitions(NFSC-Recompiled PRIVATE ${DEFINITIONS})
target_compile_options(NFSC-Recompiled PRIVATE /O2 /W3 /Zi)
target_link_options(NFSC-Recompiled PRIVATE /BASE:0x60000000 /DYNAMICBASE:NO /LARGEADDRESSAWARE /STACK:0x100000 /DEBUG /SUBSYSTEM:CONSOLE /INCREMENTAL:NO)
target_link_libraries(NFSC-Recompiled PRIVATE kernel32 user32 winmm dbghelp ws2_32)
