cmake_minimum_required(VERSION 3.17)
project(LADEL_suitesparse)

# SuiteSparse config
add_library(suitesparse_config-headers INTERFACE)
target_include_directories(suitesparse_config-headers INTERFACE
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/SuiteSparse_config>)

add_library(suitesparse_config-obj OBJECT
    "SuiteSparse_config/SuiteSparse_config.c")
target_link_libraries(suitesparse_config-obj PUBLIC suitesparse_config-headers)
set_target_properties(suitesparse_config-obj PROPERTIES C_VISIBILITY_PRESET hidden)

# SuiteSparse approximate minimal degree
add_library(amd-headers INTERFACE)
target_include_directories(amd-headers SYSTEM INTERFACE
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/AMD/Include>)
target_link_libraries(amd-headers INTERFACE suitesparse_config-headers)

# Compile as integer version
add_library(amd_c_int-obj OBJECT
    "AMD/Source/amd_info.c"
    "AMD/Source/amd_2.c"
    "AMD/Source/amd_control.c"
    "AMD/Source/amd_1.c"
    "AMD/Source/amd_dump.c"
    "AMD/Source/amd_l1.c"
    "AMD/Source/amd_preprocess.c"
    "AMD/Source/amd_post_tree.c"
    "AMD/Source/amd_postorder.c"
    "AMD/Source/amd_order.c"
    "AMD/Source/amd_l2.c"
    "AMD/Source/amd_valid.c"
    "AMD/Source/amd_aat.c"
    "AMD/Source/amd_defaults.c"
)
target_link_libraries(amd_c_int-obj PUBLIC amd-headers)
target_link_libraries(amd_c_int-obj PUBLIC suitesparse_config-obj)
set_target_properties(amd_c_int-obj PROPERTIES C_VISIBILITY_PRESET hidden)

# Compile as long (or long long) version
add_library(amd_c_long-obj OBJECT
    "AMD/Source/amd_l_control.c"
    "AMD/Source/amd_l_order.c"
    "AMD/Source/amd_l_aat.c"
    "AMD/Source/amd_l_dump.c"
    "AMD/Source/amd_l_postorder.c"
    "AMD/Source/amd_l_preprocess.c"
    "AMD/Source/amd_l_valid.c"
    "AMD/Source/amd_l_defaults.c"
    "AMD/Source/amd_l_info.c"
    "AMD/Source/amd_l_post_tree.c"
)
target_link_libraries(amd_c_long-obj PUBLIC amd-headers)
target_link_libraries(amd_c_long-obj PUBLIC suitesparse_config-obj)
set_target_properties(amd_c_long-obj PROPERTIES C_VISIBILITY_PRESET hidden)

# Link both versions
add_library(ladel_amd STATIC $<TARGET_OBJECTS:amd_c_int-obj>
                             $<TARGET_OBJECTS:amd_c_long-obj>
                             $<TARGET_OBJECTS:suitesparse_config-obj>)
target_link_libraries(ladel_amd INTERFACE amd-headers)
