option(WITH_MMAP "Map large matrices to memory in MULTIDIP instead of duplicating them to memory" ON)

# ------------------------------------------------------------------------------------------------
# MULTIDIP library

add_library(libmultidip
    "multidip_asy.f90"
    "multidip_integ.f90"
    "multidip_io.F90"
    "multidip_levin.f90"
    "multidip_outer.f90"
    "multidip_params.F90"
    "multidip_romberg.f90"
    "multidip_routines.F90"
    "multidip_special.F90"
    "multidip_tests.f90"
    "multidip_util.f90"
)

if(WITH_SCALAPACK OR SCALAPACK_LIBRARIES OR CMAKE_Fortran_FLAGS MATCHES "-q?mkl(-ilp64)?=cluster")
    target_compile_definitions(libmultidip PRIVATE WITH_SCALAPACK=1)
    message(STATUS "MULTIDIP will be built with ScaLAPACK")
endif()

if(WITH_MMAP)
    target_compile_definitions(libmultidip PRIVATE WITH_MMAP=1)
    message(STATUS "MULTIDIP will be built with file memory mapping")
endif()

if(WITH_GSL)
    find_package(GSL)
    if(GSL_FOUND)
        target_compile_definitions(libmultidip PUBLIC WITH_GSL=1)
        message(STATUS "MULTIDIP will be built with GSL")
    endif()
endif()

target_include_directories(libmultidip PUBLIC
    "${CMAKE_CURRENT_BINARY_DIR}/../dipelm/mod"
    "${CMAKE_CURRENT_BINARY_DIR}/../compak/mod"
    "${CMAKE_CURRENT_BINARY_DIR}/../libutil/mod"
    ${GBTOLIB_INCLUDE_DIRS}
)

target_compile_options(libmultidip PUBLIC
    ${OpenMP_Fortran_FLAGS}
)

target_link_libraries(libmultidip
    libdipelm
    libcompak
    libouter
    libutil
    ${SCALAPACK_LIBRARIES}
    ${GBTOLIB_LIBRARIES}
    ${LAPACK_LIBRARIES}
    ${BLAS_LIBRARIES}
    ${GSL_LIBRARIES}
)

set_target_properties(libmultidip PROPERTIES
    OUTPUT_NAME "multidip"
    LINK_FLAGS "${OpenMP_Fortran_FLAGS}"
)

# ------------------------------------------------------------------------------------------------
# MULTIDIP program

add_executable(multidip "multidip.f90")

set_target_properties(multidip PROPERTIES LINK_FLAGS "${OpenMP_Fortran_FLAGS}")

target_link_libraries(multidip libmultidip)

# ------------------------------------------------------------------------------------------------
# Utilities

add_executable(multidip_rabitt_delays  "tools/multidip_rabitt_delays.F90")

add_executable(multidip_smooth_rawdips "tools/multidip_smooth_rawdips.f90")

target_link_libraries(multidip_rabitt_delays libmultidip libutil)

target_compile_options(multidip_smooth_rawdips PUBLIC "${OpenMP_Fortran_FLAGS}")

set_target_properties(multidip_rabitt_delays PROPERTIES LINK_FLAGS "${OpenMP_Fortran_FLAGS}")

set_target_properties(multidip_smooth_rawdips PROPERTIES LINK_FLAGS "${OpenMP_Fortran_FLAGS}")

# ------------------------------------------------------------------------------------------------
# MULTIDIP documentation

if(DOXYGEN_FOUND)
    set(DOXYGEN_IN "${CMAKE_CURRENT_LIST_DIR}/Doxyfile")

    add_custom_target(multidip-doc ALL
        COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_IN}
        WORKING_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}"
        COMMENT "Generating MULTIDIP documentation with Doxygen"
        VERBATIM)

   install(DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/doc/html/"
           DESTINATION "${CMAKE_INSTALL_DOCDIR}/multidip-doxygen")
endif()

# ------------------------------------------------------------------------------------------------
# Installation target

install(TARGETS libmultidip multidip multidip_rabitt_delays multidip_smooth_rawdips
	RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
	ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
	LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}")
install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_Fortran_MODULE_DIRECTORY}/"
        DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/multidip")

