# Manyo Library SerialPySrv module
set(MODULENAME SerialPySrv)

#
# ========= Library =========
#

add_library(${MODULENAME} SHARED)
target_sources(${MODULENAME} PRIVATE
    SerialNeutronExchanger.cc
    SerialPythonServerClient.cc
)

#
# ========= Compile Settings =========
#

target_compile_features(${MODULENAME} PRIVATE cxx_std_11)
target_compile_options(Manyo PRIVATE
    -O3
    -Werror=return-type
)

#
# ========= Compile Definitions =========
#

if(OpenMP_FOUND)
    target_compile_definitions(${MODULENAME} PRIVATE MULTH=${MANYO_MULTH})
endif()

#
# ========= Include Paths =========
#

target_include_directories(${MODULENAME}
    PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}
        ${CMAKE_CURRENT_SOURCE_DIR}/../core
        ${MANYO_NEXUS_PATH}/include
)

#
# ========= Linking =========
#

target_link_libraries(${MODULENAME}
    PRIVATE
        Manyo
        Python::Python
        OpenMP::OpenMP_CXX
        Boost::serialization
        Boost::filesystem
)

target_link_directories(${MODULENAME}
    PRIVATE
        ${CMAKE_INSTALL_PREFIX}/lib
        ${MANYO_NEXUS_PATH}/lib
)

#
# ========= SWIG Module =========
#

set_property(SOURCE ${MODULENAME}.i PROPERTY CPLUSPLUS ON)
set_property(SOURCE ${MODULENAME}.i
    PROPERTY INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR}/../core
) # Error on "Swig compile SerialPySrv.i for python". This maybe set include path for SerialPySrv.i not CXX.

swig_add_library(Manyo${MODULENAME}
    TYPE MODULE
    LANGUAGE python
    OUTPUT_DIR ${PROJECT_BINARY_DIR}/
    SOURCES ${MODULENAME}.i
)

# Compile definitions
if(OpenMP_FOUND)
    target_compile_definitions(Manyo${MODULENAME} PRIVATE MULTH=${MANYO_MULTH})
endif()

# Include paths
target_include_directories(Manyo${MODULENAME}
    PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}
        ${CMAKE_CURRENT_SOURCE_DIR}/../core
        ${MANYO_NEXUS_PATH}/include
)

# Linking
target_link_libraries(Manyo${MODULENAME}
    PRIVATE
        Manyo
        ${MODULENAME}
        Python::Python
        OpenMP::OpenMP_CXX
        Boost::serialization
        Boost::filesystem
)
target_link_directories(Manyo${MODULENAME}
    PRIVATE
        ${CMAKE_INSTALL_PREFIX}/lib
        ${MANYO_NEXUS_PATH}/lib
)


#
# ========= Install =========
#

# Install library
install(TARGETS ${MODULENAME}
    RUNTIME DESTINATION bin
    LIBRARY DESTINATION ${MANYO_LIB_PATH}
)

install(FILES
    SerialNeutronExchanger.hh
    SerialPythonServerClient.hh
    DESTINATION ${MANYO_ROOT_PATH}/include/manyo/${MODULENAME}
)

# Install Manyo folder for Python
install(TARGETS Manyo${MODULENAME}
    LIBRARY DESTINATION ${MANYO_PATH}/Manyo/${MODULENAME}
)

install(FILES
    ${PROJECT_BINARY_DIR}/${MODULENAME}.py
    __init__.py
    DESTINATION ${MANYO_PATH}/Manyo/${MODULENAME}
)

install(FILES
    sample/SerialClient.py
    DESTINATION ${MANYO_ROOT_PATH}/share/Manyo/sample/${MODULENAME}
)

#
# ========= Executable program =========
#

# Manyo SerialPySrv
add_executable(SerialPythonServer sample/SerialPythonServerMain.cpp)

# set(THREADS_PREFER_PTHREAD_FLAG ON)
# find_package(Threads REQUIRED)

# Include paths
target_include_directories(SerialPythonServer
    PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}
        ${CMAKE_CURRENT_SOURCE_DIR}/../core
        ${MANYO_NEXUS_PATH}/include
)

# Linking
target_link_libraries(SerialPythonServer
    PRIVATE
        ${MODULENAME}
        Manyo
        Python::Python
        OpenMP::OpenMP_CXX
        Boost::serialization
        Boost::filesystem
        Boost::program_options
)

target_link_directories(SerialPythonServer
    PRIVATE
        ${CMAKE_INSTALL_PREFIX}/lib
)

# Install
install(TARGETS SerialPythonServer
    RUNTIME DESTINATION ${MANYO_ROOT_PATH}/bin
)
