cmake_minimum_required(VERSION 3.16)
project(bloxminer VERSION 1.1.1 LANGUAGES CXX C)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

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

# Neutral, portable flags (no -march=native/-maes/-mavx2; see portable crypto)
# -fno-strict-aliasing: daemon's emu-intrinsics type-pun via pointer casts (UB); required
# for correct codegen of verus_clhash_portable.cpp at -O2 (GCC 13 miscompiles otherwise)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wno-unused-parameter -Wno-sign-compare -fno-strict-aliasing")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wno-unused-parameter -Wno-sign-compare -fno-strict-aliasing")
set(CMAKE_CXX_FLAGS_RELEASE "-O2")
set(CMAKE_C_FLAGS_RELEASE "-O2")

find_package(Threads REQUIRED)
find_package(OpenSSL REQUIRED)

set(SOURCES
    src/main.cpp
    src/miner.cpp
    src/config_manager.cpp
    src/stratum/stratum_client.cpp
    src/utils/hex_utils.cpp
    src/utils/logger.cpp
    # Portable (scalar) VerusHash crypto - no SIMD/AES required
    src/crypto/haraka_portable.c
    src/crypto/verus_clhash_portable.cpp
    src/crypto/verus_hash.cpp
)

add_executable(bloxminer ${SOURCES})
set_target_properties(bloxminer PROPERTIES
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}"
)

target_include_directories(bloxminer PRIVATE
    ${CMAKE_SOURCE_DIR}/include
    ${CMAKE_SOURCE_DIR}/src/crypto
    ${OPENSSL_INCLUDE_DIR}
)

target_link_libraries(bloxminer PRIVATE
    Threads::Threads
    OpenSSL::SSL
    OpenSSL::Crypto
)

install(TARGETS bloxminer DESTINATION bin)
