include(GNUInstallDirs)

add_library(pips-ipmpp SHARED
        Base/Observer.C

        Globalization/Filter.cpp
        Globalization/FilterLineSearch.cpp
        Globalization/FilterStrategy.cpp

        Interface/PIPSIPMppInterface.cpp
        Interface/PIPSIPMppCInterface.cpp
        Interface/TerminationStatus.cpp

        Options/PIPSIPMppOptions.C

        Problems/DistributedFactory.cpp
        Problems/DistributedProblem.cpp
        Problems/Problem.cpp
        Problems/StochResourcesMonitor.cpp

        Readers/Distributed/DistributedInputTree.C
        Readers/Distributed/DistributedTree.C
        Readers/Distributed/DistributedTreeCallbacks.C

        Utilities/custom_mpi_types.cpp
        Utilities/pipschecks.C
        Utilities/hash.C
        Utilities/sort.cpp
        Utilities/LibraryLoader.cpp
        )

target_include_directories(pips-ipmpp
    PRIVATE
        Base
        Globalization
        Interface
        Options
        Problems
        Readers
        Utilities
        Readers/Distributed
    )

add_subdirectory(InteriorPointMethod)
add_subdirectory(KKTFormulation)
add_subdirectory(LinearAlgebra)

add_subdirectory(LinearSolvers)

MESSAGE(STATUS "Solver libraries: ${lin_solvers_list}")
foreach(linear_solver ${lin_solvers_list})
    target_link_libraries(pips-ipmpp PRIVATE ${linear_solver})
endforeach(linear_solver)
# in case MA27 or MA57 are not linked in, they may be loaded at runtime, which requires -ldl
target_link_libraries(pips-ipmpp PRIVATE ${CMAKE_DL_LIBS})

add_subdirectory(Preprocessing)

target_link_libraries(pips-ipmpp
        PRIVATE ${MATH_LIBS} OpenMP::OpenMP_CXX
        PUBLIC MPI::MPI_CXX
)
# do not export symbols from static libraries linked into pips-ipmpp, e.g., the ma57 lib
if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
    target_link_options(pips-ipmpp PRIVATE "LINKER:--exclude-libs,ALL")
endif()

set_target_properties(pips-ipmpp PROPERTIES
    INSTALL_RPATH_USE_LINK_PATH TRUE
    VERSION ${PIPSIPMpp_VERSION_MAJOR}.${PIPSIPMpp_VERSION_MINOR}.${PIPSIPMpp_VERSION_PATCH}
    SOVERSION ${PIPSIPMpp_VERSION_MAJOR}.${PIPSIPMpp_VERSION_MINOR}
    )

configure_file(Interface/PIPSIPMppVersion.h.in PIPSIPMppVersion.h @ONLY)
target_include_directories(pips-ipmpp PRIVATE "${CMAKE_CURRENT_BINARY_DIR}")

# install C and C++ API header files
install(
    FILES
        Interface/PIPSIPMppInterface.hpp
        Interface/PIPSIPMppInterface.h
        Interface/TerminationStatus.hpp
        Interface/TerminationStatus.h
        Options/PIPSIPMppOptions.h
        Readers/Distributed/DistributedInputTree.h
        Readers/Distributed/DistributedTree.h
    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
    )

# install the library
install(TARGETS pips-ipmpp
        EXPORT pips-ipmpp-targets
        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
        INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})

# create a pips-ipmpp-targets.cmake in lib/cmake/pips-ipmpp which defines target pips-ipmpp::pips-ipmpp
install(EXPORT pips-ipmpp-targets NAMESPACE pips-ipmpp:: DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/pips-ipmpp)
# install pips-ipmpp-config.cmake
install(FILES pips-ipmpp-config.cmake DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/pips-ipmpp)
