cmake_minimum_required(VERSION 3.16)
project(ABCUAdvisingAVL VERSION 1.0 LANGUAGES CXX)

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

option(ENABLE_SANITIZERS "Enable address and undefined-behavior sanitizers on supported compilers" OFF)

add_library(abcu_core src/AvlTree.cpp src/CourseLoader.cpp)
target_include_directories(abcu_core PUBLIC include)

function(abcu_warnings target)
    if(MSVC)
        target_compile_options(${target} PRIVATE /W4 /permissive-)
    else()
        target_compile_options(${target} PRIVATE -Wall -Wextra -Wpedantic)
    endif()
    if(ENABLE_SANITIZERS AND CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
        target_compile_options(${target} PRIVATE -fsanitize=address,undefined -fno-omit-frame-pointer)
        target_link_options(${target} PRIVATE -fsanitize=address,undefined)
    endif()
endfunction()

abcu_warnings(abcu_core)
add_executable(abcu_advising src/main.cpp)
target_link_libraries(abcu_advising PRIVATE abcu_core)
abcu_warnings(abcu_advising)

add_executable(abcu_benchmark benchmark/benchmark.cpp)
target_include_directories(abcu_benchmark PRIVATE benchmark)
target_link_libraries(abcu_benchmark PRIVATE abcu_core)
abcu_warnings(abcu_benchmark)

enable_testing()
add_executable(test_avl_tree tests/test_avl_tree.cpp)
target_link_libraries(test_avl_tree PRIVATE abcu_core)
abcu_warnings(test_avl_tree)
add_test(NAME avl_tree COMMAND test_avl_tree)

add_executable(test_course_loader tests/test_course_loader.cpp)
target_link_libraries(test_course_loader PRIVATE abcu_core)
target_compile_definitions(test_course_loader PRIVATE TEST_DATA_DIR="${CMAKE_CURRENT_SOURCE_DIR}/data")
abcu_warnings(test_course_loader)
add_test(NAME course_loader COMMAND test_course_loader)
