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

# Declare the library
add_library(lapack_wrapper SHARED
    lapack_wrapper.cc
    lapack_wrapper++.cc
)

target_include_directories(lapack_wrapper PRIVATE
    ${CMAKE_CURRENT_SOURCE_DIR}
    ${CMAKE_CURRENT_SOURCE_DIR}/code
    ${CMAKE_CURRENT_SOURCE_DIR}/code++
    ${MKL_INCLUDE_PATH}
    ${OPENBLAS_INCLUDE_PATH}
    ${BLAS_INCLUDE_PATH}
    ${LAPACK_INCLUDE_PATH}
    ${ADD_INCLUDE_PATHS}
)

target_compile_definitions(lapack_wrapper PRIVATE lapack_wrapper_LIBRARY)

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

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

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

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

install(FILES
    lapack_wrapper.hh
    lapack_wrapper++.hh
    TicToc.hh
    DESTINATION ${OCPBASIC_LOCAL_PATH}/include/lapack_wrapper
)

install(FILES
    code/banded.hxx
    code/blas.hxx
    code/general_qr.hxx
    code/general.hxx
    code/sparse.hxx
    code/symmetric.hxx
    code/triangular.hxx
    code/tridiagonal.hxx
    code/wrapper.hxx
    DESTINATION ${OCPBASIC_LOCAL_PATH}/include/lapack_wrapper/code
)

install(FILES
    code++/trid.hxx
    code++/band.hxx
    code++/block_trid.hxx
    code++/eig.hxx
    code++/ls.hxx
    code++/lu.hxx
    code++/qn.hxx
    code++/qr.hxx
    code++/svd.hxx
    DESTINATION ${OCPBASIC_LOCAL_PATH}/include/lapack_wrapper/code++
)

if(${LAPACK_WRAPPER_USE_BACKEND} STREQUAL "LAPACK_WRAPPER_USE_MKL")
    install(FILES configHeaders/MKL/lapack_wrapper_config.hh
        DESTINATION ${OCPBASIC_LOCAL_PATH}/include/lapack_wrapper
    )
elseif(${LAPACK_WRAPPER_USE_BACKEND} STREQUAL "LAPACK_WRAPPER_USE_OPENBLAS")
    install(FILES configHeaders/OpenBLAS/lapack_wrapper_config.hh
        DESTINATION ${OCPBASIC_LOCAL_PATH}/include/lapack_wrapper
    )
elseif(${LAPACK_WRAPPER_USE_BACKEND} STREQUAL "LAPACK_WRAPPER_USE_LAPACK")
    install(FILES configHeaders/LAPACK_BLAS/lapack_wrapper_config.hh
        DESTINATION ${OCPBASIC_LOCAL_PATH}/include/lapack_wrapper
    )
endif()

# Versionsinformationen der Bibliothek setzen
set_target_properties(lapack_wrapper PROPERTIES
    VERSION ${PROJECT_VERSION}
    SOVERSION ${MAJOR_VERSION_NUMBER_LAPACK_WRAPPER}
)
