
# SWIG
find_package(SWIG REQUIRED)
find_package (Python COMPONENTS Interpreter Development)
include(${SWIG_USE_FILE})
include_directories(${Python3_INCLUDE_DIRS})

include_directories(../.)
include_directories(${PETSc_INCLUDE_DIRS})
include_directories(${LIBXML2_INCLUDE_DIR})
include_directories(${Python3_NumPy_INCLUDE_DIRS})

SET(UW_LIBRARIES
    Underworld
    StGermain
    StgDomain
    StgFEM
    PICellerator
    gLucifer
    Solvers
    pcu)

if(NOT APPLE)
    message(STATUS ">>> Linux System")
    set(CMAKE_INSTALL_RPATH "\$ORIGIN")
else()
    message(STATUS ">>> Apple")
    set(CMAKE_INSTALL_RPATH "@loader_path")
endif()

add_compile_options(-DU_SHOW_CPLUSPLUS_API=0)
add_compile_options(-DSWIG_PYTHON_SILENT_MEMLEAK)

set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)

SET(CMAKE_SWIG_FLAGS "-v" "-Wextra" "-O" "-c++" "-DSWIG_DO_NOT_WRAP")

SET_SOURCE_FILES_PROPERTIES(Function.i PROPERTIES CPLUSPLUS ON)
set_property(SOURCE Function.i PROPERTY SWIG_MODULE_NAME Function)
SWIG_ADD_LIBRARY(Function TYPE SHARED LANGUAGE python SOURCES Function.i)
SET_TARGET_PROPERTIES(${SWIG_MODULE_Function_REAL_NAME} PROPERTIES SUFFIX ".so")
SWIG_LINK_LIBRARIES(Function PRIVATE ${UW_LIBRARIES})
SWIG_LINK_LIBRARIES(Function PRIVATE ${PETSc_LINK_LIBRARIES})

SET_SOURCE_FILES_PROPERTIES(c_arrays.i PROPERTIES CPLUSPLUS ON)
set_property(SOURCE c_arrays.i PROPERTY SWIG_MODULE_NAME c_arrays)
SWIG_ADD_LIBRARY(c_arrays TYPE SHARED LANGUAGE python SOURCES c_arrays.i)
SET_TARGET_PROPERTIES(${SWIG_MODULE_c_arrays_REAL_NAME} PROPERTIES SUFFIX ".so")
SWIG_LINK_LIBRARIES(c_arrays PRIVATE ${UW_LIBRARIES})
SWIG_LINK_LIBRARIES(c_arrays PRIVATE ${PETSc_LINK_LIBRARIES})

SET_SOURCE_FILES_PROPERTIES(c_pointers.i PROPERTIES CPLUSPLUS ON)
set_property(SOURCE c_pointers.i PROPERTY SWIG_MODULE_NAME c_pointers)
SWIG_ADD_LIBRARY(c_pointers TYPE SHARED LANGUAGE python SOURCES c_pointers.i)
SET_TARGET_PROPERTIES(${SWIG_MODULE_c_pointers_REAL_NAME} PROPERTIES SUFFIX ".so")
SWIG_LINK_LIBRARIES(c_pointers PRIVATE ${UW_LIBRARIES})
SWIG_LINK_LIBRARIES(c_pointers PRIVATE ${PETSc_LINK_LIBRARIES})

SET_SOURCE_FILES_PROPERTIES(gLucifer.i PROPERTIES CPLUSPLUS ON)
set_property(SOURCE gLucifer.i PROPERTY SWIG_MODULE_NAME gLucifer)
SWIG_ADD_LIBRARY(gLucifer TYPE SHARED LANGUAGE python SOURCES gLucifer.i)
SET_TARGET_PROPERTIES(${SWIG_MODULE_gLucifer_REAL_NAME} PROPERTIES SUFFIX ".so")
SWIG_LINK_LIBRARIES(gLucifer PRIVATE ${UW_LIBRARIES})
SWIG_LINK_LIBRARIES(gLucifer PRIVATE ${PETSc_LINK_LIBRARIES})

SET_SOURCE_FILES_PROPERTIES(petsc.i PROPERTIES CPLUSPLUS ON)
set_property(SOURCE petsc.i PROPERTY SWIG_MODULE_NAME petsc)
SWIG_ADD_LIBRARY(petsc TYPE SHARED LANGUAGE python SOURCES petsc.i)
SET_TARGET_PROPERTIES(${SWIG_MODULE_petsc_REAL_NAME} PROPERTIES SUFFIX ".so")
SWIG_LINK_LIBRARIES(petsc PRIVATE ${UW_LIBRARIES})
SWIG_LINK_LIBRARIES(petsc PRIVATE ${PETSc_LINK_LIBRARIES})

