# Manyo Library core module

# Find HDF5 library (HDF5_INCLUDE_DIRS can be used)
find_package(HDF5 REQUIRED COMPONENTS CXX)

# Add Manyo core LibMany
add_library(Manyo SHARED)
target_sources(Manyo PRIVATE
    CollectArchitecture.cc
    CppToPython.cc
    DoubleBinArrange.cc
    ElementContainerAppendError.cc
    ElementContainerArray.cc
    ElementContainer.cc
    ElementContainerMatrix.cc
    GaussianEventData.cc
    GslHistogram.cc
    GslRandGenerator.cc
    HeaderBase.cc
    ManipulatorBase.cc
    ManyoDataIO.cc
    Map.cc
    NeutronReadBinaryData.cc
    NeutronVector.cc
    NeutronWriteBinaryData.cc
    NeXusFileIO.cc
    OperatorBase.cc
    PyRunOnCPP.cc
    ReadNeXusFile.cc
    ReadSerializationFile.cc
    ReadTextFile.cc
    ReadWriteTextFile.cc
    SearchInHeader.cc
    SimpleIOVectorToTextFile.cc
    SplitString.cc
    StlMapDouble.cc
    StringTools.cc
    SwapBytes.cc
    TwoDimElementContainer.cc
    UInt4ContainerArray.cc
    UInt4Container.cc
    UInt4ContainerMatrix.cc
    VectorTool.cc
    WriteNeXusFile.cc
    WriteSerializationFile.cc
    WriteTextFile.cc
    )

target_compile_options(Manyo PUBLIC ${CMAKE_CXX_FLAGS} ${MANYO_CXX_FLAGS})
if(OpenMP_FOUND)
    target_compile_definitions(Manyo PUBLIC MULTH=${MANYO_MULTH} PyMaj=${Python_VERSION_MAJOR})
else()
    target_compile_definitions(Manyo PUBLIC PyMaj=${Python_VERSION_MAJOR})
endif()
# target_compile_features(Manyo PUBLIC cxx_std_11)

target_include_directories(Manyo PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ${HDF5_INCLUDE_DIRS} ${MANYO_NEXUS_PATH}/include ${Python_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS})
target_link_directories(Manyo PUBLIC ${MANYO_NEXUS_PATH}/lib)
if (MACOS AND OpenMP_FOUND)
    target_link_libraries(Manyo NeXus GSL::gsl Boost::serialization Boost::filesystem Boost::system Python::Python util dl omp HDF5::HDF5)
else()
    target_link_libraries(Manyo NeXus GSL::gsl Boost::serialization Boost::filesystem Boost::system Python::Python util dl HDF5::HDF5)
endif()
target_link_options(Manyo PRIVATE ${CMAKE_CXX_FLAGS} ${MANYO_CXX_FLAGS})

# message("MANYO_MULTH = " ${MANYO_MULTH})
# message("Sources = " ${manyo_SRC})
# message("PUBLIC_HEADER = " ${manyo_SRC_h})

# Set up swig
set_property(SOURCE Manyo3.i PROPERTY CPLUSPLUS ON)

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


# Install library
install(TARGETS Manyo
        RUNTIME DESTINATION bin
        LIBRARY DESTINATION ${MANYO_LIB_PATH})
install(FILES CollectArchitecture.hh
              CppToPython.hh
              DoubleBinArrange.hh
              ElementContainerAppendError.hh
              ElementContainerArray.hh
              ElementContainer.hh
              ElementContainerMatrix.hh
              GaussianEventData.hh
              GslHistogram.hh
              GslRandGenerator.hh
              Header.hh
              HeaderBase.hh
              ManipulatorBase.hh
              ManyoDataIO.hh
              Map.hh
              NeutronReadBinaryData.hh
              NeutronVector.hh
              NeutronWriteBinaryData.hh
              NeXusFileIO.hh
              OperatorBase.hh
              PyRunOnCPP.hh
              ReadNeXusFile.hh
              ReadSerializationFile.hh
              ReadTextFile.hh
              ReadWriteTextFile.hh
              SearchInHeader.hh
              SimpleIOVectorToTextFile.hh
              SplitString.hh
              StlMapDouble.hh
              StringTools.hh
              SwapBytes.hh
              TwoDimElementContainer.hh
              UInt4ContainerArray.hh
              UInt4Container.hh
              UInt4ContainerMatrix.hh
              VectorTool.hh
              WriteNeXusFile.hh
              WriteSerializationFile.hh
              WriteTextFile.hh
              ManipulatorBase.cc
              Map.cc
              NeutronVector.cc
              NeutronWriteBinaryData.cc
              NeutronReadBinaryData.cc
              OperatorBase.cc
              SwapBytes.cc
        DESTINATION include/manyo)

# Install Manyo folder for Python
install(TARGETS ManyoCore LIBRARY DESTINATION ${MANYO_PATH}/Manyo)
install(FILES ${PROJECT_BINARY_DIR}/Manyo.py DESTINATION ${MANYO_PATH}/Manyo RENAME core.py)
install(FILES __init3__.py DESTINATION ${MANYO_PATH}/Manyo RENAME __init__.py)
install(FILES sample/ManyoCpp sample/CreateNewPackage DESTINATION bin)
install(FILES sample/BinFile.py
              sample/FourOperators.py
              sample/NeXusFile.py
              sample/Test.py
        DESTINATION share/Manyo/sample)
install(DIRECTORY MyPackage DESTINATION share/Manyo/sample/core)
install(FILES Manyo.i
              Manyo3.i
              TemplateDef.i
              VectorDef.i
              PythonCode.i
              DoxySwig.i
        DESTINATION include/manyo)

# add_subdirectory(sample)
