cmake_minimum_required(VERSION 3.18)
project(fiducial LANGUAGES CXX)

if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
  set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build." FORCE)
  set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
    "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
endif()

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

option(BUILD_CUDA "Enable CUDA-accelerated detector backends" OFF)

find_package(Python 3.10 REQUIRED COMPONENTS Interpreter Development.Module)

execute_process(
  COMMAND "${Python_EXECUTABLE}" -m nanobind --cmake_dir
  OUTPUT_VARIABLE NB_CMAKE_DIR
  OUTPUT_STRIP_TRAILING_WHITESPACE
  ERROR_QUIET
)
list(APPEND CMAKE_PREFIX_PATH "${NB_CMAKE_DIR}")
find_package(nanobind CONFIG REQUIRED)

set(_fiducial_sources csrc/bindings.cpp)

if(BUILD_CUDA)
  enable_language(CUDA)
  set(CMAKE_CUDA_STANDARD 17)
  set(CMAKE_CUDA_STANDARD_REQUIRED ON)
  list(APPEND _fiducial_sources csrc/cuda_kernels.cu)
endif()

nanobind_add_module(_fiducial NOMINSIZE ${_fiducial_sources})

if(BUILD_CUDA)
  target_compile_definitions(_fiducial PRIVATE FIDUCIAL_WITH_CUDA=1)
endif()

if(MSVC)
  target_compile_options(_fiducial PRIVATE /O2)
else()
  target_compile_options(_fiducial PRIVATE -O3)
endif()

install(TARGETS _fiducial LIBRARY DESTINATION fiducial)
