cmake_minimum_required(VERSION 3.21)

project(parte-registration LANGUAGES CXX)

if(NOT TARGET Eigen3::Eigen)
  find_package(Eigen3 3.3 REQUIRED NO_MODULE)
endif()
find_package(OpenMP REQUIRED)

if(NOT TARGET wpmc)
  add_subdirectory(
    "${CMAKE_CURRENT_LIST_DIR}/wpmc"
    "${CMAKE_CURRENT_BINARY_DIR}/wpmc"
  )
endif()

add_library(
  parte-registration
  matching.cpp
  pch.cpp
  pipeline.cpp
  registration.cpp
)
add_library(PARTE::registration ALIAS parte-registration)

target_compile_features(parte-registration PUBLIC cxx_std_20)
target_include_directories(
  parte-registration
  PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
)
target_link_libraries(
  parte-registration
  PUBLIC
    Eigen3::Eigen
    OpenMP::OpenMP_CXX
    PARTE::features
    PARTE::segmentation
    wpmc
)
set_target_properties(
  parte-registration
  PROPERTIES
    CXX_EXTENSIONS OFF
    POSITION_INDEPENDENT_CODE ON
)

if(PARTE_BUILD_PYTHON_BINDINGS)
  find_package(Python COMPONENTS Interpreter Development.Module REQUIRED)
  execute_process(
    COMMAND "${Python_EXECUTABLE}" -m nanobind --cmake_dir
    OUTPUT_STRIP_TRAILING_WHITESPACE
    OUTPUT_VARIABLE NANOBIND_CMAKE_ROOT
    COMMAND_ERROR_IS_FATAL ANY
  )
  find_package(
    nanobind CONFIG REQUIRED
    PATHS "${NANOBIND_CMAKE_ROOT}"
    NO_DEFAULT_PATH
  )

  nanobind_add_module(parte-python python_bindings.cpp)
  target_link_libraries(parte-python PRIVATE PARTE::registration)
  set_target_properties(
    parte-python
    PROPERTIES
      OUTPUT_NAME parte
      LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/python"
      RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/python"
  )
endif()
