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

if ((DEFINED MANYO_INSTTYPE) AND (${MANYO_INSTTYPE} MATCHES "N"))
    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 GSL, OpenMP, Boost
find_package(OpenMP)
find_package(GSL REQUIRED)

if (POLICY CMP0167)
    cmake_policy (SET CMP0167 NEW)
endif ()
find_package(Boost 1.66.0 REQUIRED
    COMPONENTS
        filesystem
)

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

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

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

add_library(${UTS_MODULE} SHARED)
target_sources(${UTS_MODULE} PRIVATE
    AdvCorrectionAbsorptionDNA.cc
    AdvDetectorManagerDNA.cc
    AdvEquipmentManagerDNA.cc
    AdvILambdaCorrectionDNA.cc
    AdvMultiScatteringDNA.cc
    AdvNeutronManagerDNA.cc
    AdvNeutronMonitorDNA.cc
    AdvQECalculation.cc
    AdvSliceQE.cc
    AdvSolidAngleCorrectionDNA.cc
    UtsusemiChopCondInfoReaderTrignet.cc
    UtsusemiEventDataConverterDNA.cc
    UtsusemiEventDataConverterDNAWithHSC.cc
    UtsusemiFilterHSChopperDNA.cc
    UtsusemiFilterTrignetConditionDNA.cc
    UtsusemiFilterTrignetDNA.cc
    UtsusemiNeunetEventDecoderDNA.cc
    UtsusemiSetMaskDNA.cc
    UtsusemiDNAILambdaCorrectionUseMonAtSample.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
        GSL::gsl
        Boost::filesystem
        util
        dl
)

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

#
# ========= 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
        GSL::gsl
        Boost::filesystem
        util
        dl
)

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

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

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

install(FILES
    AdvCorrectionAbsorptionDNA.hh
    AdvDetectorManagerDNA.hh
    AdvEquipmentManagerDNA.hh
    AdvILambdaCorrectionDNA.hh
    AdvMultiScatteringDNA.hh
    AdvNeutronManagerDNA.hh
    AdvNeutronMonitorDNA.hh
    AdvQECalculation.hh
    AdvSliceQE.hh
    AdvSolidAngleCorrectionDNA.hh
    UtsusemiChopCondInfoReaderTrignet.hh
    UtsusemiEventDataConverterDNA.hh
    UtsusemiEventDataConverterDNAWithHSC.hh
    UtsusemiFilterHSChopperDNA.hh
    UtsusemiFilterTrignetConditionDNA.hh
    UtsusemiFilterTrignetDNA.hh
    UtsusemiNeunetEventDecoderDNA.hh
    UtsusemiSetMaskDNA.hh
    UtsusemiDNAILambdaCorrectionUseMonAtSample.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/sample.py
    DESTINATION ${MANYO_UTSUSEMI_SMP_PATH}
)
