cmake_minimum_required(VERSION 3.8.2)

#-----------------------------------------------------------------------------
# Plugin name and version

project(read-and-write-resource-manager-state VERSION 1.0)

#-----------------------------------------------------------------------------
# Plugin options

#-----------------------------------------------------------------------------
# Find packages for the plugin
find_package(smtk REQUIRED)
if (NOT SMTK_ENABLE_PARAVIEW_SUPPORT)
  message(FATAL_ERROR
    "This project requires SMTK to be built with ParaView support.")
endif ()
find_package(Boost 1.64.0 REQUIRED COMPONENTS filesystem)
find_package(Qt5 REQUIRED COMPONENTS Core)

#-----------------------------------------------------------------------------
# Boost settings

add_library(boost_cxx_flags INTERFACE)
# For MSVC:
#  (/EHsc) setup windows exception handling
#  (/wd4996) quiet warnings about printf being potentially unsafe
#  (/wd4503) quiet warnings about truncating decorated name
#  (-DBOOST_ALL_NO_LIB) remove autolinking
target_compile_options(boost_cxx_flags INTERFACE
  $<$<CXX_COMPILER_ID:MSVC>:/EHsc /wd4996 /wd4503 -DBOOST_ALL_NO_LIB>)

set_property(TARGET Boost::boost APPEND PROPERTY INTERFACE_LINK_LIBRARIES boost_cxx_flags)

#-----------------------------------------------------------------------------
# CMake build settings

# Set the directory where the binaries will be stored
include(GNUInstallDirs)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_INSTALL_CMAKEDIR "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}")

# Add our Cmake directory to the module search path
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/CMake)

#-----------------------------------------------------------------------------
# Plugin sources

# Build the library containing the state I/O operations
add_subdirectory(operators)

string(REPLACE "-" "_" safe_project_name "${PROJECT_NAME}")

# Build the plugin containing the File menu items
paraview_plugin_scan(
  PLUGIN_FILES plugin/paraview.plugin
  PROVIDES_PLUGINS paraview_plugins
  ENABLE_BY_DEFAULT ON
  HIDE_PLUGINS_FROM_CACHE ON)
paraview_plugin_build(
  LIBRARY_SUBDIRECTORY "smtk-${smtk_VERSION}"
  PLUGINS ${paraview_plugins}
  PLUGINS_FILE_NAME "smtk.readwriteresourcemanagerstate.xml"
  AUTOLOAD ${paraview_plugins}
  INSTALL_EXPORT ${PROJECT_NAME}-plugin
  HEADERS_DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/${PROJECT_VERSION}"
  CMAKE_DESTINATION "${CMAKE_INSTALL_CMAKEDIR}"
  ADD_INSTALL_RPATHS ON
  TARGET ${safe_project_name}_paraview_plugins)

#-----------------------------------------------------------------------------
# Plugin tests

option(ENABLE_TESTING "Enable Testing" OFF)
if (ENABLE_TESTING)
  enable_testing()
  include(TestingMacros)
  add_subdirectory(testing)
endif()

export(
  EXPORT      ${PROJECT_NAME}
  FILE        "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_CMAKEDIR}/${PROJECT_NAME}-targets.cmake")
install(
  EXPORT      ${PROJECT_NAME}
  DESTINATION "${CMAKE_INSTALL_CMAKEDIR}"
  FILE        "${PROJECT_NAME}-targets.cmake")

include(CMakePackageConfigHelpers)

# Our requirements for a version file are basic, so we use CMake's basic version
# file generator
write_basic_package_version_file(
  "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}/${PROJECT_NAME}-config-version.cmake"
  VERSION ${${PROJECT_NAME}_VERSION}
  COMPATIBILITY AnyNewerVersion)

configure_file(
  "${CMAKE_CURRENT_SOURCE_DIR}/CMake/smtk-plugin-config.cmake.in"
  "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_CMAKEDIR}/${PROJECT_NAME}-config.cmake"
  @ONLY)
install(
  FILES       "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_CMAKEDIR}/${PROJECT_NAME}-config.cmake"
  DESTINATION "${CMAKE_INSTALL_CMAKEDIR}")
