# Die eingelesene Version in das Projekt setzen
if(DEFINED VERSION_NUMBER_IPBASIC)
    set(PROJECT_VERSION ${VERSION_NUMBER_IPBASIC})
else()
    message(FATAL_ERROR "VERSION_NUMBER_IPBASIC is not defined in versionNumbers.cmake")
endif()

add_library(IPbasic SHARED
    IPbasic_Data.cpp
    IPbasic_KKTSystem.cpp
    IPbasic_ScaledNLP.cpp
    IPbasic_Solver.cpp
    IPbasic_Timings.cpp
    IPbasic.cpp
    Errors/IPbasic_Errors.cpp
    Errors/IPbasic_Myfunction.cpp
    Errors/mycolordef.cpp
    LineSearch/IPbasic_Armijo.cpp
    LineSearch/IPbasic_L1_Penalty.cpp
    LineSearch/IPbasic_FilterLineSearchPlain.cpp
    LineSearch/IPbasic_FilterLineSearchHeuristic.cpp
    LineSearch/IPbasic_FilterLineSearchRestoration.cpp
    LineSearch/IPbasic_RestorationExitCheck.cpp
    LineSearch/IPbasic_RestorationPhase.cpp
    LineSearch/IPbasic_LogBarrier.cpp
    LineSearch/IPbasic_LineSearch.cpp
    LineSearch/IPbasic_LineSearchFunction.cpp
    interfaces/HSL/cppma48.cpp
    interfaces/HSL/cppma57.cpp
)

target_include_directories(IPbasic PRIVATE
    ${CMAKE_CURRENT_SOURCE_DIR}
    ${CMAKE_CURRENT_SOURCE_DIR}/Errors
    ${CMAKE_CURRENT_SOURCE_DIR}/LinSolvers
    ${CMAKE_CURRENT_SOURCE_DIR}/LineSearch
    ${CMAKE_CURRENT_SOURCE_DIR}/interfaces/HSL
    ${PROJECT_SOURCE_DIR}/src/
    ${MKL_INCLUDE_PATH}
    ${OPENBLAS_INCLUDE_PATH}
    ${BLAS_INCLUDE_PATH}
    ${LAPACK_INCLUDE_PATH}
    ${ADD_INCLUDE_PATHS}
)

target_compile_definitions(IPbasic PRIVATE IPbasic_LIBRARY)

target_link_libraries(IPbasic PRIVATE
    lapack_wrapper
)

if(IPBASIC_USE_HSL)
    target_compile_definitions(IPbasic PRIVATE IPBASIC_USE_HSL)
    target_link_libraries(IPbasic PRIVATE ${HSL_PATH_LIBS})
endif()

if(OCPBASIC_ADD_LINKED_LIBS)
    target_link_libraries(IPbasic PRIVATE ${ADD_LINKED_LIBS})
endif()

# Set backend according to selected option
if(${LAPACK_WRAPPER_USE_BACKEND} STREQUAL "LAPACK_WRAPPER_USE_MKL")
    target_compile_definitions(IPbasic PRIVATE LAPACK_WRAPPER_USE_MKL)
    target_include_directories(IPbasic PRIVATE ${MKL_INCLUDE_PATH})
    target_link_libraries(IPbasic PRIVATE ${MKL_PATH_LIBS})
elseif(${LAPACK_WRAPPER_USE_BACKEND} STREQUAL "LAPACK_WRAPPER_USE_OPENBLAS")
    target_compile_definitions(IPbasic PRIVATE LAPACK_WRAPPER_USE_OPENBLAS)
    target_include_directories(IPbasic PRIVATE ${OPENBLAS_INCLUDE_PATH})
    target_link_libraries(IPbasic PRIVATE ${OPENBLAS_PATH_LIBS})
elseif(${LAPACK_WRAPPER_USE_BACKEND} STREQUAL "LAPACK_WRAPPER_USE_LAPACK")
    target_compile_definitions(IPbasic PRIVATE LAPACK_WRAPPER_USE_LAPACK)
    target_include_directories(IPbasic PRIVATE ${LAPACK_INCLUDE_PATH} ${BLAS_INCLUDE_PATH})
    target_link_libraries(IPbasic PRIVATE ${LAPACK_PATH_LIBS} ${BLAS_PATH_LIBS})
endif()

# Installation
install(TARGETS IPbasic
    LIBRARY DESTINATION ${OCPBASIC_LOCAL_PATH}/lib
)

install(FILES
    IPbasic_Data.h
    IPbasic_NLP.h
    IPbasic_KKTSystem.h
    IPbasic_Parameter.h
    IPbasic_ScaledNLP.h
    IPbasic_Solver.h
    IPbasic_Timings.h
    IPbasic.h
    DESTINATION ${OCPBASIC_LOCAL_PATH}/include/IPbasic
)

install(FILES
    Errors/IPbasic_Errors.h
    Errors/IPbasic_Myfunction.h
    Errors/mycolordef.h
    DESTINATION ${OCPBASIC_LOCAL_PATH}/include/IPbasic/Errors
)

install(FILES
    interfaces/HSL/hslsolver.h
    interfaces/HSL/cppma48.h
    interfaces/HSL/cppma57.h
    DESTINATION ${OCPBASIC_LOCAL_PATH}/include/IPbasic/interfaces/HSL
)

install(FILES
    LineSearch/IPbasic_Armijo.h
    LineSearch/IPbasic_L1_Penalty.h
    LineSearch/IPbasic_FilterLineSearchPlain.h
    LineSearch/IPbasic_FilterLineSearchHeuristic.h
    LineSearch/IPbasic_FilterLineSearchRestoration.h
    LineSearch/IPbasic_RestorationExitCheck.h
    LineSearch/IPbasic_RestorationPhase.h
    LineSearch/IPbasic_LogBarrier.h
    LineSearch/IPbasic_LineSearch.h
    LineSearch/IPbasic_LineSearchFunction.h
    DESTINATION ${OCPBASIC_LOCAL_PATH}/include/IPbasic/LineSearch
)

install(FILES
    LinSolvers/IPbasic_LinearSolver_interface.h
    LinSolvers/IPbasic_LinearSolver_MA48.h
    LinSolvers/IPbasic_LinearSolver_MA57.h
    DESTINATION ${OCPBASIC_LOCAL_PATH}/include/IPbasic/LinSolvers
)

if(IPBASIC_USE_HSL)
    install(FILES configHeaders/HSL/IPbasic_Config.h
        DESTINATION ${OCPBASIC_LOCAL_PATH}/include/IPbasic
    )
elseif(${LAPACK_WRAPPER_USE_BACKEND} STREQUAL "LAPACK_WRAPPER_USE_LAPACK")
    install(FILES configHeaders/Default/IPbasic_Config.h
        DESTINATION ${OCPBASIC_LOCAL_PATH}/include/IPbasic
    )
endif()

# Versionsinformationen der Bibliothek setzen
set_target_properties(IPbasic PROPERTIES
    VERSION ${PROJECT_VERSION}
    SOVERSION ${MAJOR_VERSION_NUMBER_IPBASIC}
)
