cmake_minimum_required(VERSION 3.24)
project(hydra_torrent_bridge LANGUAGES CXX)
if(MSVC)
  # The bridge owns/frees all C++ allocations; no CRT objects cross the ABI.
  # Match the windows-static vcpkg triplet and avoid an extra redist runtime.
  set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
endif()
find_package(LibtorrentRasterbar 2.1.1 EXACT CONFIG REQUIRED)
add_library(hydra_torrent_bridge SHARED bridge.cpp)
target_compile_definitions(hydra_torrent_bridge PRIVATE HYDRA_TORRENT_BRIDGE_BUILD)
target_compile_features(hydra_torrent_bridge PRIVATE cxx_std_17)
target_link_libraries(hydra_torrent_bridge PRIVATE LibtorrentRasterbar::torrent-rasterbar)
set_target_properties(hydra_torrent_bridge PROPERTIES
  CXX_VISIBILITY_PRESET hidden VISIBILITY_INLINES_HIDDEN YES
  BUILD_RPATH "$ORIGIN" INSTALL_RPATH "$ORIGIN")
if(APPLE)
  set_target_properties(hydra_torrent_bridge PROPERTIES INSTALL_RPATH "@loader_path")
elseif(UNIX)
  target_link_options(hydra_torrent_bridge PRIVATE "LINKER:--exclude-libs,ALL")
endif()
install(TARGETS hydra_torrent_bridge RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)
include(CTest)
option(HYDRA_TORRENT_SANITIZE "Check the bridge with address and undefined behavior sanitizers" OFF)
if(HYDRA_TORRENT_SANITIZE)
  target_compile_options(hydra_torrent_bridge PRIVATE -fsanitize=address,undefined -fno-omit-frame-pointer)
  target_link_options(hydra_torrent_bridge PRIVATE -fsanitize=address,undefined)
endif()
if(BUILD_TESTING)
  add_executable(torrent_bridge_test bridge_test.cpp)
  target_link_libraries(torrent_bridge_test PRIVATE hydra_torrent_bridge)
  if(HYDRA_TORRENT_SANITIZE)
    target_compile_options(torrent_bridge_test PRIVATE -fsanitize=address,undefined -fno-omit-frame-pointer)
    target_link_options(torrent_bridge_test PRIVATE -fsanitize=address,undefined)
  endif()
  add_test(NAME torrent_bridge_ownership COMMAND torrent_bridge_test)
endif()
