cmake_minimum_required(VERSION 3.24)
project(MK64Extractor LANGUAGES C CXX)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_SCAN_FOR_MODULES OFF)
# The pinned fmt version predates current Apple Clang's consteval behavior.
add_compile_definitions(FMT_CONSTEVAL=)
set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)
set(USE_STANDALONE OFF CACHE BOOL "" FORCE)
set(BUILD_STORMLIB OFF CACHE BOOL "" FORCE)
foreach(game SM64 SF64 FZERO MARIO_ARTIST)
  set(BUILD_${game} OFF CACHE BOOL "" FORCE)
endforeach()
set(BUILD_MK64 ON CACHE BOOL "" FORCE)
set(BUILD_NAUDIO ON CACHE BOOL "" FORCE)
get_filename_component(PORT_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/../../../.." ABSOLUTE)
set(TORCH_ROOT "${PORT_ROOT}/third_party/SpaghettiKart/torch")
add_subdirectory("${TORCH_ROOT}" torch)

# Work only on a generated build copy. The console's pinned Torch stays intact.
# Also works against the unpatched upstream submodule in a clean checkout.
file(READ "${TORCH_ROOT}/src/Companion.cpp" companion)
set(hook "#include \"desktop_hooks.hpp\"\n")
string(PREPEND companion "${hook}")
set(loop "for (const auto & entry : Torch::getRecursiveEntries(this->gAssetPath)){")
string(FIND "${companion}" "${loop}" loop_at)
if(loop_at EQUAL -1)
  message(FATAL_ERROR "Torch traversal changed; review desktop progress hook")
endif()
string(REPLACE "${loop}" "${loop}\nMk64DesktopProgress(entry.path().generic_string().c_str());" companion "${companion}")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/Companion.cpp" "${companion}")
get_target_property(torch_sources torch SOURCES)
list(FILTER torch_sources EXCLUDE REGEX "/Companion\\.cpp$")
set_property(TARGET torch PROPERTY SOURCES "${torch_sources};${CMAKE_CURRENT_BINARY_DIR}/Companion.cpp")
target_include_directories(torch PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}")
add_executable(mk64-extract runner.cpp)
target_link_libraries(mk64-extract PRIVATE torch)
target_include_directories(mk64-extract PRIVATE "${TORCH_ROOT}/src")
if(MINGW)
  target_link_options(mk64-extract PRIVATE -static -static-libgcc -static-libstdc++)
endif()
install(TARGETS mk64-extract RUNTIME DESTINATION bin)
