cmake_minimum_required(VERSION 3.8)
project(Wrapping)

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}")

# We just need the CommonCore and Python modules here.
find_package(VTK COMPONENTS CommonCore Python)
if (NOT VTK_FOUND)
  message("Skipping example: ${VTK_NOT_FOUND_MESSAGE}")
  return ()
endif ()

set(_shared_default ON)
get_target_property(_vtk_libtype VTK::CommonCore TYPE)
if (_vtk_libtype STREQUAL "STATIC_LIBRARY")
  set(_shared_default OFF)
endif ()

option(BUILD_SHARED_LIBS "Build shared or static libraries" "${_shared_default}")
include(CTest)
include(GNUInstallDirs)

# First we scan the modules in our project to find out the dependency graph
# between them.
vtk_module_scan(
  # With only 1 module file, this is easier. With more,
  # `vtk_module_find_modules` would be preferred.
  MODULE_FILES      "${CMAKE_CURRENT_SOURCE_DIR}/module/vtk.module"
  # Not building the only module we have is silly.
  REQUEST_MODULES   Wrapping::Wrappable
  # Store the list of provided modules from this scan.
  PROVIDES_MODULES  modules
  # Enable the tests for our modules.
  ENABLE_TESTS      ON)

vtk_module_python_default_destination(python_destination)

# Build the module we just scanned.
vtk_module_build(MODULES ${modules})

# Wrap it with Python.
vtk_module_wrap_python(
  MODULES         ${modules}
  TARGET          Wrapping::WrappablePython
  WRAPPED_MODULES wrapping_modules
  INSTALL_EXPORT  wrapping_export
  PYTHON_PACKAGE  "wrapping"
  MODULE_DESTINATION  "${python_destination}"
  CMAKE_DESTINATION   "${CMAKE_INSTALL_LIBDIR}/cmake/WrappingPython"
  LIBRARY_DESTINATION "${CMAKE_INSTALL_LIBDIR}"
  # Static Python modules are almost never wanted.
  BUILD_STATIC    OFF
  INSTALL_HEADERS OFF)

# Create an `__init__.py` containing wrapped filters.
set(python_modules)
foreach(module ${modules})
  _vtk_module_get_module_property("${module}"
    PROPERTY  "library_name"
    VARIABLE  library_name)
  list(APPEND python_modules "'${library_name}'")
endforeach()

list(JOIN python_modules ,  python_modules_string)
set(InitContent "__all__ = [${python_modules_string}]\n")
file(GENERATE
  OUTPUT  "${CMAKE_BINARY_DIR}/${python_destination}/wrapping/__init__.py"
  CONTENT "${InitContent}")
install(
  FILES       "${CMAKE_BINARY_DIR}/${python_destination}/wrapping/__init__.py"
  DESTINATION "${python_destination}/wrapping/")

# Install the module
export(
  EXPORT    wrapping_export
  NAMESPACE Wrapping::
  FILE      "${CMAKE_BINARY_DIR}/${python_destination}/wrapping/wrapping_export-targets.cmake")
install(
  EXPORT      wrapping_export
  NAMESPACE   Wrapping::
  FILE        wrapping_export-targets.cmake
  DESTINATION "${python_destination}/cmake/wrapping"
)
