cmake_minimum_required(VERSION 3.20)
project(bc3_cpu_miner LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

option(BC3_NATIVE_HOST_OPT "Build native host binary with -march=native when not cross-compiling" ON)
option(BC3_FORCE_AVX2 "Compile the hot SHA3-256t path with AVX2 instructions" OFF)
option(BC3_FETCH_JSON "Fetch nlohmann_json if not installed" ON)

find_package(Threads 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
      DOWNLOAD_EXTRACT_TIMESTAMP TRUE
    )
    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(bc3cpu
  src/main.cpp
  src/rpc.cpp
  src/crypto.cpp
  src/block.cpp
  src/util.cpp
  src/cpu_miner.cpp
)

target_include_directories(bc3cpu PRIVATE src)
target_link_libraries(bc3cpu PRIVATE CURL::libcurl nlohmann_json::nlohmann_json Threads::Threads)

if(WIN32)
  target_compile_definitions(bc3cpu PRIVATE NOMINMAX WIN32_LEAN_AND_MEAN)
endif()

if(MSVC)
  target_compile_options(bc3cpu PRIVATE /O2 /W4)
  if(BC3_FORCE_AVX2)
    target_compile_options(bc3cpu PRIVATE /arch:AVX2)
  endif()
else()
  target_compile_options(bc3cpu PRIVATE -O3 -Wall -Wextra -Wpedantic)
  if(BC3_FORCE_AVX2)
    target_compile_options(bc3cpu PRIVATE -mavx2)
  elseif(BC3_NATIVE_HOST_OPT AND NOT CMAKE_CROSSCOMPILING AND CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
    target_compile_options(bc3cpu PRIVATE -march=native)
  endif()
endif()
