cmake_minimum_required (VERSION 3.0.0)

project(MeshIceThermo)

# C/C++ compilers
enable_language (CXX)
option(INCLUDE_CUDA "GPU build in mode"    OFF)
option(INCLUDE_JSON "JSON build in mode"    OFF)

if(INCLUDE_CUDA)
    enable_language(CUDA)
    find_package(CUDA REQUIRED)
    include_directories(${CUDA_INCLUDE_DIRS})
    set(MESH_MACRO -DINCLUDE_CUDA)
endif(INCLUDE_CUDA)

if(INCLUDE_JSON)
    set(JSON_GIT git@github.com:nlohmann/json.git)
    include(FetchContent)
    FetchContent_Declare(json                                   
    GIT_REPOSITORY ${JSON_GIT}                                    
    GIT_TAG origin/develop
    )
    FetchContent_MakeAvailable(json)      
endif(INCLUDE_JSON)     


set(MEMPROC_GIT git@tesla.parallel.ru:Lizzzka007/memory_processing.git)
include(FetchContent)
FetchContent_Declare(memory_processing                                   
GIT_REPOSITORY ${MEMPROC_GIT}                                    
GIT_TAG origin/main
)
FetchContent_MakeAvailable(memory_processing)                              
add_library(memory_processing INTERFACE)
target_compile_definitions(memory_processing INTERFACE INCLUDE_CUDA=${INCLUDE_CUDA})

set(SOURCES_CXX 
    src/mesh.cpp
    src/matvec.cpp
    )
set(HEADERS_CXX 
    include/mesh.hpp
    include/matvec.hpp
    include/defines.hpp
    )

if(INCLUDE_CUDA)
    set(SOURCES_CU 
    src/matvec.cu
    )
    set(HEADERS_CU  
    include/matvec.cuh
    )
endif(INCLUDE_CUDA)

add_library(mesh ${HEADERS_CU} ${SOURCES_CU} ${HEADERS_CXX} ${SOURCES_CXX})
add_definitions(${MESH_MACRO})
target_include_directories(mesh PUBLIC ${memory_processing_SOURCE_DIR}/include)
target_include_directories(mesh PUBLIC ${json_SOURCE_DIR}/include)

if(INCLUDE_JSON)
    target_link_libraries(mesh memproc json)
else(INCLUDE_JSON)
    target_link_libraries(mesh memproc)
endif(INCLUDE_JSON)