# Manyo Library Utsusemi-NVA module
# Set the instrument code for Utsusemi
set(UTS_MODULE NVA)

if ((DEFINED MANYO_INSTTYPE) AND (${MANYO_INSTTYPE} MATCHES "N"))
    message("MANYO_INSTTYPE = New")
    set(UTSUSEMI_INC_FILE_PATH include/manyo/Utsusemi/${UTS_MODULE})
    set(MANYO_UTSUSEMI_INST_PATH ${MANYO_PATH}/Manyo/Utsusemi/${UTS_MODULE})
    set(MANYO_UTSUSEMI_SMP_PATH ${MANYO_ROOT_PATH}/share/Manyo/sample/Utsusemi/${UTS_MODULE})
else()
    set(UTSUSEMI_INC_FILE_PATH include/manyo/${UTS_MODULE})
    set(MANYO_UTSUSEMI_INST_PATH ${MANYO_PATH}/Manyo/${UTS_MODULE})
    set(MANYO_UTSUSEMI_SMP_PATH ${MANYO_ROOT_PATH}/share/Manyo/sample/${UTS_MODULE})
endif()

#
# ========= Dependencies =========
#

# Find OpenMP
find_package(OpenMP)

# Boost find_pacakge is required on macOS
if (POLICY CMP0167)
    cmake_policy (SET CMP0167 NEW)
endif ()
find_package(Boost 1.66.0 REQUIRED
    COMPONENTS
        serialization
)

#
# ========= SWIG =========
#

CMAKE_POLICY(SET CMP0086 NEW)
find_package(SWIG REQUIRED)
include(UseSWIG)

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

add_library(${UTS_MODULE} SHARED)
target_sources(${UTS_MODULE} PRIVATE
    MergNova.cc
)

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

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

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

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

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

target_include_directories(${UTS_MODULE}
    PUBLIC
        ${CMAKE_CURRENT_SOURCE_DIR}
    PRIVATE
        ${MANYO_ROOT_PATH}/include/manyo
        ${MANYO_ROOT_PATH}/include/manyo/MLF
        ${MANYO_ROOT_PATH}/include/manyo/Utsusemi
        ${MANYO_NEXUS_PATH}/include
)

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

target_link_libraries(${UTS_MODULE}
    PRIVATE
        Manyo
        MLF
        Utsusemi
        Python::Python
        OpenMP::OpenMP_CXX
        Boost::serialization
        util
        dl
)

target_link_directories(${UTS_MODULE}
    PRIVATE
        ${MANYO_ROOT_PATH}/${MANYO_LIB_PATH}
)

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

set_property(SOURCE ${UTS_MODULE}.i PROPERTY CPLUSPLUS ON)
set_property(SOURCE ${UTS_MODULE}.i
    PROPERTY INCLUDE_DIRECTORIES
        ${MANYO_ROOT_PATH}/include/manyo
        ${MANYO_ROOT_PATH}/include/manyo/MLF
        ${MANYO_ROOT_PATH}/include/manyo/Utsusemi
        ${MANYO_NEXUS_PATH}/include
)

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

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

# Include paths
target_include_directories(Manyo${UTS_MODULE}
    PUBLIC
        ${CMAKE_CURRENT_SOURCE_DIR}
    PRIVATE
        ${MANYO_ROOT_PATH}/include/manyo
        ${MANYO_ROOT_PATH}/include/manyo/MLF
        ${MANYO_ROOT_PATH}/include/manyo/Utsusemi
        ${MANYO_NEXUS_PATH}/include
)

# Linking
target_link_libraries(Manyo${UTS_MODULE}
    PRIVATE
        ${UTS_MODULE}
        Manyo
        MLF
        Utsusemi
        Python::Python
        OpenMP::OpenMP_CXX
        Boost::serialization
        util
        dl
)

target_link_directories(Manyo${UTS_MODULE}
    PRIVATE
        ${MANYO_ROOT_PATH}/${MANYO_LIB_PATH}
)


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

# Install library
install(TARGETS ${UTS_MODULE}
    RUNTIME DESTINATION bin
    LIBRARY DESTINATION ${MANYO_ROOT_PATH}/${MANYO_LIB_PATH}
)

install(FILES
    MergNova.hh
    DESTINATION ${MANYO_ROOT_PATH}/${UTSUSEMI_INC_FILE_PATH}
)

# Install Manyo folder for Python
install(TARGETS Manyo${UTS_MODULE}
    LIBRARY DESTINATION ${MANYO_UTSUSEMI_INST_PATH}
)

install(FILES
    ${PROJECT_BINARY_DIR}/${UTS_MODULE}.py
    __init__.py
    DESTINATION ${MANYO_UTSUSEMI_INST_PATH}
)

install(FILES
    sample/nva_sample.py
    DESTINATION ${MANYO_UTSUSEMI_SMP_PATH}
)
