cmake_minimum_required(VERSION 3.14)
project(rr-libstruct VERSION 2.9.2 LANGUAGES CXX)

# Fedora-clean replacement for upstream's static-only, superbuild-oriented
# CMakeLists: build a versioned SHARED library that links the SYSTEM libSBML
# and Fortran LAPACK/BLAS (symbols dgetrf_/dgeqp3_/... live in liblapack).
# f2c.h comes from the system 'f2c' package; clapack.h is the prototype shim.

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

include(GNUInstallDirs)

find_library(SBML_LIB NAMES sbml REQUIRED)
find_library(LAPACK_LIB NAMES lapack REQUIRED)
find_library(BLAS_LIB NAMES blas REQUIRED)

set(sources
    lsMatrix.cpp
    lsLibStructural.cpp
    lsSBMLModel.cpp
    lsUtils.cpp
    lsLibla.cpp
    lsLA.cpp
    lsLUResult.cpp
)

add_library(rr-libstruct SHARED ${sources})
# RoadRunner links the cmake target rr-libstruct::rr-libstruct-static; export
# our shared target under that name so find_package(rr-libstruct CONFIG) works.
set_target_properties(rr-libstruct PROPERTIES
    VERSION 2.9.2
    SOVERSION 2
    EXPORT_NAME rr-libstruct-static
)
# Fedora's libSBML is built WITHOUT the C++ namespace (global symbols), so do
# NOT define LIBSBML_USE_CPP_NAMESPACE — the code must use the global namespace
# to match liblibsbml's exported symbols.
target_include_directories(rr-libstruct
    PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
    PRIVATE ${CLAPACK_INCLUDE_DIR}
)
target_link_libraries(rr-libstruct PRIVATE ${SBML_LIB} ${LAPACK_LIB} ${BLAS_LIB})

set(headers
    lsExporter.h
    lsMatrix.h
    lsLibStructural.h
    lsLA.h
    lsLibla.h
    lsLUResult.h
    lsUtils.h
    lsConstraint.h
    lsFluxbalance.h
    lsObjective.h
    lsSBMLModel.h
)

install(TARGETS rr-libstruct EXPORT rr-libstruct-targets
        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
install(FILES ${headers} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/rr-libstruct)
target_include_directories(rr-libstruct INTERFACE
    $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/rr-libstruct>)

# Export a CONFIG package so RoadRunner's find_package(rr-libstruct CONFIG) and
# the rr-libstruct::rr-libstruct-static target resolve.
install(EXPORT rr-libstruct-targets
    FILE rr-libstruct-targets.cmake
    NAMESPACE rr-libstruct::
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/rr-libstruct)
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/rr-libstruct-config.cmake
"include(CMakeFindDependencyMacro)\ninclude(\"\${CMAKE_CURRENT_LIST_DIR}/rr-libstruct-targets.cmake\")\n")
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/rr-libstruct-config.cmake
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/rr-libstruct)
