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

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CUDA_STANDARD 17)
set(CMAKE_CUDA_STANDARD_REQUIRED ON)
if(NOT DEFINED CMAKE_CUDA_ARCHITECTURES OR CMAKE_CUDA_ARCHITECTURES STREQUAL "")
  set(CMAKE_CUDA_ARCHITECTURES native)
endif()

option(BC3_NATIVE_HOST_OPT "Build host code with -march=native" ON)
option(BC3_FETCH_JSON "Fetch nlohmann_json if not installed" ON)
option(BC3_PTXAS_VERBOSE "Print ptxas register/spill/resource information while compiling CUDA" OFF)
set(BC3_FOUND_CHECK_INTERVAL "16" CACHE STRING "CUDA nonces between found-flag checks; use 1 for lowest stale work, 32/64 for benchmarking")

find_package(CUDAToolkit REQUIRED)
find_package(CURL REQUIRED)

find_package(nlohmann_json 3.11.0 QUIET)
if(NOT nlohmann_json_FOUND)
  if(BC3_FETCH_JSON)
    include(FetchContent)
    FetchContent_Declare(
      nlohmann_json
      URL https://github.com/nlohmann/json/releases/download/v3.11.3/json.tar.xz
    )
    FetchContent_MakeAvailable(nlohmann_json)
  else()
    message(FATAL_ERROR "nlohmann_json not found. Install nlohmann-json3-dev or configure with -DBC3_FETCH_JSON=ON")
  endif()
endif()

add_executable(bc3cuda
  src/main.cpp
  src/rpc.cpp
  src/crypto.cpp
  src/block.cpp
  src/util.cpp
  src/cuda_miner.cu
)

target_include_directories(bc3cuda PRIVATE src)
target_link_libraries(bc3cuda PRIVATE CURL::libcurl nlohmann_json::nlohmann_json CUDA::cudart)

if(BC3_NATIVE_HOST_OPT AND CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
  target_compile_options(bc3cuda PRIVATE $<$<COMPILE_LANGUAGE:CXX>:-O3 -march=native -Wall -Wextra -Wpedantic>)
endif()

set_target_properties(bc3cuda PROPERTIES
  CUDA_SEPARABLE_COMPILATION OFF
)

target_compile_definitions(bc3cuda PRIVATE
  $<$<COMPILE_LANGUAGE:CUDA>:BC3_FOUND_CHECK_INTERVAL=${BC3_FOUND_CHECK_INTERVAL}>
)

target_compile_options(bc3cuda PRIVATE
  $<$<COMPILE_LANGUAGE:CUDA>:-O3 --extra-device-vectorization>
)

if(BC3_PTXAS_VERBOSE)
  target_compile_options(bc3cuda PRIVATE $<$<COMPILE_LANGUAGE:CUDA>:-Xptxas=-v>)
endif()
