diff --git a/CMakeLists.txt b/CMakeLists.txt index 897791e93d..56beff3d29 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -549,7 +549,6 @@ add_subdirectory(doc) include(cmake/crc32c.cmake) include(cmake/leveldb.cmake) -include(cmake/minisketch.cmake) add_subdirectory(src) include(cmake/tests.cmake) diff --git a/cmake/minisketch.cmake b/cmake/minisketch.cmake deleted file mode 100644 index bb93c80467..0000000000 --- a/cmake/minisketch.cmake +++ /dev/null @@ -1,91 +0,0 @@ -# Copyright (c) 2023-present The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or https://opensource.org/license/mit/. - -# Check for clmul instructions support. -if(MSVC) - set(CLMUL_CXXFLAGS) -else() - set(CLMUL_CXXFLAGS -mpclmul) -endif() -check_cxx_source_compiles_with_flags("${CLMUL_CXXFLAGS}" " - #include - #include - - int main() - { - __m128i a = _mm_cvtsi64_si128((uint64_t)7); - __m128i b = _mm_clmulepi64_si128(a, a, 37); - __m128i c = _mm_srli_epi64(b, 41); - __m128i d = _mm_xor_si128(b, c); - uint64_t e = _mm_cvtsi128_si64(d); - return e == 0; - } - " HAVE_CLMUL -) - -add_library(minisketch_common INTERFACE) -target_compile_definitions(minisketch_common INTERFACE - DISABLE_DEFAULT_FIELDS - ENABLE_FIELD_32 -) -if(MSVC) - target_compile_options(minisketch_common INTERFACE - /wd4060 - /wd4065 - /wd4146 - /wd4244 - /wd4267 - ) -endif() - -if(HAVE_CLMUL) - add_library(minisketch_clmul OBJECT EXCLUDE_FROM_ALL - ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/clmul_1byte.cpp - ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/clmul_2bytes.cpp - ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/clmul_3bytes.cpp - ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/clmul_4bytes.cpp - ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/clmul_5bytes.cpp - ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/clmul_6bytes.cpp - ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/clmul_7bytes.cpp - ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/clmul_8bytes.cpp - ) - target_compile_definitions(minisketch_clmul PUBLIC HAVE_CLMUL) - target_compile_options(minisketch_clmul PRIVATE ${CLMUL_CXXFLAGS}) - target_link_libraries(minisketch_clmul - PRIVATE - core_interface - minisketch_common - ) - set_target_properties(minisketch_clmul PROPERTIES - EXPORT_COMPILE_COMMANDS OFF - ) -endif() - -add_library(minisketch STATIC EXCLUDE_FROM_ALL - ${PROJECT_SOURCE_DIR}/src/minisketch/src/minisketch.cpp - ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/generic_1byte.cpp - ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/generic_2bytes.cpp - ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/generic_3bytes.cpp - ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/generic_4bytes.cpp - ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/generic_5bytes.cpp - ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/generic_6bytes.cpp - ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/generic_7bytes.cpp - ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/generic_8bytes.cpp -) - -target_include_directories(minisketch - PUBLIC - $ -) - -target_link_libraries(minisketch - PRIVATE - core_interface - minisketch_common - $ -) - -set_target_properties(minisketch PROPERTIES - EXPORT_COMPILE_COMMANDS OFF -) diff --git a/cmake/script/CoverageInclude.cmake.in b/cmake/script/CoverageInclude.cmake.in index 59bf5e3af2..928c19953d 100644 --- a/cmake/script/CoverageInclude.cmake.in +++ b/cmake/script/CoverageInclude.cmake.in @@ -38,7 +38,6 @@ list(APPEND LCOV_FILTER_COMMAND -p "src/leveldb/") list(APPEND LCOV_FILTER_COMMAND -p "src/crc32c/") list(APPEND LCOV_FILTER_COMMAND -p "src/bench/") list(APPEND LCOV_FILTER_COMMAND -p "src/crypto/ctaes") -list(APPEND LCOV_FILTER_COMMAND -p "src/minisketch") list(APPEND LCOV_FILTER_COMMAND -p "src/secp256k1") list(APPEND LCOV_FILTER_COMMAND -p "depends") diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000000..0afb88110d --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,389 @@ +# Copyright (c) 2023-present The Bitcoin Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or https://opensource.org/license/mit/. + +include(GNUInstallDirs) +include(AddWindowsResources) + +configure_file(${PROJECT_SOURCE_DIR}/cmake/bitcoin-build-config.h.in bitcoin-build-config.h USE_SOURCE_PERMISSIONS @ONLY) +include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) + +add_custom_target(generate_build_info + BYPRODUCTS ${PROJECT_BINARY_DIR}/src/bitcoin-build-info.h + COMMAND ${CMAKE_COMMAND} -DBUILD_INFO_HEADER_PATH=${PROJECT_BINARY_DIR}/src/bitcoin-build-info.h -DSOURCE_DIR=${PROJECT_SOURCE_DIR} -P ${PROJECT_SOURCE_DIR}/cmake/script/GenerateBuildInfo.cmake + COMMENT "Generating bitcoin-build-info.h" + VERBATIM +) +add_library(bitcoin_clientversion OBJECT EXCLUDE_FROM_ALL + clientversion.cpp +) +target_link_libraries(bitcoin_clientversion + PRIVATE + core_interface +) +add_dependencies(bitcoin_clientversion generate_build_info) + +#============================= +# util library +# Firo does not have util subdirectory +#============================= + +add_library(bitcoin_util STATIC EXCLUDE_FROM_ALL + fs.cpp + utilmoneystr.cpp + policy/rbf.cpp + utilstrencodings.cpp + mbstring.cpp + threadinterrupt.cpp + utiltime.cpp + random.cpp + sync.cpp + support/lockedpool.cpp +) + +target_link_libraries(bitcoin_util + PRIVATE + core_interface + bitcoin_clientversion + bitcoin_crypto + $<$:ws2_32> + $<$:iphlpapi> +) + +add_subdirectory(crypto) +add_subdirectory(univalue) +if(WITH_MULTIPROCESS) + add_subdirectory(ipc) +endif() + +#============================= +# secp256k1 subtree +#============================= +message("") +message("Configuring secp256k1 subtree...") +set(SECP256K1_DISABLE_SHARED ON CACHE BOOL "" FORCE) +set(SECP256K1_ENABLE_MODULE_ECDH OFF CACHE BOOL "" FORCE) +set(SECP256K1_ENABLE_MODULE_RECOVERY ON CACHE BOOL "" FORCE) +set(SECP256K1_ENABLE_MODULE_MUSIG OFF CACHE BOOL "" FORCE) +set(SECP256K1_BUILD_BENCHMARK OFF CACHE BOOL "" FORCE) +set(SECP256K1_BUILD_TESTS ${BUILD_TESTS} CACHE BOOL "" FORCE) +set(SECP256K1_BUILD_EXHAUSTIVE_TESTS ${BUILD_TESTS} CACHE BOOL "" FORCE) +if(NOT BUILD_TESTS) + # Always skip the ctime tests, if we are building no other tests. + # Otherwise, they are built if Valgrind is available. See SECP256K1_VALGRIND. + set(SECP256K1_BUILD_CTIME_TESTS ${BUILD_TESTS} CACHE BOOL "" FORCE) +endif() +set(SECP256K1_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) +include(GetTargetInterface) +# -fsanitize and related flags apply to both C++ and C, +# so we can pass them down to libsecp256k1 as CFLAGS and LDFLAGS. +get_target_interface(core_sanitizer_cxx_flags "" sanitize_interface COMPILE_OPTIONS) +set(SECP256K1_APPEND_CFLAGS ${core_sanitizer_cxx_flags} CACHE STRING "" FORCE) +unset(core_sanitizer_cxx_flags) +get_target_interface(core_sanitizer_linker_flags "" sanitize_interface LINK_OPTIONS) +set(SECP256K1_APPEND_LDFLAGS ${core_sanitizer_linker_flags} CACHE STRING "" FORCE) +unset(core_sanitizer_linker_flags) +# We want to build libsecp256k1 with the most tested RelWithDebInfo configuration. +enable_language(C) +foreach(config IN LISTS CMAKE_BUILD_TYPE CMAKE_CONFIGURATION_TYPES) + if(config STREQUAL "") + continue() + endif() + string(TOUPPER "${config}" config) + set(CMAKE_C_FLAGS_${config} "${CMAKE_C_FLAGS_RELWITHDEBINFO}") +endforeach() +# If the CFLAGS environment variable is defined during building depends +# and configuring this build system, its content might be duplicated. +if(DEFINED ENV{CFLAGS}) + deduplicate_flags(CMAKE_C_FLAGS) +endif() +set(CMAKE_EXPORT_COMPILE_COMMANDS OFF) +add_subdirectory(secp256k1) +set_target_properties(secp256k1 PROPERTIES + EXCLUDE_FROM_ALL TRUE +) +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) +string(APPEND CMAKE_C_COMPILE_OBJECT " ${APPEND_CPPFLAGS} ${APPEND_CFLAGS}") + +add_library(bitcoin_consensus STATIC EXCLUDE_FROM_ALL + arith_uint256.cpp + consensus/merkle.cpp + hash.cpp + primitives/block.cpp + primitives/transaction.cpp + pubkey.cpp + script/interpreter.cpp + script/script.cpp + script/script_error.cpp + uint256.cpp +) +target_link_libraries(bitcoin_consensus + PRIVATE + core_interface + bitcoin_crypto + secp256k1 +) + +if(WITH_ZMQ) + add_subdirectory(zmq) +endif() + +# Home for common functionality shared by different executables and libraries. +# Similar to `bitcoin_util` library, but higher-level. +add_library(bitcoin_common STATIC EXCLUDE_FROM_ALL + base58.cpp + libspark/bech32.cpp + chainparams.cpp + chainparamsbase.cpp + coins.cpp + bloom.cpp + init.cpp + compressor.cpp + core_read.cpp + core_write.cpp + chainparams.cpp + key.cpp + merkleblock.cpp + netaddress.cpp + netbase.cpp + policy/policy.cpp + protocol.cpp + rpc/rawtransaction.cpp + scheduler.cpp + script/sign.cpp +) +target_link_libraries(bitcoin_common + PRIVATE + core_interface + bitcoin_consensus + bitcoin_util + univalue + secp256k1 + Boost::headers + $ + $<$:ws2_32> +) + + +set(installable_targets) +if(ENABLE_WALLET) + add_subdirectory(wallet) + + if(BUILD_WALLET_TOOL) + add_executable(bitcoin-wallet + bitcoin-wallet.cpp + init/bitcoin-wallet.cpp + wallet/wallettool.cpp + ) + add_windows_resources(bitcoin-wallet bitcoin-wallet-res.rc) + target_link_libraries(bitcoin-wallet + core_interface + bitcoin_wallet + bitcoin_common + bitcoin_util + Boost::headers + ) + list(APPEND installable_targets bitcoin-wallet) + endif() +endif() + + +# P2P and RPC server functionality used by `bitcoind` and `bitcoin-qt` executables. +add_library(bitcoin_node STATIC EXCLUDE_FROM_ALL + addrdb.cpp + addrman.cpp + blockencodings.cpp + chain.cpp + consensus/tx_verify.cpp + dbwrapper.cpp + httprpc.cpp + httpserver.cpp + init.cpp + chain.cpp + net.cpp + net_processing.cpp + miner.cpp + warnings.cpp + noui.cpp + policy/fees.cpp + policy/rbf.cpp + pow.cpp + rest.cpp + rpc/blockchain.cpp + rpc/mining.cpp + rpc/net.cpp + rpc/server.cpp + script/sigcache.cpp + torcontrol.cpp + txdb.cpp + txmempool.cpp + validation.cpp + validationinterface.cpp + versionbits.cpp +) +target_link_libraries(bitcoin_node + PRIVATE + core_interface + bitcoin_common + bitcoin_util + $ + leveldb + univalue + Boost::headers + $ + $ + $ + $ +) + + +# Bitcoin Core bitcoind. +if(BUILD_DAEMON) + add_executable(bitcoind + bitcoind.cpp + ) + add_windows_resources(bitcoind bitcoind-res.rc) + target_link_libraries(bitcoind + core_interface + bitcoin_node + $ + ) + list(APPEND installable_targets bitcoind) +endif() +if(WITH_MULTIPROCESS) + add_executable(bitcoin-node + bitcoind.cpp + init/bitcoin-node.cpp + ) + target_link_libraries(bitcoin-node + core_interface + bitcoin_node + bitcoin_ipc + $ + ) + list(APPEND installable_targets bitcoin-node) + + if(BUILD_TESTS) + # bitcoin_ipc_test library target is defined here in src/CMakeLists.txt + # instead of src/test/CMakeLists.txt so capnp files in src/test/ are able to + # reference capnp files in src/ipc/capnp/ by relative path. The Cap'n Proto + # compiler only allows importing by relative path when the importing and + # imported files are underneath the same compilation source prefix, so the + # source prefix must be src/, not src/test/ + add_library(bitcoin_ipc_test STATIC EXCLUDE_FROM_ALL + test/ipc_test.cpp + ) + target_capnp_sources(bitcoin_ipc_test ${PROJECT_SOURCE_DIR} + test/ipc_test.capnp + ) + add_dependencies(bitcoin_ipc_test bitcoin_ipc_headers) + endif() +endif() + + +add_library(bitcoin_cli STATIC EXCLUDE_FROM_ALL + rpc/client.cpp +) +target_link_libraries(bitcoin_cli + PUBLIC + core_interface + univalue +) + + +# Bitcoin Core RPC client +if(BUILD_CLI) + add_executable(bitcoin-cli bitcoin-cli.cpp) + add_windows_resources(bitcoin-cli bitcoin-cli-res.rc) + target_link_libraries(bitcoin-cli + core_interface + bitcoin_cli + bitcoin_common + bitcoin_util + libevent::core + libevent::extra + ) + list(APPEND installable_targets bitcoin-cli) +endif() + + +if(BUILD_TX) + add_executable(bitcoin-tx bitcoin-tx.cpp) + add_windows_resources(bitcoin-tx bitcoin-tx-res.rc) + target_link_libraries(bitcoin-tx + core_interface + bitcoin_common + bitcoin_util + univalue + ) + list(APPEND installable_targets bitcoin-tx) +endif() + + +if(BUILD_UTIL) + add_executable(bitcoin-util bitcoin-util.cpp) + add_windows_resources(bitcoin-util bitcoin-util-res.rc) + target_link_libraries(bitcoin-util + core_interface + bitcoin_common + bitcoin_util + ) + list(APPEND installable_targets bitcoin-util) +endif() + + +if(BUILD_GUI) + add_subdirectory(qt) +endif() + + +if(BUILD_KERNEL_LIB) + add_subdirectory(kernel) +endif() + +if(BUILD_UTIL_CHAINSTATE) + add_executable(bitcoin-chainstate + bitcoin-chainstate.cpp + ) + # TODO: The `SKIP_BUILD_RPATH` property setting can be deleted + # in the future after reordering Guix script commands to + # perform binary checks after the installation step. + # Relevant discussions: + # - https://github.com/hebasto/bitcoin/pull/236#issuecomment-2183120953 + # - https://github.com/bitcoin/bitcoin/pull/30312#issuecomment-2191235833 + set_target_properties(bitcoin-chainstate PROPERTIES + SKIP_BUILD_RPATH OFF + ) + target_link_libraries(bitcoin-chainstate + PRIVATE + core_interface + bitcoinkernel + ) +endif() + + +if(BUILD_BENCH) + add_subdirectory(bench) +endif() + +if(BUILD_TESTS) + add_subdirectory(test) +endif() + +if(BUILD_FUZZ_BINARY) + add_subdirectory(test/fuzz) +endif() + + +install(TARGETS ${installable_targets} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} +) +unset(installable_targets) + +if(INSTALL_MAN) + # TODO: these stubs are no longer needed. man pages should be generated at install time. + install(DIRECTORY ../doc/man/ + DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 + FILES_MATCHING PATTERN *.1 + ) +endif() \ No newline at end of file diff --git a/src/bench/CMakeLists.txt b/src/bench/CMakeLists.txt index 8b058dd8ad..63fa9fd313 100644 --- a/src/bench/CMakeLists.txt +++ b/src/bench/CMakeLists.txt @@ -25,7 +25,6 @@ add_executable(bench_firo target_link_libraries(bench_firo core_interface - test_util firo_node Boost::headers ) diff --git a/src/crypto/CMakeLists.txt b/src/crypto/CMakeLists.txt index 14f37fec7a..28c7ca6ae8 100644 --- a/src/crypto/CMakeLists.txt +++ b/src/crypto/CMakeLists.txt @@ -5,14 +5,12 @@ add_library(bitcoin_crypto STATIC EXCLUDE_FROM_ALL aes.cpp chacha20.cpp - chacha20poly1305.cpp hmac_sha256.cpp hmac_sha512.cpp progpow.cpp ripemd160.cpp sha1.cpp sha256.cpp - sha256_sse4.cpp sha512.cpp ../support/cleanse.cpp ) @@ -21,43 +19,3 @@ target_link_libraries(bitcoin_crypto PRIVATE core_interface ) - -if(HAVE_SSE41) - add_library(bitcoin_crypto_sse41 STATIC EXCLUDE_FROM_ALL - sha256_sse41.cpp - ) - target_compile_definitions(bitcoin_crypto_sse41 PUBLIC ENABLE_SSE41) - target_compile_options(bitcoin_crypto_sse41 PRIVATE ${SSE41_CXXFLAGS}) - target_link_libraries(bitcoin_crypto_sse41 PRIVATE core_interface) - target_link_libraries(bitcoin_crypto PRIVATE bitcoin_crypto_sse41) -endif() - -if(HAVE_AVX2) - add_library(bitcoin_crypto_avx2 STATIC EXCLUDE_FROM_ALL - sha256_avx2.cpp - ) - target_compile_definitions(bitcoin_crypto_avx2 PUBLIC ENABLE_AVX2) - target_compile_options(bitcoin_crypto_avx2 PRIVATE ${AVX2_CXXFLAGS}) - target_link_libraries(bitcoin_crypto_avx2 PRIVATE core_interface) - target_link_libraries(bitcoin_crypto PRIVATE bitcoin_crypto_avx2) -endif() - -if(HAVE_SSE41 AND HAVE_X86_SHANI) - add_library(bitcoin_crypto_x86_shani STATIC EXCLUDE_FROM_ALL - sha256_x86_shani.cpp - ) - target_compile_definitions(bitcoin_crypto_x86_shani PUBLIC ENABLE_SSE41 ENABLE_X86_SHANI) - target_compile_options(bitcoin_crypto_x86_shani PRIVATE ${X86_SHANI_CXXFLAGS}) - target_link_libraries(bitcoin_crypto_x86_shani PRIVATE core_interface) - target_link_libraries(bitcoin_crypto PRIVATE bitcoin_crypto_x86_shani) -endif() - -if(HAVE_ARM_SHANI) - add_library(bitcoin_crypto_arm_shani STATIC EXCLUDE_FROM_ALL - sha256_arm_shani.cpp - ) - target_compile_definitions(bitcoin_crypto_arm_shani PUBLIC ENABLE_ARM_SHANI) - target_compile_options(bitcoin_crypto_arm_shani PRIVATE ${ARM_SHANI_CXXFLAGS}) - target_link_libraries(bitcoin_crypto_arm_shani PRIVATE core_interface) - target_link_libraries(bitcoin_crypto PRIVATE bitcoin_crypto_arm_shani) -endif() \ No newline at end of file diff --git a/src/univalue/CMakeLists.txt b/src/univalue/CMakeLists.txt index 96733fe077..ab460286f5 100644 --- a/src/univalue/CMakeLists.txt +++ b/src/univalue/CMakeLists.txt @@ -4,7 +4,6 @@ add_library(univalue STATIC EXCLUDE_FROM_ALL lib/univalue.cpp - lib/univalue_get.cpp lib/univalue_read.cpp lib/univalue_write.cpp ) diff --git a/src/wallet/CMakeLists.txt b/src/wallet/CMakeLists.txt index 495f85530a..6895ace860 100644 --- a/src/wallet/CMakeLists.txt +++ b/src/wallet/CMakeLists.txt @@ -29,5 +29,4 @@ target_link_libraries(bitcoin_wallet ) # Firo only supports BDB for wallet storage. -target_sources(bitcoin_wallet PRIVATE bdb.cpp salvage.cpp) target_link_libraries(bitcoin_wallet PUBLIC BerkeleyDB::BerkeleyDB) \ No newline at end of file