cmake_minimum_required(VERSION 3.16)
project(CodonTraceSwarm VERSION 0.12.0 LANGUAGES CXX)
add_library(codontrace_swarm src/CodonTraceSwarm.cpp src/cts/Json.cpp src/cts/Command.cpp src/cts/Dispatcher.cpp src/cts/CommandSession.cpp src/cts/Clock.cpp src/cts/TimedTelemetry.cpp src/cts/NetworkInbox.cpp src/cts/NonblockingAttempt.cpp src/cts/ReconnectOrchestrator.cpp src/cts/SampleScheduler.cpp src/cts/MockDrivers.cpp src/cts/Fdc2214Guard.cpp)
target_include_directories(codontrace_swarm PUBLIC src)
target_compile_features(codontrace_swarm PUBLIC cxx_std_11)
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
 target_compile_options(codontrace_swarm PRIVATE -Wall -Wextra -Wpedantic -Werror)
endif()
option(CTS_SANITIZE "Enable AddressSanitizer and UndefinedBehaviorSanitizer" OFF)
if(CTS_SANITIZE)
 if(NOT CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
  message(FATAL_ERROR "CTS_SANITIZE requires GCC or Clang")
 endif()
 target_compile_options(codontrace_swarm PUBLIC -fsanitize=address,undefined -fno-sanitize-recover=all -fno-omit-frame-pointer)
 target_link_options(codontrace_swarm PUBLIC -fsanitize=address,undefined)
endif()
include(CTest)
if(BUILD_TESTING)
 add_executable(cts_reconnect_review tests/reconnect_review.cpp)
 target_link_libraries(cts_reconnect_review PRIVATE codontrace_swarm)
 add_test(NAME reconnect_review COMMAND cts_reconnect_review)
 add_executable(cts_reconnect tests/reconnect.cpp)
 target_link_libraries(cts_reconnect PRIVATE codontrace_swarm)
 add_test(NAME reconnect COMMAND cts_reconnect)
 add_executable(cts_millis32 tests/millis32.cpp)
 target_link_libraries(cts_millis32 PRIVATE codontrace_swarm)
 add_test(NAME millis32 COMMAND cts_millis32)
 add_executable(cts_tests tests/native.cpp)
 target_link_libraries(cts_tests PRIVATE codontrace_swarm)
 add_test(NAME native COMMAND cts_tests)
 add_executable(cts_command_tests tests/commands.cpp)
 target_link_libraries(cts_command_tests PRIVATE codontrace_swarm)
 add_test(NAME commands COMMAND cts_command_tests)
 add_executable(cts_dispatcher_tests tests/dispatcher.cpp)
 target_link_libraries(cts_dispatcher_tests PRIVATE codontrace_swarm)
 add_test(NAME dispatcher COMMAND cts_dispatcher_tests)
 add_executable(cts_broker_node tests/broker_node.cpp)
 target_link_libraries(cts_broker_node PRIVATE codontrace_swarm)
 add_executable(cts_network_review tests/network_review.cpp)
 target_link_libraries(cts_network_review PRIVATE codontrace_swarm)
 add_test(NAME network_review COMMAND cts_network_review)
 add_executable(cts_network_tests tests/network.cpp)
 target_link_libraries(cts_network_tests PRIVATE codontrace_swarm)
 add_test(NAME network COMMAND cts_network_tests)
 add_executable(cts_network_probe tests/network_probe.cpp)
 target_link_libraries(cts_network_probe PRIVATE codontrace_swarm)
 add_executable(cts_clock_review tests/clock_review.cpp)
 target_link_libraries(cts_clock_review PRIVATE codontrace_swarm)
 add_test(NAME clock_review COMMAND cts_clock_review)
 add_executable(cts_clock_probe tests/clock_probe.cpp)
 target_link_libraries(cts_clock_probe PRIVATE codontrace_swarm)
 add_executable(cts_clock_tests tests/clock.cpp)
 target_link_libraries(cts_clock_tests PRIVATE codontrace_swarm)
 add_test(NAME clock COMMAND cts_clock_tests)
 add_executable(cts_session_tests tests/session.cpp)
 target_link_libraries(cts_session_tests PRIVATE codontrace_swarm)
 add_test(NAME session COMMAND cts_session_tests)
 add_executable(cts_session_probe tests/session_probe.cpp)
 target_link_libraries(cts_session_probe PRIVATE codontrace_swarm)
 add_executable(cts_command_probe tests/command_probe.cpp)
 target_link_libraries(cts_command_probe PRIVATE codontrace_swarm)
 add_executable(cts_attempt tests/attempt.cpp)
 target_link_libraries(cts_attempt PRIVATE codontrace_swarm)
 add_test(NAME attempt COMMAND cts_attempt)
 add_executable(cts_scheduler tests/scheduler.cpp)
 target_link_libraries(cts_scheduler PRIVATE codontrace_swarm)
 add_test(NAME scheduler COMMAND cts_scheduler)
 add_executable(cts_drivers tests/drivers.cpp)
 target_link_libraries(cts_drivers PRIVATE codontrace_swarm)
 add_test(NAME drivers COMMAND cts_drivers)
 add_executable(cts_fdc2214 tests/fdc2214.cpp)
 target_link_libraries(cts_fdc2214 PRIVATE codontrace_swarm)
 add_test(NAME fdc2214 COMMAND cts_fdc2214)
 add_executable(cts_orchestrator tests/orchestrator.cpp)
 target_link_libraries(cts_orchestrator PRIVATE codontrace_swarm)
 add_test(NAME orchestrator COMMAND cts_orchestrator)
endif()