SET_SOURCE_FILES_PROPERTIES(PICellerator.i PROPERTIES CPLUSPLUS ON)
set_property(SOURCE PICellerator.i PROPERTY SWIG_MODULE_NAME PICellerator)
SWIG_ADD_LIBRARY(PICellerator TYPE SHARED LANGUAGE python SOURCES PICellerator.i)
SET_TARGET_PROPERTIES(${SWIG_MODULE_PICellerator_REAL_NAME} PROPERTIES SUFFIX ".so")
SWIG_LINK_LIBRARIES(PICellerator PRIVATE ${UW_LIBRARIES})
SWIG_LINK_LIBRARIES(PICellerator PRIVATE ${PETSc_LINK_LIBRARIES})

SET_SOURCE_FILES_PROPERTIES(Solvers.i PROPERTIES CPLUSPLUS ON)
set_property(SOURCE Solvers.i PROPERTY SWIG_MODULE_NAME Solvers)
SWIG_ADD_LIBRARY(Solvers TYPE SHARED LANGUAGE python SOURCES Solvers.i)
SET_TARGET_PROPERTIES(${SWIG_MODULE_Solvers_REAL_NAME} PROPERTIES SUFFIX ".so")
SWIG_LINK_LIBRARIES(Solvers PRIVATE ${UW_LIBRARIES})
SWIG_LINK_LIBRARIES(Solvers PRIVATE ${PETSc_LINK_LIBRARIES})

SET_SOURCE_FILES_PROPERTIES(StgDomain.i PROPERTIES CPLUSPLUS ON)
set_property(SOURCE StgDomain.i PROPERTY SWIG_MODULE_NAME StgDomain)
SWIG_ADD_LIBRARY(StgDomain TYPE SHARED LANGUAGE python SOURCES StgDomain.i)
SET_TARGET_PROPERTIES(${SWIG_MODULE_StgDomain_REAL_NAME} PROPERTIES SUFFIX ".so")
SWIG_LINK_LIBRARIES(StgDomain PRIVATE ${UW_LIBRARIES})
SWIG_LINK_LIBRARIES(StgDomain PRIVATE ${PETSc_LINK_LIBRARIES})

SET_SOURCE_FILES_PROPERTIES(StGermain.i PROPERTIES CPLUSPLUS ON)
set_property(SOURCE StGermain.i PROPERTY SWIG_MODULE_NAME StGermain)
SWIG_ADD_LIBRARY(StGermain TYPE SHARED LANGUAGE python SOURCES StGermain.i)
SET_TARGET_PROPERTIES(${SWIG_MODULE_StGermain_REAL_NAME} PROPERTIES SUFFIX ".so")
SWIG_LINK_LIBRARIES(StGermain PRIVATE ${UW_LIBRARIES})
SWIG_LINK_LIBRARIES(StGermain PRIVATE ${PETSc_LINK_LIBRARIES})

SET_SOURCE_FILES_PROPERTIES(StGermain_Tools.i PROPERTIES CPLUSPLUS ON)
set_property(SOURCE StGermain_Tools.i PROPERTY SWIG_MODULE_NAME StGermain_Tools)
SWIG_ADD_LIBRARY(StGermain_Tools TYPE SHARED LANGUAGE python SOURCES StGermain_Tools.i StGermain_Tools.c)
SET_TARGET_PROPERTIES(${SWIG_MODULE_StGermain_Tools_REAL_NAME} PROPERTIES SUFFIX ".so")
SWIG_LINK_LIBRARIES(StGermain_Tools PRIVATE ${UW_LIBRARIES})
SWIG_LINK_LIBRARIES(StGermain_Tools PRIVATE ${PETSc_LINK_LIBRARIES})

SET_SOURCE_FILES_PROPERTIES(StgFEM.i PROPERTIES CPLUSPLUS ON)
set_property(SOURCE StgFEM.i PROPERTY SWIG_MODULE_NAME StgFEM)
SWIG_ADD_LIBRARY(StgFEM TYPE SHARED LANGUAGE python SOURCES StgFEM.i)
SET_TARGET_PROPERTIES(${SWIG_MODULE_StgFEM_REAL_NAME} PROPERTIES SUFFIX ".so")
SWIG_LINK_LIBRARIES(StgFEM PRIVATE ${UW_LIBRARIES})
SWIG_LINK_LIBRARIES(StgFEM PRIVATE ${PETSc_LINK_LIBRARIES})

