cmake_minimum_required(VERSION 3.26)
project(FastTurboPythonWindows LANGUAGES CXX CUDA RC)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CUDA_STANDARD 20)
if(TURBO_DISTRIBUTION)
  set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
  set(CMAKE_CUDA_RUNTIME_LIBRARY Static)
endif()
find_package(CUDAToolkit 13.0 REQUIRED)
# The baseline executable and DLL link the same unmodified Release GPU library.
add_subdirectory("${FASTTURBO_WINDOWS}" reference)
if(NOT EXISTS "${FASTTURBO_MACOS}/ThirdParty/VkFFTSource/vkFFT/vkFFT.h")
  message(FATAL_ERROR "The vendored VkFFT source is missing.")
endif()
set_property(TARGET turbo_core PROPERTY INCLUDE_DIRECTORIES
  "${FASTTURBO_WINDOWS}/src;${CUDAToolkit_INCLUDE_DIRS};${FASTTURBO_VKFFT}")
include("${CMAKE_CURRENT_SOURCE_DIR}/../cuda/controller.cmake")
foreach(name renderer.cpp resources.hpp)
  configure_file("${FASTTURBO_WINDOWS}/src/${name}" "${adapted}/${name}" COPYONLY)
endforeach()
# Resources belong to this DLL rather than the Python executable.
adapt(resources.hpp "auto module=GetModuleHandleW(nullptr);"
  "HMODULE module{}; GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, reinterpret_cast<LPCWSTR>(&resource), &module);")
add_library(fastturbo SHARED bridge.cpp "${adapted}/renderer.cpp" "${adapted}/controller.cpp"
  "${CMAKE_CURRENT_BINARY_DIR}/reference/embedded/embedded.rc")
add_dependencies(fastturbo embedded_shaders)
target_include_directories(fastturbo PRIVATE "${adapted}" "${FASTTURBO_WINDOWS}/src" .. vendor)
target_link_libraries(fastturbo PRIVATE turbo_core d3d11 dxgi d2d1 dwrite windowscodecs comdlg32 ole32 comctl32 winmm)
target_compile_definitions(fastturbo PRIVATE UNICODE _UNICODE FASTTURBO_EXPORTS)
target_compile_options(fastturbo PRIVATE /utf-8 /W4 /fp:strict)
enable_testing()
add_test(NAME native_core_lifecycle COMMAND $<TARGET_FILE:core_tests>)
