142 lines
4.6 KiB
CMake
142 lines
4.6 KiB
CMake
cmake_minimum_required(VERSION 3.16)
|
|
|
|
project(miniboinc
|
|
VERSION 0.1.0
|
|
LANGUAGES C CXX
|
|
)
|
|
|
|
set(CMAKE_C_STANDARD 23)
|
|
set(CMAKE_C_STANDARD_REQUIRED ON)
|
|
set(CMAKE_C_EXTENSIONS OFF)
|
|
|
|
find_package(Threads REQUIRED)
|
|
include(FetchContent)
|
|
|
|
# OpenSSL
|
|
find_package(OpenSSL QUIET)
|
|
if(NOT OpenSSL_FOUND)
|
|
if(APPLE)
|
|
execute_process(
|
|
COMMAND brew --prefix openssl@3
|
|
OUTPUT_VARIABLE HOMEBREW_OPENSSL_PREFIX
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
ERROR_QUIET
|
|
)
|
|
if(HOMEBREW_OPENSSL_PREFIX)
|
|
set(OPENSSL_ROOT_DIR "${HOMEBREW_OPENSSL_PREFIX}")
|
|
endif()
|
|
endif()
|
|
find_package(OpenSSL REQUIRED)
|
|
endif()
|
|
|
|
# secp256k1 (Bitcoin Core library)
|
|
find_package(PkgConfig QUIET)
|
|
if(PkgConfig_FOUND)
|
|
pkg_check_modules(SECP256K1 QUIET IMPORTED_TARGET libsecp256k1)
|
|
endif()
|
|
|
|
if(NOT SECP256K1_FOUND)
|
|
find_path(SECP256K1_INCLUDE_DIR NAMES secp256k1.h)
|
|
find_library(SECP256K1_LIBRARY NAMES secp256k1)
|
|
if(NOT SECP256K1_INCLUDE_DIR OR NOT SECP256K1_LIBRARY)
|
|
message(FATAL_ERROR "secp256k1 not found. Install with: brew install secp256k1")
|
|
endif()
|
|
endif()
|
|
|
|
# Autolykos2 CPU reference backend (optional)
|
|
option(MINICOIN_ENABLE_AUTOLYKOS2_REF "Enable Autolykos2 CPU reference backend" ON)
|
|
set(MINICOIN_AUTOLYKOS2_REF_AVAILABLE OFF)
|
|
|
|
if(MINICOIN_ENABLE_AUTOLYKOS2_REF)
|
|
FetchContent_Declare(
|
|
autolykos2_ref_src
|
|
GIT_REPOSITORY https://github.com/mhssamadani/Autolykos2_NV_Miner.git
|
|
GIT_TAG main
|
|
GIT_SHALLOW TRUE
|
|
)
|
|
FetchContent_MakeAvailable(autolykos2_ref_src)
|
|
|
|
set(AUTOLYKOS2_REF_BASE ${autolykos2_ref_src_SOURCE_DIR}/secp256k1)
|
|
set(AUTOLYKOS2_REF_SOURCES
|
|
${AUTOLYKOS2_REF_BASE}/src/cpuAutolykos.cc
|
|
${AUTOLYKOS2_REF_BASE}/src/conversion.cc
|
|
${AUTOLYKOS2_REF_BASE}/src/cryptography.cc
|
|
${AUTOLYKOS2_REF_BASE}/src/definitions.cc
|
|
${AUTOLYKOS2_REF_BASE}/src/easylogging++.cc
|
|
${AUTOLYKOS2_REF_BASE}/src/jsmn.c
|
|
${PROJECT_SOURCE_DIR}/src/autolykos2/easylogging_init.cpp
|
|
${PROJECT_SOURCE_DIR}/src/autolykos2/autolykos2_ref_wrapper.cpp
|
|
)
|
|
|
|
add_library(autolykos2_ref STATIC ${AUTOLYKOS2_REF_SOURCES})
|
|
target_include_directories(autolykos2_ref PRIVATE ${AUTOLYKOS2_REF_BASE}/include)
|
|
# Upstream source uses `malloc/free/exit/EXIT_FAILURE` without including
|
|
# stdlib headers in some C++ translation units. AppleClang can compile this,
|
|
# while Linux Clang fails. Force-include stdlib.h for C++ in this vendored lib.
|
|
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU")
|
|
target_compile_options(autolykos2_ref PRIVATE
|
|
$<$<COMPILE_LANGUAGE:CXX>:-include>
|
|
$<$<COMPILE_LANGUAGE:CXX>:stdlib.h>
|
|
)
|
|
elseif(MSVC)
|
|
target_compile_options(autolykos2_ref PRIVATE
|
|
$<$<COMPILE_LANGUAGE:CXX>:/FIstdlib.h>
|
|
)
|
|
endif()
|
|
target_link_libraries(autolykos2_ref PRIVATE
|
|
${CMAKE_THREAD_LIBS_INIT}
|
|
OpenSSL::SSL
|
|
OpenSSL::Crypto
|
|
)
|
|
set(MINICOIN_AUTOLYKOS2_REF_AVAILABLE ON)
|
|
endif()
|
|
|
|
# ---------------------------------------------------------
|
|
# Output directories
|
|
# ---------------------------------------------------------
|
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
|
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
|
|
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
|
|
|
|
foreach(OUTPUTCONFIG DEBUG RELEASE RELWITHDEBINFO MINSIZEREL)
|
|
string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG_UPPER)
|
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG_UPPER} ${CMAKE_BINARY_DIR}/bin)
|
|
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG_UPPER} ${CMAKE_BINARY_DIR}/lib)
|
|
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG_UPPER} ${CMAKE_BINARY_DIR}/lib)
|
|
endforeach()
|
|
|
|
# Node
|
|
file(GLOB_RECURSE NODE_SRC CONFIGURE_DEPENDS src/*.c)
|
|
add_executable(node ${NODE_SRC})
|
|
target_link_libraries(node PRIVATE
|
|
${CMAKE_THREAD_LIBS_INIT}
|
|
OpenSSL::SSL
|
|
OpenSSL::Crypto
|
|
)
|
|
|
|
if(SECP256K1_FOUND)
|
|
target_link_libraries(node PRIVATE PkgConfig::SECP256K1)
|
|
else()
|
|
target_include_directories(node PRIVATE ${SECP256K1_INCLUDE_DIR})
|
|
target_link_libraries(node PRIVATE ${SECP256K1_LIBRARY})
|
|
endif()
|
|
|
|
if(MINICOIN_AUTOLYKOS2_REF_AVAILABLE)
|
|
target_link_libraries(node PRIVATE autolykos2_ref)
|
|
endif()
|
|
|
|
target_include_directories(node PRIVATE
|
|
${PROJECT_SOURCE_DIR}/include
|
|
)
|
|
target_compile_options(node PRIVATE
|
|
-Wall
|
|
-Wextra
|
|
-Wpedantic
|
|
-g
|
|
)
|
|
target_compile_definitions(node PRIVATE
|
|
CHAIN_DATA_DIR="${CMAKE_BINARY_DIR}/chain_data"
|
|
$<$<BOOL:${MINICOIN_AUTOLYKOS2_REF_AVAILABLE}>:MINICOIN_AUTOLYKOS2_REF_AVAILABLE>
|
|
)
|
|
set_target_properties(node PROPERTIES OUTPUT_NAME "minicoin_node")
|