SET_SOURCE_FILES_PROPERTIES(Underworld.i PROPERTIES CPLUSPLUS ON)
set_property(SOURCE Underworld.i PROPERTY SWIG_MODULE_NAME Underworld)
SWIG_ADD_LIBRARY(Underworld TYPE SHARED LANGUAGE python SOURCES Underworld.i)
SET_TARGET_PROPERTIES(${SWIG_MODULE_Underworld_REAL_NAME} PROPERTIES SUFFIX ".so")
SWIG_LINK_LIBRARIES(Underworld PRIVATE ${UW_LIBRARIES})
SWIG_LINK_LIBRARIES(Underworld PRIVATE ${PETSc_LINK_LIBRARIES})

# Handle where to install the resulting Python package
if(CALL_FROM_SETUP_PY)
    # The CMakeExtension will set CMAKE_INSTALL_PREFIX to the root
    # of the resulting sdist / wheel archive
    set(UW_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
else()
    # The Python package is installed directly in the folder of the
    # detected interpreter (system, user, or virtualenv)
    set(UW_INSTALL_PREFIX ${Python3_SITELIB})
endif()

get_property(FUNCTION_PY_FILE TARGET ${SWIG_MODULE_Function_REAL_NAME} PROPERTY SWIG_SUPPORT_FILES)
get_property(CARRAYS_PY_FILE TARGET ${SWIG_MODULE_c_arrays_REAL_NAME} PROPERTY SWIG_SUPPORT_FILES)
get_property(CPOINTERS_PY_FILE TARGET ${SWIG_MODULE_c_pointers_REAL_NAME} PROPERTY SWIG_SUPPORT_FILES)
get_property(GLUCIFER_PY_FILE TARGET ${SWIG_MODULE_gLucifer_REAL_NAME} PROPERTY SWIG_SUPPORT_FILES)
get_property(PETSC_PY_FILE TARGET ${SWIG_MODULE_petsc_REAL_NAME} PROPERTY SWIG_SUPPORT_FILES)
get_property(PICELLERATOR_PY_FILE TARGET ${SWIG_MODULE_PICellerator_REAL_NAME} PROPERTY SWIG_SUPPORT_FILES)
get_property(SOLVERS_PY_FILE TARGET ${SWIG_MODULE_Solvers_REAL_NAME} PROPERTY SWIG_SUPPORT_FILES)
get_property(STGDOMAIN_PY_FILE TARGET ${SWIG_MODULE_StgDomain_REAL_NAME} PROPERTY SWIG_SUPPORT_FILES)
get_property(STGERMAIN_PY_FILE TARGET ${SWIG_MODULE_StGermain_REAL_NAME} PROPERTY SWIG_SUPPORT_FILES)
get_property(STGERMAIN_TOOLS_PY_FILE TARGET ${SWIG_MODULE_StGermain_Tools_REAL_NAME} PROPERTY SWIG_SUPPORT_FILES)
get_property(STGFEM_PY_FILE TARGET ${SWIG_MODULE_StgFEM_REAL_NAME} PROPERTY SWIG_SUPPORT_FILES)
get_property(UNDERWORLD_PY_FILE TARGET ${SWIG_MODULE_Underworld_REAL_NAME} PROPERTY SWIG_SUPPORT_FILES)

set(WRAPPER_FILES
    ${FUNCTION_PY_FILE}
    ${CARRAYS_PY_FILE}
    ${CPOINTERS_PY_FILE} 
    ${GLUCIFER_PY_FILE}
    ${PETSC_PY_FILE}
    ${PICELLERATOR_PY_FILE}
    ${SOLVERS_PY_FILE}
    ${STGDOMAIN_PY_FILE} 
    ${STGERMAIN_PY_FILE} 
    ${STGERMAIN_TOOLS_PY_FILE}
    ${STGFEM_PY_FILE}
    ${UNDERWORLD_PY_FILE}
)

install(FILES ${WRAPPER_FILES} DESTINATION "${UW_INSTALL_PREFIX}/libUnderworld/libUnderworldPy")


set(SWIG_LIBRARIES
    ${SWIG_MODULE_Function_REAL_NAME}
    ${SWIG_MODULE_c_arrays_REAL_NAME}
    ${SWIG_MODULE_c_pointers_REAL_NAME}
    ${SWIG_MODULE_gLucifer_REAL_NAME}
    ${SWIG_MODULE_petsc_REAL_NAME}
    ${SWIG_MODULE_PICellerator_REAL_NAME}
    ${SWIG_MODULE_Solvers_REAL_NAME}
    ${SWIG_MODULE_StgDomain_REAL_NAME}
    ${SWIG_MODULE_StGermain_REAL_NAME}
    ${SWIG_MODULE_StGermain_Tools_REAL_NAME}
    ${SWIG_MODULE_StgFEM_REAL_NAME}
    ${SWIG_MODULE_Underworld_REAL_NAME}
)

install(TARGETS ${SWIG_LIBRARIES}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
