cmake_minimum_required(VERSION 3.21)

project(CoopAllTheThings
	VERSION 0.0.1
	DESCRIPTION "Steam Remote Play Together for any XInput game"
	LANGUAGES CXX)

if(NOT WIN32)
	message(FATAL_ERROR "CoopAllTheThings targets Windows only.")
endif()

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

# Emit compile_commands.json so clangd resolves includes/flags. Ignored by the
# Visual Studio generator, so configure the Ninja build (build-clangd/) for this;
# .clangd points clangd at that compilation database.
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

# Single output dir keeps the donor-launch / inject workflow simple: host exe and
# hook dll land next to each other under /bin (already in .gitignore).
set(COOP_OUTPUT_DIR "${CMAKE_SOURCE_DIR}/bin/$<CONFIG>")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${COOP_OUTPUT_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${COOP_OUTPUT_DIR}")

if(MSVC)
	add_compile_options(/W4 /permissive- /Zc:__cplusplus /utf-8 /MP)
	add_compile_definitions(UNICODE _UNICODE WIN32_LEAN_AND_MEAN NOMINMAX)
endif()

add_subdirectory(third_party)
add_subdirectory(common)
add_subdirectory(host)

# The injected hook DLL pulls in SafetyHook, which fetches Zydis via FetchContent
# at configure time (allowed for transitive deps).
option(COOP_BUILD_HOOK "Build the injected game-side hook DLL" ON)
if(COOP_BUILD_HOOK)
	# SafetyHook's own tests/examples/docs are noise for us.
	set(SAFETYHOOK_BUILD_TEST OFF CACHE BOOL "" FORCE)
	set(SAFETYHOOK_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
	set(SAFETYHOOK_BUILD_DOCS OFF CACHE BOOL "" FORCE)
	add_subdirectory(third_party/safetyhook)
	add_subdirectory(hook)
	enable_testing()
	add_subdirectory(tools/audio_tone)  # coop_tone: audio source for the loopback test
	add_subdirectory(tools/audio_probe) # coop_audio_probe: inject + diagnose the render-hook
	add_subdirectory(tests)
endif()
