go-blockchain/crypto/CMakeLists.txt
Virgil d5070cce15 build(crypto): select randomx sources by architecture
Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-04 22:57:24 +00:00

157 lines
4.4 KiB
CMake

# SPDX-Licence-Identifier: EUPL-1.2
#
# Builds libcryptonote.a from vendored upstream C/C++ sources.
# This is the build-system half of the CGo bridge.
#
cmake_minimum_required(VERSION 3.20)
project(cryptonote C CXX)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
include(CheckCCompilerFlag)
# Include paths: upstream sources + compat stubs
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}/upstream
${CMAKE_CURRENT_SOURCE_DIR}/compat
)
# --- Pure C sources (no dependencies beyond themselves) ---
set(C_SOURCES
upstream/crypto-ops.c
upstream/crypto-ops-data.c
upstream/keccak.c
upstream/hash.c
upstream/random.c
upstream/blake2b-ref.c
upstream/RIPEMD160.c
)
# --- C++ sources (depend on compat layer + Boost headers) ---
# eth_signature.cpp excluded — needs bitcoin-secp256k1, not required for consensus crypto.
# The header (eth_signature.h) is still included for type definitions via crypto-sugar.h.
set(CXX_SOURCES
upstream/crypto.cpp
upstream/crypto-sugar.cpp
upstream/clsag.cpp
upstream/zarcanum.cpp
upstream/range_proofs.cpp
upstream/one_out_of_many_proofs.cpp
upstream/msm.cpp
upstream/RIPEMD160_helper.cpp
bridge.cpp
)
# --- RandomX PoW library ---
set(RANDOMX_SOURCES
randomx/aes_hash.cpp
randomx/argon2_ref.c
randomx/bytecode_machine.cpp
randomx/cpu.cpp
randomx/dataset.cpp
randomx/soft_aes.cpp
randomx/virtual_memory.c
randomx/vm_interpreted.cpp
randomx/allocator.cpp
randomx/instruction.cpp
randomx/randomx.cpp
randomx/superscalar.cpp
randomx/vm_interpreted_light.cpp
randomx/argon2_core.c
randomx/blake2_generator.cpp
randomx/instructions_portable.cpp
randomx/reciprocal.c
randomx/virtual_machine.cpp
randomx/vm_compiled.cpp
randomx/vm_compiled_light.cpp
randomx/blake2/blake2b.c
)
if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(x86_64|amd64|AMD64)$")
list(APPEND RANDOMX_SOURCES
randomx/argon2_ssse3.c
randomx/argon2_avx2.c
randomx/assembly_generator_x86.cpp
randomx/jit_compiler_x86.cpp
randomx/jit_compiler_x86_static.S
)
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64|arm64)$")
list(APPEND RANDOMX_SOURCES
randomx/jit_compiler_a64.cpp
randomx/jit_compiler_a64_static.S
)
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(riscv64|rv64)$")
list(APPEND RANDOMX_SOURCES
randomx/aes_hash_rv64_vector.cpp
randomx/aes_hash_rv64_zvkned.cpp
randomx/cpu_rv64.S
randomx/jit_compiler_rv64.cpp
randomx/jit_compiler_rv64_static.S
randomx/jit_compiler_rv64_vector.cpp
randomx/jit_compiler_rv64_vector_static.S
)
else()
message(FATAL_ERROR "Unsupported RandomX architecture: ${CMAKE_SYSTEM_PROCESSOR}")
endif()
add_library(randomx STATIC ${RANDOMX_SOURCES})
target_include_directories(randomx PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/randomx
)
set_property(TARGET randomx PROPERTY POSITION_INDEPENDENT_CODE ON)
set_property(TARGET randomx PROPERTY CXX_STANDARD 11)
set_property(TARGET randomx PROPERTY CXX_STANDARD_REQUIRED ON)
# Platform-specific flags for RandomX
enable_language(ASM)
if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(x86_64|amd64|AMD64)$")
target_compile_options(randomx PRIVATE -maes)
check_c_compiler_flag(-mssse3 HAVE_SSSE3)
if(HAVE_SSSE3)
set_source_files_properties(randomx/argon2_ssse3.c PROPERTIES COMPILE_FLAGS -mssse3)
endif()
check_c_compiler_flag(-mavx2 HAVE_AVX2)
if(HAVE_AVX2)
set_source_files_properties(randomx/argon2_avx2.c PROPERTIES COMPILE_FLAGS -mavx2)
endif()
endif()
target_compile_options(randomx PRIVATE
-Wno-unused-variable
-Wno-unused-function
-Wno-sign-compare
-Wno-unused-parameter
-Wno-implicit-fallthrough
)
# --- Find system dependencies ---
find_package(OpenSSL REQUIRED)
# --- Static library ---
add_library(cryptonote STATIC ${C_SOURCES} ${CXX_SOURCES})
target_include_directories(cryptonote PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/upstream
${CMAKE_CURRENT_SOURCE_DIR}/compat
${CMAKE_CURRENT_SOURCE_DIR}/randomx
${OPENSSL_INCLUDE_DIR}
)
target_link_libraries(cryptonote PRIVATE
OpenSSL::Crypto
randomx
)
# Suppress warnings from upstream code (we don't modify it)
target_compile_options(cryptonote PRIVATE
-Wno-unused-variable
-Wno-unused-function
-Wno-sign-compare
-Wno-unused-parameter
-Wno-deprecated-declarations
)