cmake_minimum_required(VERSION 3.25)
project(LanternCpuExperiments LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
option(LANTERN_SANITIZERS "Enable address and undefined behavior sanitizers" OFF)
add_library(lantern src/lantern.cpp src/diffuse.cpp)
target_include_directories(lantern PUBLIC include)
target_compile_options(lantern PRIVATE -Wall -Wextra -Wpedantic -Wconversion -Wshadow)
if(LANTERN_SANITIZERS AND CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU")
  target_compile_options(lantern PUBLIC -fsanitize=address,undefined -fno-omit-frame-pointer)
  target_link_options(lantern PUBLIC -fsanitize=address,undefined)
endif()
add_executable(lantern-experiment src/experiment.cpp)
target_link_libraries(lantern-experiment PRIVATE lantern)
add_executable(lantern-render src/render.cpp)
target_link_libraries(lantern-render PRIVATE lantern)
include(CTest)
if(BUILD_TESTING)
  add_executable(lantern-tests tests/lantern_tests.cpp)
  target_link_libraries(lantern-tests PRIVATE lantern)
  add_test(NAME lantern-contracts COMMAND lantern-tests)
  add_test(NAME lantern-experiment COMMAND lantern-experiment)
  add_executable(lantern-diffuse-tests tests/diffuse_tests.cpp)
  target_link_libraries(lantern-diffuse-tests PRIVATE lantern)
  add_test(NAME lantern-diffuse-contracts COMMAND lantern-diffuse-tests)
  add_test(NAME lantern-constant-environment COMMAND lantern-render --constant)
  add_test(NAME lantern-trace COMMAND lantern-render --trace)
endif()
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU")
  foreach(target lantern-experiment lantern-render)
    target_compile_options(${target} PRIVATE -Wall -Wextra -Wpedantic -Wconversion -Wshadow)
  endforeach()
  if(BUILD_TESTING)
    foreach(target lantern-tests lantern-diffuse-tests)
      target_compile_options(${target} PRIVATE -Wall -Wextra -Wpedantic -Wconversion -Wshadow)
    endforeach()
  endif()
endif()
