cmake_minimum_required(VERSION 3.20)
project(LearningCompanion LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
option(ENABLE_SANITIZERS "Address and undefined-behavior sanitizers on GCC/Clang" OFF)
set(MANUAL_CPP_DIR "${CMAKE_CURRENT_SOURCE_DIR}/cpp" CACHE PATH "Headers to exercise")
find_package(Threads REQUIRED)
enable_testing()
foreach(name ownership queue spatial)
  add_executable(${name}_test tests/${name}_test.cpp)
  target_include_directories(${name}_test PRIVATE ${MANUAL_CPP_DIR})
  target_link_libraries(${name}_test PRIVATE Threads::Threads)
  if(MSVC)
    target_compile_options(${name}_test PRIVATE /UNDEBUG)
  else()
    target_compile_options(${name}_test PRIVATE -UNDEBUG)
  endif()
  add_test(NAME ${name} COMMAND ${name}_test)
  set_tests_properties(${name} PROPERTIES TIMEOUT 30)
endforeach()
foreach(name layout spatial)
  add_executable(${name}_benchmark cpp/${name}_benchmark.cpp)
  target_include_directories(${name}_benchmark PRIVATE cpp)
  target_link_libraries(${name}_benchmark PRIVATE Threads::Threads)
endforeach()
foreach(target ownership_test queue_test spatial_test layout_benchmark spatial_benchmark)
  if(MSVC)
    target_compile_options(${target} PRIVATE /W4 /permissive-)
  else()
    target_compile_options(${target} PRIVATE -Wall -Wextra -Wpedantic -Wconversion -Wshadow)
    if(ENABLE_SANITIZERS)
      target_compile_options(${target} PRIVATE -fsanitize=address,undefined -fno-omit-frame-pointer)
      target_link_options(${target} PRIVATE -fsanitize=address,undefined)
    endif()
  endif()
endforeach()
