cmake_minimum_required(VERSION 3.16)
project(PCLPlugin)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

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

option(BUILD_SHARED_LIBS "Build shared libraries" ON)
option(BUILD_TESTING "Enable testing" OFF)
option(FORCE_STATIC_MODULES "Build VTK modules statically" OFF)
mark_as_advanced(FORCE_STATIC_MODULES)
if (FORCE_STATIC_MODULES)
  set(FORCE_STATIC_MODULES_STRING FORCE_STATIC)
else ()
  set(FORCE_STATIC_MODULES_STRING)
endif()

set(pcl_required_components
  common
  kdtree
  features
  sample_consensus
  segmentation
  octree
  surface
)

find_package(ParaView 5.12 REQUIRED)
find_package(PCL 1.11 REQUIRED COMPONENTS ${pcl_required_components})

include(GNUInstallDirs)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}")

set("_paraview_plugin_default_${PROJECT_NAME}" ON)
paraview_plugin_scan(
  PLUGIN_FILES      "${CMAKE_CURRENT_SOURCE_DIR}/plugin/paraview.plugin"
  PROVIDES_PLUGINS  plugins
  REQUIRES_MODULES  required_modules)

foreach (module IN LISTS required_modules)
  if (NOT TARGET "${module}")
    message(FATAL_ERROR
      "Skipping example ${PROJECT_NAME}: Missing required module: "
      "${module}")
    return ()
  endif ()
endforeach ()

paraview_plugin_build(
  HEADERS_DESTINATION  "${CMAKE_INSTALL_INCLUDEDIR}"
  RUNTIME_DESTINATION  "${CMAKE_INSTALL_BINDIR}"
  LIBRARY_DESTINATION  "${CMAKE_INSTALL_LIBDIR}"
  LIBRARY_SUBDIRECTORY "${PARAVIEW_PLUGIN_SUBDIR}"
  PLUGINS_FILE_NAME    "pclplugin.plugins.xml"
  TARGET               PCLPlugin::paraview_plugin
  INSTALL_EXPORT       PCLPlugin
  CMAKE_DESTINATION    "${CMAKE_INSTALL_LIBDIR}/cmake/pclplugin"
  PLUGINS              ${plugins}
  AUTOLOAD             ${plugins}
)

include(CMakePackageConfigHelpers)

configure_package_config_file(
  "${CMAKE_CURRENT_SOURCE_DIR}/cmake/PCLPlugin.cmake.in"
  "${CMAKE_BINARY_DIR}/lib/cmake/pclplugin/PCLPluginConfig.cmake"
  INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/pclplugin"
)

set(pclplugin_files_to_install
  "${CMAKE_BINARY_DIR}/lib/cmake/pclplugin/PCLPluginConfig.cmake"
)

install(
  FILES       ${pclplugin_files_to_install}
  DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/pclplugin
)
