mirror of https://github.com/bitcoin/bitcoin
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
342 lines
12 KiB
342 lines
12 KiB
# 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/.
|
|
|
|
# Ubuntu 22.04 LTS Jammy Jellyfish, https://wiki.ubuntu.com/Releases, EOSS in June 2027:
|
|
# - CMake 3.22.1, https://packages.ubuntu.com/jammy/cmake
|
|
#
|
|
# Centos Stream 9, EOL in May 2027:
|
|
# - CMake 3.26.5, https://mirror.stream.centos.org/9-stream/AppStream/x86_64/os/Packages/
|
|
cmake_minimum_required(VERSION 3.22)
|
|
if(POLICY CMP0141)
|
|
# MSVC debug information format flags are selected by an abstraction.
|
|
# We want to use the CMAKE_MSVC_DEBUG_INFORMATION_FORMAT variable
|
|
# to select the MSVC debug information format.
|
|
cmake_policy(SET CMP0141 NEW)
|
|
endif()
|
|
|
|
if (${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR})
|
|
message(FATAL_ERROR "In-source builds are not allowed.")
|
|
endif()
|
|
|
|
#=============================
|
|
# Project / Package metadata
|
|
#=============================
|
|
set(PACKAGE_NAME "Bitcoin Core")
|
|
set(CLIENT_VERSION_MAJOR 27)
|
|
set(CLIENT_VERSION_MINOR 99)
|
|
set(CLIENT_VERSION_BUILD 0)
|
|
set(CLIENT_VERSION_RC 0)
|
|
set(CLIENT_VERSION_IS_RELEASE "false")
|
|
set(COPYRIGHT_YEAR "2024")
|
|
|
|
project(BitcoinCore
|
|
VERSION ${CLIENT_VERSION_MAJOR}.${CLIENT_VERSION_MINOR}.${CLIENT_VERSION_BUILD}
|
|
DESCRIPTION "Bitcoin client software"
|
|
HOMEPAGE_URL "https://bitcoincore.org/"
|
|
LANGUAGES NONE
|
|
)
|
|
|
|
set(PACKAGE_VERSION ${PROJECT_VERSION})
|
|
if(CLIENT_VERSION_RC GREATER 0)
|
|
string(APPEND PACKAGE_VERSION "rc${CLIENT_VERSION_RC}")
|
|
endif()
|
|
|
|
set(COPYRIGHT_HOLDERS "The %s developers")
|
|
set(COPYRIGHT_HOLDERS_FINAL "The ${PACKAGE_NAME} developers")
|
|
set(PACKAGE_BUGREPORT "https://github.com/bitcoin/bitcoin/issues")
|
|
|
|
#=============================
|
|
# Language setup
|
|
#=============================
|
|
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND NOT CMAKE_HOST_APPLE)
|
|
# We do not use the install_name_tool when cross-compiling for macOS.
|
|
# So disable this tool check in further enable_language() commands.
|
|
set(CMAKE_PLATFORM_HAS_INSTALLNAME FALSE)
|
|
endif()
|
|
enable_language(CXX)
|
|
set(CMAKE_CXX_STANDARD 20)
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
set(CMAKE_CXX_EXTENSIONS OFF)
|
|
|
|
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/module)
|
|
|
|
#=============================
|
|
# Configurable options
|
|
#=============================
|
|
include(CMakeDependentOption)
|
|
# When adding a new option, end the <help_text> with a full stop for consistency.
|
|
option(BUILD_DAEMON "Build bitcoind executable." ON)
|
|
option(BUILD_CLI "Build bitcoin-cli executable." ON)
|
|
|
|
option(BUILD_TESTS "Build test_bitcoin executable." ON)
|
|
option(BUILD_TX "Build bitcoin-tx executable." ${BUILD_TESTS})
|
|
option(BUILD_UTIL "Build bitcoin-util executable." ${BUILD_TESTS})
|
|
|
|
option(ENABLE_WALLET "Enable wallet." ON)
|
|
option(WITH_SQLITE "Enable SQLite wallet support." ${ENABLE_WALLET})
|
|
if(WITH_SQLITE)
|
|
if(VCPKG_TARGET_TRIPLET)
|
|
# Use of the `unofficial::` namespace is a vcpkg package manager convention.
|
|
find_package(unofficial-sqlite3 CONFIG REQUIRED)
|
|
else()
|
|
find_package(SQLite3 3.7.17 REQUIRED)
|
|
endif()
|
|
set(USE_SQLITE ON)
|
|
set(ENABLE_WALLET ON)
|
|
endif()
|
|
option(WITH_BDB "Enable Berkeley DB (BDB) wallet support." OFF)
|
|
cmake_dependent_option(WARN_INCOMPATIBLE_BDB "Warn when using a Berkeley DB (BDB) version other than 4.8." ON "WITH_BDB" OFF)
|
|
if(WITH_BDB)
|
|
find_package(BerkeleyDB 4.8 MODULE REQUIRED)
|
|
set(USE_BDB ON)
|
|
set(ENABLE_WALLET ON)
|
|
if(NOT BerkeleyDB_VERSION VERSION_EQUAL 4.8)
|
|
message(WARNING "Found Berkeley DB (BDB) other than 4.8.\n"
|
|
"BDB (legacy) wallets opened by this build will not be portable!"
|
|
)
|
|
if(WARN_INCOMPATIBLE_BDB)
|
|
message(WARNING "If this is intended, pass \"-DWARN_INCOMPATIBLE_BDB=OFF\".\n"
|
|
"Passing \"-DWITH_BDB=OFF\" will suppress this warning."
|
|
)
|
|
endif()
|
|
endif()
|
|
endif()
|
|
cmake_dependent_option(BUILD_WALLET_TOOL "Build bitcoin-wallet tool." ${BUILD_TESTS} "ENABLE_WALLET" OFF)
|
|
|
|
option(WITH_CCACHE "Attempt to use ccache for compiling." ON)
|
|
|
|
option(WITH_NATPMP "Enable NAT-PMP." OFF)
|
|
if(WITH_NATPMP)
|
|
find_package(NATPMP MODULE REQUIRED)
|
|
endif()
|
|
|
|
option(WITH_MINIUPNPC "Enable UPnP." OFF)
|
|
if(WITH_MINIUPNPC)
|
|
find_package(MiniUPnPc MODULE REQUIRED)
|
|
endif()
|
|
|
|
option(WITH_ZMQ "Enable ZMQ notifications." OFF)
|
|
if(WITH_ZMQ)
|
|
if(VCPKG_TARGET_TRIPLET)
|
|
find_package(ZeroMQ CONFIG REQUIRED)
|
|
else()
|
|
# The ZeroMQ project has provided config files since v4.2.2.
|
|
# TODO: Switch to find_package(ZeroMQ) at some point in the future.
|
|
find_package(PkgConfig REQUIRED)
|
|
pkg_check_modules(libzmq REQUIRED IMPORTED_TARGET libzmq>=4)
|
|
# TODO: This command will be redundant once
|
|
# https://github.com/bitcoin/bitcoin/pull/30508 is merged.
|
|
target_link_libraries(PkgConfig::libzmq INTERFACE
|
|
$<$<PLATFORM_ID:Windows>:iphlpapi;ws2_32>
|
|
)
|
|
endif()
|
|
endif()
|
|
|
|
option(WITH_USDT "Enable tracepoints for Userspace, Statically Defined Tracing." OFF)
|
|
if(WITH_USDT)
|
|
find_package(USDT MODULE REQUIRED)
|
|
endif()
|
|
|
|
cmake_dependent_option(ENABLE_EXTERNAL_SIGNER "Enable external signer support." ON "NOT WIN32" OFF)
|
|
|
|
option(BUILD_BENCH "Build bench_bitcoin executable." OFF)
|
|
|
|
set(configure_warnings)
|
|
|
|
include(CheckPIESupported)
|
|
check_pie_supported(OUTPUT_VARIABLE check_pie_output LANGUAGES CXX)
|
|
if(CMAKE_CXX_LINK_PIE_SUPPORTED)
|
|
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
|
elseif(NOT WIN32)
|
|
# The warning is superfluous for Windows.
|
|
message(WARNING "PIE is not supported at link time: ${check_pie_output}")
|
|
list(APPEND configure_warnings "Position independent code disabled.")
|
|
endif()
|
|
unset(check_pie_output)
|
|
|
|
# The core_interface library aims to encapsulate common build flags.
|
|
# It is a usage requirement for all targets except for secp256k1, which
|
|
# gets its flags by other means.
|
|
add_library(core_interface INTERFACE)
|
|
add_library(core_interface_relwithdebinfo INTERFACE)
|
|
add_library(core_interface_debug INTERFACE)
|
|
target_link_libraries(core_interface INTERFACE
|
|
$<$<CONFIG:RelWithDebInfo>:core_interface_relwithdebinfo>
|
|
$<$<CONFIG:Debug>:core_interface_debug>
|
|
)
|
|
|
|
include(ProcessConfigurations)
|
|
|
|
include(TryAppendCXXFlags)
|
|
include(TryAppendLinkerFlag)
|
|
|
|
if(WIN32)
|
|
#[=[
|
|
This build system supports two ways to build binaries for Windows.
|
|
|
|
1. Building on Windows using MSVC.
|
|
Implementation notes:
|
|
- /DWIN32 and /D_WINDOWS definitions are included into the CMAKE_CXX_FLAGS_INIT
|
|
and CMAKE_CXX_FLAGS_INIT variables by default.
|
|
- A run-time library is selected using the CMAKE_MSVC_RUNTIME_LIBRARY variable.
|
|
- MSVC-specific options, for example, /Zc:__cplusplus, are additionally required.
|
|
|
|
2. Cross-compiling using MinGW.
|
|
Implementation notes:
|
|
- WIN32 and _WINDOWS definitions must be provided explicitly.
|
|
- A run-time library must be specified explicitly using _MT definition.
|
|
]=]
|
|
|
|
target_compile_definitions(core_interface INTERFACE
|
|
_WIN32_WINNT=0x0601
|
|
_WIN32_IE=0x0501
|
|
WIN32_LEAN_AND_MEAN
|
|
NOMINMAX
|
|
)
|
|
|
|
if(MSVC)
|
|
if(VCPKG_TARGET_TRIPLET MATCHES "-static")
|
|
set(msvc_library_linkage "")
|
|
else()
|
|
set(msvc_library_linkage "DLL")
|
|
endif()
|
|
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>${msvc_library_linkage}")
|
|
unset(msvc_library_linkage)
|
|
|
|
target_compile_definitions(core_interface INTERFACE
|
|
_UNICODE;UNICODE
|
|
)
|
|
target_compile_options(core_interface INTERFACE
|
|
/utf-8
|
|
/Zc:preprocessor
|
|
/Zc:__cplusplus
|
|
/sdl
|
|
)
|
|
# Improve parallelism in MSBuild.
|
|
# See: https://devblogs.microsoft.com/cppblog/improved-parallelism-in-msbuild/.
|
|
list(APPEND CMAKE_VS_GLOBALS "UseMultiToolTask=true")
|
|
endif()
|
|
|
|
if(MINGW)
|
|
target_compile_definitions(core_interface INTERFACE
|
|
WIN32
|
|
_WINDOWS
|
|
_MT
|
|
)
|
|
# Avoid the use of aligned vector instructions when building for Windows.
|
|
# See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54412.
|
|
try_append_cxx_flags("-Wa,-muse-unaligned-vector-move" TARGET core_interface SKIP_LINK)
|
|
try_append_linker_flag("-static" TARGET core_interface)
|
|
# We require Windows 7 (NT 6.1) or later.
|
|
try_append_linker_flag("-Wl,--major-subsystem-version,6" TARGET core_interface)
|
|
try_append_linker_flag("-Wl,--minor-subsystem-version,1" TARGET core_interface)
|
|
endif()
|
|
endif()
|
|
|
|
# Use 64-bit off_t on 32-bit Linux.
|
|
if (CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_SIZEOF_VOID_P EQUAL 4)
|
|
# Ensure 64-bit offsets are used for filesystem accesses for 32-bit compilation.
|
|
target_compile_definitions(core_interface INTERFACE
|
|
_FILE_OFFSET_BITS=64
|
|
)
|
|
endif()
|
|
|
|
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
|
|
target_compile_definitions(core_interface INTERFACE
|
|
MAC_OSX
|
|
OBJC_OLD_DISPATCH_PROTOTYPES=0
|
|
)
|
|
# These flags are specific to ld64, and may cause issues with other linkers.
|
|
# For example: GNU ld will interpret -dead_strip as -de and then try and use
|
|
# "ad_strip" as the symbol for the entry point.
|
|
try_append_linker_flag("-Wl,-dead_strip" TARGET core_interface)
|
|
try_append_linker_flag("-Wl,-dead_strip_dylibs" TARGET core_interface)
|
|
if(CMAKE_HOST_APPLE)
|
|
try_append_linker_flag("-Wl,-headerpad_max_install_names" TARGET core_interface)
|
|
endif()
|
|
endif()
|
|
|
|
set(THREADS_PREFER_PTHREAD_FLAG ON)
|
|
find_package(Threads REQUIRED)
|
|
target_link_libraries(core_interface INTERFACE
|
|
Threads::Threads
|
|
)
|
|
|
|
include(AddBoostIfNeeded)
|
|
add_boost_if_needed()
|
|
|
|
if(BUILD_DAEMON OR BUILD_CLI OR BUILD_TESTS OR BUILD_BENCH)
|
|
find_package(Libevent 2.1.8 MODULE REQUIRED)
|
|
endif()
|
|
|
|
include(cmake/introspection.cmake)
|
|
|
|
include(cmake/ccache.cmake)
|
|
|
|
# Don't allow extended (non-ASCII) symbols in identifiers. This is easier for code review.
|
|
try_append_cxx_flags("-fno-extended-identifiers" TARGET core_interface SKIP_LINK)
|
|
|
|
# Currently all versions of gcc are subject to a class of bugs, see the
|
|
# gccbug_90348 test case (only reproduces on GCC 11 and earlier) and
|
|
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111843. To work around that, set
|
|
# -fstack-reuse=none for all gcc builds. (Only gcc understands this flag).
|
|
try_append_cxx_flags("-fstack-reuse=none" TARGET core_interface)
|
|
|
|
if(BUILD_TESTS)
|
|
enable_testing()
|
|
endif()
|
|
# TODO: The `CMAKE_SKIP_BUILD_RPATH` variable 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(CMAKE_SKIP_BUILD_RPATH TRUE)
|
|
set(CMAKE_SKIP_INSTALL_RPATH TRUE)
|
|
include(cmake/crc32c.cmake)
|
|
include(cmake/leveldb.cmake)
|
|
include(cmake/minisketch.cmake)
|
|
add_subdirectory(src)
|
|
|
|
message("\n")
|
|
message("Configure summary")
|
|
message("=================")
|
|
message("Executables:")
|
|
message(" bitcoind ............................ ${BUILD_DAEMON}")
|
|
message(" bitcoin-cli ......................... ${BUILD_CLI}")
|
|
message(" bitcoin-tx .......................... ${BUILD_TX}")
|
|
message(" bitcoin-util ........................ ${BUILD_UTIL}")
|
|
message(" bitcoin-wallet ...................... ${BUILD_WALLET_TOOL}")
|
|
message("Optional features:")
|
|
message(" wallet support ...................... ${ENABLE_WALLET}")
|
|
if(ENABLE_WALLET)
|
|
message(" - descriptor wallets (SQLite) ...... ${WITH_SQLITE}")
|
|
message(" - legacy wallets (Berkeley DB) ..... ${WITH_BDB}")
|
|
endif()
|
|
message(" external signer ..................... ${ENABLE_EXTERNAL_SIGNER}")
|
|
message(" port mapping:")
|
|
message(" - using NAT-PMP .................... ${WITH_NATPMP}")
|
|
message(" - using UPnP ....................... ${WITH_MINIUPNPC}")
|
|
message(" ZeroMQ .............................. ${WITH_ZMQ}")
|
|
message(" USDT tracing ........................ ${WITH_USDT}")
|
|
message("Tests:")
|
|
message(" test_bitcoin ........................ ${BUILD_TESTS}")
|
|
message(" bench_bitcoin ....................... ${BUILD_BENCH}")
|
|
message("")
|
|
message("C++ compiler .......................... ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}, ${CMAKE_CXX_COMPILER}")
|
|
include(FlagsSummary)
|
|
flags_summary()
|
|
message("Use ccache for compiling .............. ${WITH_CCACHE}")
|
|
message("\n")
|
|
if(configure_warnings)
|
|
message(" ******\n")
|
|
foreach(warning IN LISTS configure_warnings)
|
|
message(WARNING "${warning}")
|
|
endforeach()
|
|
message(" ******\n")
|
|
endif()
|
|
|
|
# We want all build properties to be encapsulated properly.
|
|
include(WarnAboutGlobalProperties)
|