cmake_minimum_required(VERSION 3.24)
project(mesh_connectivity LANGUAGES CXX CUDA)

set(CMAKE_CXX_STANDARD 20)          # gtl requires C++20
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CUDA_STANDARD 20)
set(CMAKE_CUDA_STANDARD_REQUIRED ON)

if(NOT DEFINED CMAKE_CUDA_ARCHITECTURES)
  set(CMAKE_CUDA_ARCHITECTURES native)
endif()

if(NOT CMAKE_BUILD_TYPE)
  set(CMAKE_BUILD_TYPE Release)
endif()

include(FetchContent)
FetchContent_Declare(
  gtl
  GIT_REPOSITORY https://github.com/greg7mdp/gtl.git
  GIT_TAG        v1.2.0
)
FetchContent_MakeAvailable(gtl)

find_package(Threads REQUIRED)

add_executable(mesh_connectivity
  src/main.cpp
  src/cpu_serial.cpp
  src/cpu_parallel.cpp
  src/gpu_sort.cu
)
target_include_directories(mesh_connectivity PRIVATE include)
target_link_libraries(mesh_connectivity PRIVATE gtl Threads::Threads)

# Connection's constexpr constructors call std::array members from device code
target_compile_options(mesh_connectivity PRIVATE
  $<$<COMPILE_LANGUAGE:CUDA>:--expt-relaxed-constexpr>
)
