cmake_minimum_required(VERSION 3.0)

if(${CMAKE_VERSION} VERSION_GREATER "3.13.0")
    cmake_policy(SET CMP0076 OLD)
endif()

project(suanPan C CXX)

include(CheckLanguage)
check_language(Fortran)
if(CMAKE_Fortran_COMPILER)
    set(FORTRAN_STATUS TRUE)
    enable_language(Fortran)
else()
    set(FORTRAN_STATUS FALSE)
endif()

set(ROOT .)

include(${ROOT}/.config.cmake)

link_directories(${PROJECT_BINARY_DIR}/Libs)

add_executable(${PROJECT_NAME}
        "suanPan.h"
        "suanPan.cpp"
        "Constraint/CMakeLists.txt"
        "Database/CMakeLists.txt"
        "Domain/CMakeLists.txt"
        "Load/CMakeLists.txt"
        "Recorder/CMakeLists.txt"
        "Step/CMakeLists.txt"
        "Toolbox/CMakeLists.txt")

if(CMAKE_CXX_COMPILER_ID MATCHES "GNU") # GNU GCC COMPILER
    target_sources(${PROJECT_NAME} PRIVATE "Resource/suanPan_gcc.rc")
elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") # MSVC COMPILER
    target_sources(${PROJECT_NAME} PRIVATE "Resource/suanPan.rc")
endif()

add_subdirectory(Converger)
add_subdirectory(Element)
add_subdirectory(Patch)
add_subdirectory(Material)
add_subdirectory(Section)
add_subdirectory(Solver)

add_subdirectory(Constraint)
add_subdirectory(Database)
add_subdirectory(Domain)
add_subdirectory(Load)
add_subdirectory(Recorder)
add_subdirectory(Step)
add_subdirectory(Toolbox)

if(FORTRAN_STATUS)
    add_subdirectory(Toolbox/amd-src)
    add_subdirectory(Toolbox/lapack-ext)
    add_subdirectory(Toolbox/arpack-src)
    add_subdirectory(Toolbox/mumps-src)
    add_subdirectory(Toolbox/feast-src)
endif()

add_subdirectory(Toolbox/superlu-src)

target_link_libraries(${PROJECT_NAME}
    Converger
    Element
    Patch
    Material
    Section
    Solver
    superlu)

set_property(TARGET ${PROJECT_NAME} PROPERTY ENABLE_EXPORTS 1)
	
if((NOT FORTRAN_STATUS) AND (COMPILER_IDENTIFIER MATCHES "vs"))
    target_link_libraries(${PROJECT_NAME} libamd libarpack libspmm libmumps)
else()
    target_link_libraries(${PROJECT_NAME} amd arpack spmm mumps)
endif()

if(COMPILER_IDENTIFIER MATCHES "gcc-linux")
    set(OBLAS openblas)
elseif(COMPILER_IDENTIFIER MATCHES "gcc-win")
    set(OBLAS openblas)
elseif(COMPILER_IDENTIFIER MATCHES "vs")
    set(OBLAS libopenblas)
endif()

target_link_libraries(${PROJECT_NAME} ${OBLAS})

if(BUILD_DLL_EXAMPLE)
    add_subdirectory(Developer/Element)
    add_subdirectory(Developer/Material)
    add_subdirectory(Developer/Section)
    add_subdirectory(Developer/Modifier)
    add_subdirectory(Developer/ModuleBundle)
    add_dependencies(ElementExample ${PROJECT_NAME})
    add_dependencies(MaterialExample ${PROJECT_NAME})
    add_dependencies(SectionExample ${PROJECT_NAME})
    add_dependencies(ModifierExample ${PROJECT_NAME})
    add_dependencies(ModuleBundle ${PROJECT_NAME})
endif()