cmake_minimum_required(VERSION 3.24)
project(plot VERSION 0.1.0 LANGUAGES CXX)

list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
include(plot_options)

add_library(plot_core
  src/core/status.cpp
  src/math/transform.cpp
  src/data/minmax_pyramid.cpp
  src/data/series.cpp
  src/data/array_series.cpp
  src/data/stream_series.cpp
  src/gl/loader.cpp
  src/gl/handle.cpp
  src/render/shaders.cpp
  src/render/bitmap_font.cpp
  src/render/primitives.cpp
  src/render/buffer.cpp
  src/render/vertex_array.cpp
  src/render/program.cpp
  src/render/renderer.cpp
  src/plot/ticks.cpp
  src/plot/axis.cpp
  src/plot/grid.cpp
  src/plot/measure.cpp
  src/plot/plot.cpp
  src/input/controller.cpp
)
add_library(plot::core ALIAS plot_core)

target_include_directories(plot_core PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include")
target_compile_features(plot_core PUBLIC cxx_std_20)
target_link_libraries(plot_core PRIVATE ${CMAKE_DL_LIBS})
plot_apply_warnings(plot_core)

# Adapters own the surface and translate their host's events; examples link the
# adapter they demo. Both are opt-in, so the core library and its tests still build
# on a bare toolchain.
#
# They are added before the test suite on purpose: a test that drives an adapter
# needs that adapter's targets to exist, and with both switches on the suite can
# then exercise them (see tests/CMakeLists.txt).
if(PLOT_BUILD_GLFW)
  add_subdirectory(adapters/glfw)
endif()

if(PLOT_BUILD_IMGUI)
  add_subdirectory(adapters/imgui)
endif()

if(PLOT_BUILD_QT6)
  add_subdirectory(adapters/qt6)
endif()

if(PLOT_BUILD_EXAMPLES)
  add_subdirectory(examples)
endif()

if(PLOT_BUILD_TESTS)
  # Test-only: counts the pyramid's covering-decomposition entries and its bucket
  # merges so a test can pin the query's O(log n) cost and the append path's
  # amortised O(1) cost, neither of which any answer reveals. Off in every
  # non-test build (see include/plot/data/detail/{cover,merge}_count.hpp).
  target_compile_definitions(plot_core PRIVATE PLOT_PYRAMID_COUNT_COVERS
                                             PLOT_PYRAMID_COUNT_MERGES)

  enable_testing()
  add_subdirectory(tests)
endif()
