dncurrency/CMakeLists.txt
Piotr Wójcik 6281105438
Use 'magic_enum' library for static reflection for enums (#4065)
This PR introduces magic_enum (https://github.com/Neargye/magic_enum) library as a submodule, which ergonomically handles enum to string conversions without requiring any adaptations to existing enum definitions.
2023-01-26 14:18:25 +00:00

897 lines
26 KiB
CMake

cmake_minimum_required(VERSION 3.4)
if(CMAKE_VERSION VERSION_GREATER 3.12 OR CMAKE_VERSION VERSION_EQUAL 3.12)
# find_package uses <PACKAGENAME>_ROOT variables
cmake_policy(SET CMP0074 NEW)
endif()
if(CMAKE_VERSION VERSION_GREATER 3.13 OR CMAKE_VERSION VERSION_EQUAL 3.13)
# option honors normal variables
cmake_policy(SET CMP0077 NEW)
endif()
# OSX compatibility needs to be set before project is declared
set(CMAKE_OSX_DEPLOYMENT_TARGET
10.15
CACHE STRING "")
project(nano-node)
# Get the latest abbreviated commit hash of the working branch
execute_process(
COMMAND git log -1 --format=%h
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE GIT_COMMIT_HASH
OUTPUT_STRIP_TRAILING_WHITESPACE)
option(CI_BUILD false)
option(CI_VERSION_PRE_RELEASE false)
set(COVERAGE
OFF
CACHE BOOL "Code Coverage Targets")
if(COVERAGE)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/Modules")
include(CoverageTest)
endif()
set(CI_TEST
0
CACHE STRING "")
if(MSVC)
add_definitions(/MP)
endif()
set(CPACK_PACKAGE_VERSION_MAJOR "25")
set(CPACK_PACKAGE_VERSION_MINOR "0")
set(CPACK_PACKAGE_VERSION_PATCH "0")
if(CI_BUILD AND CI_VERSION_PRE_RELEASE)
set(CPACK_PACKAGE_VERSION_PRE_RELEASE "${CI_VERSION_PRE_RELEASE}")
else()
set(CPACK_PACKAGE_VERSION_PRE_RELEASE "99")
endif()
set(CPACK_PACKAGE_VENDOR "Nano Currency")
if(CI_BUILD)
set(TAG_VERSION_STRING "$ENV{CI_TAG}")
else()
set(TAG_VERSION_STRING
"V${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}")
endif()
if(APPLE)
set(CMAKE_INSTALL_RPATH "@executable_path/../Frameworks")
else()
set(CMAKE_INSTALL_RPATH "$ORIGIN/../lib")
endif()
# Create all libraries and executables in the root binary dir
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
set(NANO_GUI
OFF
CACHE BOOL "")
set(NANO_TEST
OFF
CACHE BOOL "")
set(NANO_SECURE_RPC
OFF
CACHE BOOL "")
set(NANO_WARN_TO_ERR
OFF
CACHE BOOL "")
set(NANO_TIMED_LOCKS
0
CACHE STRING "")
set(NANO_TIMED_LOCKS_IGNORE_BLOCKED
OFF
CACHE BOOL "")
set(NANO_TIMED_LOCKS_FILTER
""
CACHE
STRING
"Selects which mutex should be the only one to have stacktraces generated, empty string means report on all"
)
set_property(
CACHE NANO_TIMED_LOCKS_FILTER
PROPERTY STRINGS
active
block_arrival
block_processor
block_uniquer
confirmation_height_processor
dropped_elections,
election_winner_details
gap_cache
network_filter
observer_set
request_aggregator
state_block_signature_verification
telemetry
vote_generator
vote_processor
vote_uniquer
votes_cache
work_pool)
set(NANO_FUZZER_TEST
OFF
CACHE BOOL "")
set(NANO_ASIO_HANDLER_TRACKING
0
CACHE STRING "")
set(NANO_ROCKSDB_TOOLS
OFF
CACHE BOOL "")
if(${NANO_TIMED_LOCKS} GREATER 0)
add_definitions(-DNANO_TIMED_LOCKS=${NANO_TIMED_LOCKS})
add_definitions(-DNANO_TIMED_LOCKS_FILTER=${NANO_TIMED_LOCKS_FILTER})
if(NANO_TIMED_LOCKS_IGNORE_BLOCKED)
add_definitions(-DNANO_TIMED_LOCKS_IGNORE_BLOCKED)
endif()
endif()
if(${NANO_ASIO_HANDLER_TRACKING} GREATER 0)
add_definitions(-DNANO_ASIO_HANDLER_TRACKING=${NANO_ASIO_HANDLER_TRACKING}
-DBOOST_ASIO_ENABLE_HANDLER_TRACKING)
endif()
option(NANO_ASAN_INT "Enable ASan+UBSan+Integer overflow" OFF)
option(NANO_ASAN "Enable ASan+UBSan" OFF)
option(NANO_TSAN "Enable TSan" OFF)
option(NANO_SIMD_OPTIMIZATIONS
"Enable CPU-specific SIMD optimizations (SSE/AVX or NEON, e.g.)" OFF)
option(
ENABLE_AES
"Enable AES optimizations (enabled by default with NANO_SIMD_OPTIMIZATIONS, set OFF to disable"
ON)
option(ENABLE_AVX2 "Enable AVX2 optimizations" OFF)
set(ACTIVE_NETWORK
nano_live_network
CACHE STRING "Selects which network parameters are used")
set_property(
CACHE ACTIVE_NETWORK PROPERTY STRINGS nano_dev_network nano_beta_network
nano_live_network nano_test_network)
set(CPACK_PACKAGE_NAME
"nano-node"
CACHE STRING "" FORCE)
set(CPACK_NSIS_PACKAGE_NAME
"Nano"
CACHE STRING "" FORCE)
set(CPACK_PACKAGE_INSTALL_DIRECTORY
"nanocurrency"
CACHE STRING "" FORCE)
set(NANO_SERVICE "nanocurrency.service")
set(NANO_PREFIX "")
if("${ACTIVE_NETWORK}" MATCHES "nano_beta_network")
project("nano-node-beta")
set(CPACK_PACKAGE_NAME
"nano-node-beta"
CACHE STRING "" FORCE)
set(CPACK_NSIS_PACKAGE_NAME
"Nano-Beta"
CACHE STRING "" FORCE)
set(CPACK_PACKAGE_INSTALL_DIRECTORY
"nanocurrency-beta"
CACHE STRING "" FORCE)
set(NANO_SERVICE "nanocurrency-beta.service")
set(NANO_PREFIX "Beta")
elseif("${ACTIVE_NETWORK}" MATCHES "nano_test_network")
project("nano-node-test")
set(CPACK_PACKAGE_NAME
"nano-node-test"
CACHE STRING "" FORCE)
set(CPACK_NSIS_PACKAGE_NAME
"Nano-Test"
CACHE STRING "" FORCE)
set(CPACK_PACKAGE_INSTALL_DIRECTORY
"nanocurrency-test"
CACHE STRING "" FORCE)
set(NANO_SERVICE "nanocurrency-test.service")
set(NANO_PREFIX "Test")
endif()
set(NANO_OSX_PACKAGE_NAME
${CPACK_NSIS_PACKAGE_NAME}
CACHE STRING "" FORCE)
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE
"Release"
CACHE
STRING
"Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
FORCE)
endif()
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
set(USING_ASAN (NANO_ASAN OR RAIBLOCKS_ASAN))
set(USING_ASAN_INT (NANO_ASAN_INT OR RAIBLOCKS_ASAN_INT))
set(USING_TSAN (NANO_TSAN OR RAIBLOCKS_TSAN))
find_package(Threads)
if(WIN32)
find_library(PSAPI Psapi)
add_definitions(-D_WIN32_WINNT=0x0600 -DWINVER=0x0600 -DMINIUPNP_STATICLIB
-D_CRT_SECURE_NO_WARNINGS /EHsc)
if(${USING_TSAN}
OR ${USING_ASAN}
OR ${USING_ASAN_INT})
message(WARNING "Cannot use TSAN or ASAN on Windows, sanitizers ignored")
endif()
else()
if(NANO_WARN_TO_ERR)
add_compile_options(-Werror -Wno-deprecated-declarations)
endif()
if((${USING_TSAN} AND ${USING_ASAN}) OR (${USING_TSAN} AND ${USING_ASAN_INT}))
message(WARNING "Cannot use TSAN/ASAN together, defaulting to ASAN")
endif()
if(${USING_ASAN} OR ${USING_ASAN_INT})
if(${USING_ASAN_INT})
add_compile_options(-fsanitize=address,undefined,integer)
else()
add_compile_options(-fsanitize=address,undefined)
endif()
add_definitions(-DED25519_NO_INLINE_ASM)
add_definitions(-DROCKSDB_UBSAN_RUN)
elseif(${USING_TSAN})
add_compile_options(-fsanitize=thread)
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(
"-fsanitize-blacklist=${PROJECT_SOURCE_DIR}/tsan_clang_blacklist")
endif()
add_definitions(-DED25519_NO_INLINE_ASM)
endif()
if(NANO_FUZZER_TEST)
add_compile_options(-fsanitize=fuzzer-no-link -fno-omit-frame-pointer)
add_definitions(-DNANO_FUZZER_TEST)
endif()
if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(i.86|x86(_64)?)$")
if(NANO_SIMD_OPTIMIZATIONS
OR RAIBLOCKS_SIMD_OPTIMIZATIONS
OR ENABLE_AVX2)
add_compile_options(-msse4)
if(ENABLE_AES)
add_compile_options(-maes)
else()
add_definitions(-DCRYPTOPP_DISABLE_AESNI)
endif()
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
add_compile_options(-msse2)
add_definitions(-DCRYPTOPP_DISABLE_SSSE3 -DCRYPTOPP_DISABLE_AESNI)
endif()
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64")
if(NANO_SIMD_OPTIMIZATIONS OR RAIBLOCKS_SIMD_OPTIMIZATIONS)
add_compile_options(-march=armv8-a+crc+crypto)
else()
add_compile_options(-march=armv8-a)
add_definitions(-DCRYPTOPP_DISABLE_ASM)
endif()
endif()
endif()
if(ENABLE_AVX2)
if(WIN32)
add_definitions(/arch:AVX2)
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(i.86|x86(_64)?)$")
add_compile_options(-mavx2 -mbmi -mbmi2 -maes)
endif()
if(PERMUTE_WITH_GATHER)
add_definitions(-DPERMUTE_WITH_GATHER)
elseif(PERMUTE_WITH_SHUFFLES)
add_definitions(-DPERMUTE_WITH_SHUFFLES)
endif()
endif()
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
# set(CMAKE_C_EXTENSIONS OFF)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# set(CMAKE_CXX_EXTENSIONS OFF)
if(WIN32)
set(PLATFORM_LINK_FLAGS "")
add_definitions(/bigobj)
else()
if(APPLE)
set(PLATFORM_LINK_FLAGS "-framework Foundation -framework OpenCL")
else()
set(PLATFORM_LINK_FLAGS "-static-libgcc -static-libstdc++")
endif()
if(${USING_ASAN_INT})
set(PLATFORM_LINK_FLAGS
"${PLATFORM_LINK_FLAGS} -fsanitize=address,undefined,integer")
elseif(${USING_ASAN})
set(PLATFORM_LINK_FLAGS
"${PLATFORM_LINK_FLAGS} -fsanitize=address,undefined")
elseif(${USING_TSAN})
set(PLATFORM_LINK_FLAGS "${PLATFORM_LINK_FLAGS} -fsanitize=thread")
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
set(PLATFORM_LINK_FLAGS
"${PLATFORM_LINK_FLAGS} -fsanitize-blacklist=${PROJECT_SOURCE_DIR}/tsan_clang_blacklist"
)
endif()
endif()
if(NANO_FUZZER_TEST)
set(PLATFORM_LINK_FLAGS "${PLATFORM_LINK_FLAGS} -fsanitize=fuzzer-no-link")
endif()
endif()
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${PLATFORM_LINK_FLAGS}")
if(NANO_SECURE_RPC OR RAIBLOCKS_SECURE_RPC)
find_package(OpenSSL 1.0 REQUIRED)
include_directories(${OPENSSL_INCLUDE_DIR})
add_definitions(-DNANO_SECURE_RPC)
message("OpenSSL include dir: ${OPENSSL_INCLUDE_DIR}")
message("OpenSSL libraries: ${OPENSSL_LIBRARIES}")
message("OpenSSL lib: ${OPENSSL_SSL_LIBRARY}")
message("Crypto lib: ${OPENSSL_CRYPTO_LIBRARY}")
else()
set(OPENSSL_LIBRARIES "")
endif()
include_directories(${CMAKE_SOURCE_DIR})
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/Modules")
set(Boost_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/submodules/boost/libs/config/include)
set(BOOST_MODULE_LIBS
algorithm
align
any
array
asio
assert
atomic
beast
bind
chrono
circular_buffer
concept_check
config
container
container_hash
context
conversion
core
coroutine
date_time
describe
detail
dll
dynamic_bitset
endian
exception
filesystem
foreach
format
function
function_types
functional
fusion
integer
interprocess
intrusive
io
iostreams
iterator
lexical_cast
property_tree
log
logic
math
move
mp11
mpl
multi_index
multiprecision
numeric/conversion
optional
parameter
phoenix
pool
predef
preprocessor
process
program_options
proto
random
range
ratio
rational
regex
serialization
smart_ptr
spirit
stacktrace
static_assert
static_string
system
thread
throw_exception
tokenizer
tuple
type_index
type_traits
typeof
unordered
utility
variant
variant2
winapi)
add_definitions(-DBOOST_ALL_NO_LIB) # Disable automatic boost linking
foreach(lib IN LISTS BOOST_MODULE_LIBS)
add_subdirectory(submodules/boost/libs/${lib} EXCLUDE_FROM_ALL)
endforeach()
include_directories(${BOOST_LIBRARY_INCLUDES})
add_library(Boost::stacktrace ALIAS boost_stacktrace_basic)
add_definitions(-DBOOST_STACKTRACE_GNU_SOURCE_NOT_REQUIRED)
# Workaround for GitHub builders which do not appear to have the Windows Message
# Compiler mc.exe
add_definitions(-DBOOST_LOG_WITHOUT_EVENT_LOG)
# Workaround for missing reference errata in the boost property_tree module
target_link_libraries(boost_property_tree INTERFACE Boost::any)
target_link_libraries(boost_property_tree INTERFACE Boost::format)
target_link_libraries(boost_property_tree INTERFACE Boost::multi_index)
# diskhash
if(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows")
add_library(diskhash STATIC
${CMAKE_SOURCE_DIR}/submodules/diskhash/src/diskhash.c)
include_directories(submodules/diskhash/src)
endif()
# RocksDB
include_directories(submodules/rocksdb/include)
set(USE_RTTI
ON
CACHE BOOL "")
set(WITH_GFLAGS
OFF
CACHE BOOL "")
set(WITH_TESTS
OFF
CACHE BOOL "")
set(WITH_BENCHMARK_TOOLS
OFF
CACHE BOOL "")
set(ROCKSDB_BUILD_SHARED
OFF
CACHE BOOL "")
set(WITH_CORE_TOOLS
${NANO_ROCKSDB_TOOLS}
CACHE BOOL "" FORCE)
set(WITH_TOOLS
${NANO_ROCKSDB_TOOLS}
CACHE BOOL "" FORCE)
if(ENABLE_AVX2)
set(PORTABLE
OFF
CACHE BOOL "" FORCE)
else()
set(PORTABLE
ON
CACHE BOOL "" FORCE)
endif()
set(FAIL_ON_WARNINGS
OFF
CACHE BOOL "") # Ignore unreachable code warning in merging_iterator.cc
# RocksDB v7.8.3 on Windows
# https://github.com/facebook/rocksdb/issues/11072
add_subdirectory(submodules/rocksdb EXCLUDE_FROM_ALL)
include_directories(cpptoml/include)
# magic_enum
include_directories(submodules/magic_enum/include)
add_subdirectory(crypto/ed25519-donna)
add_subdirectory(nano/ipc_flatbuffers_lib)
add_subdirectory(nano/ipc_flatbuffers_test)
set(UPNPC_BUILD_SHARED
OFF
CACHE BOOL "")
add_subdirectory(submodules/miniupnp/miniupnpc EXCLUDE_FROM_ALL)
set(BUILD_SHARED
OFF
CACHE BOOL "")
set(BUILD_TESTING
OFF
CACHE BOOL "")
set(USE_INTERMEDIATE_OBJECTS_TARGET
OFF
CACHE BOOL "")
set(CRYPTOPP_EXTRA "")
if(WIN32)
add_definitions(-DCRYPTOPP_DISABLE_ASM -DCRYPTOPP_DISABLE_SSSE3
-DCRYPTOPP_DISABLE_AESNI)
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64"
AND (NANO_SIMD_OPTIMIZATIONS OR RAIBLOCKS_SIMD_OPTIMIZATIONS))
set(CRYPTOPP_EXTRA
submodules/cryptopp/crc_simd.cpp submodules/cryptopp/gcm_simd.cpp
submodules/cryptopp/gf2n_simd.cpp submodules/cryptopp/neon_simd.cpp)
add_definitions(-DCRYPTOPP_NO_CPU_FEATURE_PROBES)
endif()
# Some Clang cannot handle mixed asm with positional arguments, where the body
# is Intel style with no prefix and the templates are AT&T style. See:
# submodules/cryptopp/config.h Also see
# https://bugs.llvm.org/show_bug.cgi?id=39895
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_definitions(-DCRYPTOPP_DISABLE_MIXED_ASM -DCRYPTOPP_DISABLE_ASM)
message(
"CryptoPP with disabled ASM for ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}"
)
endif()
add_definitions(-DCRYPTOPP_DISABLE_SHANI)
# Fix failing builds after commit
# https://github.com/weidai11/cryptopp/commit/df9fa62205f2d341e2b1b26595a3a1b6377c60c5
add_definitions(-DCRYPTOPP_DISABLE_CLMUL)
set(CRYPTOPP_LIBRARY cryptopp)
add_library(
cryptopp
submodules/cryptopp/algparam.cpp
submodules/cryptopp/allocate.cpp
submodules/cryptopp/asn.cpp
submodules/cryptopp/basecode.cpp
submodules/cryptopp/cpu.cpp
submodules/cryptopp/cryptlib.cpp
submodules/cryptopp/default.cpp
submodules/cryptopp/des.cpp
submodules/cryptopp/dessp.cpp
submodules/cryptopp/dll.cpp
submodules/cryptopp/ec2n.cpp
submodules/cryptopp/ecp.cpp
submodules/cryptopp/filters.cpp
submodules/cryptopp/fips140.cpp
submodules/cryptopp/gcm.cpp
submodules/cryptopp/gf2n.cpp
submodules/cryptopp/gfpcrypt.cpp
submodules/cryptopp/hex.cpp
submodules/cryptopp/hmac.cpp
submodules/cryptopp/hrtimer.cpp
submodules/cryptopp/integer.cpp
submodules/cryptopp/iterhash.cpp
submodules/cryptopp/misc.cpp
submodules/cryptopp/modes.cpp
submodules/cryptopp/mqueue.cpp
submodules/cryptopp/nbtheory.cpp
submodules/cryptopp/oaep.cpp
submodules/cryptopp/osrng.cpp
submodules/cryptopp/pubkey.cpp
submodules/cryptopp/queue.cpp
submodules/cryptopp/randpool.cpp
submodules/cryptopp/rdtables.cpp
submodules/cryptopp/rijndael.cpp
submodules/cryptopp/rijndael_simd.cpp
submodules/cryptopp/rng.cpp
submodules/cryptopp/sha.cpp
submodules/cryptopp/sha_simd.cpp
submodules/cryptopp/simple.cpp
submodules/cryptopp/sse_simd.cpp
${CRYPTOPP_EXTRA})
if(WIN32 OR CMAKE_SYSTEM_PROCESSOR MATCHES "^(i.86|x86(_64)?)$")
set(ARGON_CORE submodules/phc-winner-argon2/src/opt.c)
else()
set(ARGON_CORE submodules/phc-winner-argon2/src/ref.c)
endif()
add_library(
argon2
submodules/phc-winner-argon2/src/argon2.c
submodules/phc-winner-argon2/include/argon2.h
submodules/phc-winner-argon2/src/core.c
submodules/phc-winner-argon2/src/thread.c
submodules/phc-winner-argon2/src/encoding.c
${ARGON_CORE})
target_include_directories(argon2 PUBLIC submodules/phc-winner-argon2/include)
target_include_directories(argon2 PUBLIC submodules/phc-winner-argon2/src)
target_include_directories(argon2 PUBLIC crypto/blake2)
add_library(
lmdb
submodules/lmdb/libraries/liblmdb/lmdb.h
submodules/lmdb/libraries/liblmdb/mdb.c
submodules/lmdb/libraries/liblmdb/midl.c)
if(WIN32)
target_link_libraries(lmdb ntdll)
endif()
if(WIN32)
set(BLAKE2_IMPLEMENTATION "crypto/blake2/blake2b.c")
else()
if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(i.86|x86(_64)?)$")
set(BLAKE2_IMPLEMENTATION "crypto/blake2/blake2b.c")
else()
set(BLAKE2_IMPLEMENTATION "crypto/blake2/blake2b-ref.c")
endif()
endif()
add_library(blake2 crypto/blake2/blake2-config.h crypto/blake2/blake2-impl.h
crypto/blake2/blake2.h ${BLAKE2_IMPLEMENTATION})
target_compile_definitions(blake2 PRIVATE -D__SSE2__)
add_subdirectory(nano/crypto_lib)
add_subdirectory(nano/secure)
add_subdirectory(nano/lib)
add_subdirectory(nano/node)
add_subdirectory(nano/nano_node)
add_subdirectory(nano/rpc)
add_subdirectory(nano/nano_rpc)
if(NANO_FUZZER_TEST)
if(NOT WIN32)
add_subdirectory(nano/fuzzer_test)
else()
message(WARNING "Fuzzing is not supported on Windows")
endif()
endif()
if(NANO_TEST OR RAIBLOCKS_TEST)
if(WIN32)
if(MSVC_VERSION)
if(MSVC_VERSION GREATER_EQUAL 1910)
add_definitions(-DGTEST_LANG_CXX11=1)
add_definitions(-DGTEST_HAS_TR1_TUPLE=0)
endif()
endif()
set(gtest_force_shared_crt ON)
else()
set(gtest_force_shared_crt OFF)
endif()
add_subdirectory(nano/load_test)
# FIXME: This fixes googletest GOOGLETEST_VERSION requirement
set(GOOGLETEST_VERSION 1.11.0)
add_subdirectory(submodules/gtest/googletest)
# FIXME: This fixes gtest include directories without modifying gtest's
# CMakeLists.txt. Ideally we should use GTest::GTest and GTest::Main as
# dependencies but it requires building gtest differently
set_target_properties(
gtest PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
"${CMAKE_SOURCE_DIR}/submodules/gtest/googletest/include")
add_subdirectory(nano/test_common)
add_subdirectory(nano/core_test)
add_subdirectory(nano/rpc_test)
add_subdirectory(nano/slow_test)
add_custom_target(
build_tests
COMMAND echo "BATCH BUILDING TESTS"
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
DEPENDS core_test load_test rpc_test nano_node nano_rpc)
add_custom_target(
run_tests
COMMAND ${PROJECT_SOURCE_DIR}/ci/test.sh ${CMAKE_BINARY_DIR}
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
DEPENDS build_tests)
endif()
if(NANO_TEST OR RAIBLOCKS_TEST)
if(NANO_GUI OR RAIBLOCKS_GUI)
add_custom_target(
quick_tests
COMMAND echo "BATCH QUICK TESTS"
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
DEPENDS core_test rpc_test qt_test)
else()
add_custom_target(
quick_tests
COMMAND echo "BATCH QUICK TESTS -- qt_test is disabled"
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
DEPENDS core_test rpc_test)
endif()
endif()
if(NANO_GUI OR RAIBLOCKS_GUI)
install(FILES ${PROJECT_BINARY_DIR}/config-node.toml.sample DESTINATION .)
install(FILES ${PROJECT_BINARY_DIR}/config-rpc.toml.sample DESTINATION .)
if(WIN32)
set(PLATFORM_QT_PACKAGES WinExtras)
else()
set(PLATFORM_QT_PACKAGES)
endif()
find_package(Qt5 COMPONENTS Core Gui Widgets Test ${PLATFORM_QT_PACKAGES})
add_library(qt nano/qt/qt.cpp nano/qt/qt.hpp)
include_directories(${CMAKE_SOURCE_DIR}/submodules)
include_directories(${CMAKE_SOURCE_DIR}/submodules/cpptoml/include)
target_link_libraries(
qt
node
secure
nano_lib
libminiupnpc-static
Qt5::Gui
Qt5::Widgets)
target_compile_definitions(
qt PRIVATE -DTAG_VERSION_STRING=${TAG_VERSION_STRING}
-DGIT_COMMIT_HASH=${GIT_COMMIT_HASH})
if(WIN32)
set(PLATFORM_GUI_TARGET_PROPERTIES WIN32)
else()
set(PLATFORM_GUI_TARGET_PROPERTIES "")
endif()
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
set(PLATFORM_WALLET_SOURCE nano/nano_wallet/plat/default/icon.cpp)
elseif(${CMAKE_SYSTEM_NAME} MATCHES "Windows")
set(PLATFORM_WALLET_SOURCE nano/nano_wallet/plat/windows/icon.cpp Nano.rc)
elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
set(PLATFORM_WALLET_SOURCE nano/nano_wallet/plat/default/icon.cpp)
elseif(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
set(PLATFORM_WALLET_SOURCE nano/nano_wallet/plat/default/icon.cpp)
else()
error("Unknown platform: ${CMAKE_SYSTEM_NAME}")
endif()
qt5_add_resources(RES resources.qrc)
add_executable(
nano_wallet ${PLATFORM_GUI_TARGET_PROPERTIES} ${PLATFORM_WALLET_SOURCE}
nano/nano_wallet/entry.cpp nano/nano_wallet/icon.hpp ${RES})
target_link_libraries(nano_wallet rpc node qt)
if(WIN32)
target_link_libraries(nano_wallet Qt5::WinExtras)
# nano_wallet.com executable for Windows console
add_executable(nano_wallet_com nano/nano_wallet/entry_com.cpp)
target_link_libraries(nano_wallet_com node)
set_target_properties(
nano_wallet_com
PROPERTIES COMPILE_FLAGS "-DBOOST_ASIO_HAS_STD_ARRAY=1"
OUTPUT_NAME "nano_wallet"
SUFFIX ".com")
endif()
set_target_properties(
qt nano_wallet PROPERTIES COMPILE_FLAGS
"-DQT_NO_KEYWORDS -DBOOST_ASIO_HAS_STD_ARRAY=1")
if(NANO_TEST OR RAIBLOCKS_TEST)
add_executable(qt_test nano/qt_test/entry.cpp nano/qt_test/qt.cpp)
target_link_libraries(
qt_test
node
secure
test_common
gtest
gtest_main
qt
Qt5::Test)
set_target_properties(
qt_test PROPERTIES COMPILE_FLAGS
"-DQT_NO_KEYWORDS -DBOOST_ASIO_HAS_STD_ARRAY=1")
add_dependencies(build_tests qt_test)
endif()
if(APPLE)
set(CPACK_GENERATOR "DragNDrop")
configure_file(${CMAKE_SOURCE_DIR}/Info.plist.in
${CMAKE_SOURCE_DIR}/Info.plist @ONLY)
install(TARGETS nano_wallet
DESTINATION ${NANO_OSX_PACKAGE_NAME}.app/Contents/MacOS)
install(TARGETS nano_node
DESTINATION ${NANO_OSX_PACKAGE_NAME}.app/Contents/MacOS)
install(TARGETS nano_rpc
DESTINATION ${NANO_OSX_PACKAGE_NAME}.app/Contents/MacOS)
install(FILES Info.plist DESTINATION ${NANO_OSX_PACKAGE_NAME}.app/Contents)
install(FILES qt.conf
DESTINATION ${NANO_OSX_PACKAGE_NAME}.app/Contents/Resources)
install(DIRECTORY ${Qt5_DIR}/../../QtCore.framework
DESTINATION ${NANO_OSX_PACKAGE_NAME}.app/Contents/Frameworks)
install(DIRECTORY ${Qt5_DIR}/../../QtDBus.framework
DESTINATION ${NANO_OSX_PACKAGE_NAME}.app/Contents/Frameworks)
install(DIRECTORY ${Qt5_DIR}/../../QtGui.framework
DESTINATION ${NANO_OSX_PACKAGE_NAME}.app/Contents/Frameworks)
install(DIRECTORY ${Qt5_DIR}/../../QtPrintSupport.framework
DESTINATION ${NANO_OSX_PACKAGE_NAME}.app/Contents/Frameworks)
install(DIRECTORY ${Qt5_DIR}/../../QtTest.framework
DESTINATION ${NANO_OSX_PACKAGE_NAME}.app/Contents/Frameworks)
install(DIRECTORY ${Qt5_DIR}/../../QtWidgets.framework
DESTINATION ${NANO_OSX_PACKAGE_NAME}.app/Contents/Frameworks)
install(FILES "${Qt5_DIR}/../../../plugins/platforms/libqcocoa.dylib"
DESTINATION ${NANO_OSX_PACKAGE_NAME}.app/Contents/PlugIns/platforms)
install(FILES Nano.icns
DESTINATION ${NANO_OSX_PACKAGE_NAME}.app/Contents/Resources)
elseif(WIN32)
if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
set(WIN_REDIST vc_redist.x64.exe)
else()
set(WIN_REDIST vc_redist.x86.exe)
endif()
set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS
"ExecWait '\\\"$INSTDIR\\\\${WIN_REDIST}\\\" /quiet /norestart'
WriteRegDWORD HKLM 'SYSTEM\\\\CurrentControlSet\\\\Services\\\\EventLog\\\\Nano\\\\Nano${NANO_PREFIX}' 'TypesSupported' '0x7'
WriteRegStr HKLM 'SYSTEM\\\\CurrentControlSet\\\\Services\\\\EventLog\\\\Nano\\\\Nano${NANO_PREFIX}' 'EventMessageFile' '$INSTDIR\\\\nano_wallet.exe'"
)
set(CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS
"DeleteRegKey HKLM 'SYSTEM\\\\CurrentControlSet\\\\Services\\\\EventLog\\\\Nano${NANO_PREFIX}'"
)
set(CPACK_NSIS_MUI_ICON ${CMAKE_SOURCE_DIR}/Nano.ico)
set(CPACK_NSIS_DISPLAY_NAME "Nano${NANO_PREFIX}")
set(CPACK_NSIS_URL_INFO_ABOUT "https://nano.org")
set(CPACK_NSIS_CONTACT "info@nano.org")
set(CPACK_NSIS_MENU_LINKS "nano_wallet.exe" "Nano Wallet"
"https://nano.org" "Nano website")
set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON)
get_target_property(Qt5WindowsPlugin Qt5::QWindowsIntegrationPlugin
LOCATION)
get_filename_component(Qt5_bin_DIR ${Qt5_DIR}/../../../bin ABSOLUTE)
install(TARGETS nano_wallet DESTINATION .)
install(TARGETS nano_wallet_com DESTINATION .)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${WIN_REDIST} DESTINATION .)
install(FILES ${Qt5_bin_DIR}/libGLESv2.dll DESTINATION .)
install(FILES ${Qt5_bin_DIR}/Qt5Core.dll DESTINATION .)
install(FILES ${Qt5_bin_DIR}/Qt5Gui.dll DESTINATION .)
install(FILES ${Qt5_bin_DIR}/Qt5Widgets.dll DESTINATION .)
install(FILES ${Qt5_bin_DIR}/Qt5WinExtras.dll DESTINATION .)
install(FILES ${Qt5WindowsPlugin} DESTINATION platforms)
else()
set(CPACK_GENERATOR "TBZ2;DEB")
set(CPACK_DEBIAN_PACKAGE_DEPENDS
"qt5-default | qtbase5-dev, qtchooser, qt5-qmake, qtbase5-dev-tools")
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "russel@nano.org")
install(TARGETS nano_wallet RUNTIME DESTINATION ./bin)
set(DEBIAN_POSTINST postinst.in)
set(DEBIAN_POSTRM postrm.in)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/debian-control/${DEBIAN_POSTINST}
${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/postinst)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/debian-control/${DEBIAN_POSTRM}
${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/postrm)
file(
COPY ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/postinst
${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/postrm
DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/debian-control/.
FILE_PERMISSIONS
OWNER_READ
OWNER_WRITE
OWNER_EXECUTE
GROUP_READ
GROUP_EXECUTE
WORLD_READ
WORLD_EXECUTE)
install(FILES etc/systemd/${NANO_SERVICE} DESTINATION ./extras/systemd/.)
set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA
"${CMAKE_CURRENT_BINARY_DIR}/debian-control/postinst;${CMAKE_CURRENT_BINARY_DIR}/debian-control/postrm"
)
endif()
endif()
if(COVERAGE)
add_subdirectory(coverage)
endif()
set(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_SOURCE_DIR}/LICENSE)
include(CPack)