CMakeLists.txt raw

   1  # Copyright (c) 2023-present The Bitcoin Core developers
   2  # Distributed under the MIT software license, see the accompanying
   3  # file COPYING or https://opensource.org/license/mit/.
   4  
   5  include(AddWindowsResources)
   6  
   7  configure_file(${PROJECT_SOURCE_DIR}/cmake/bitcoin-build-config.h.in bitcoin-build-config.h USE_SOURCE_PERMISSIONS @ONLY)
   8  include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
   9  
  10  #=============================
  11  # Subprojects
  12  #=============================
  13  # Subprojects include subdirectories that do or could have tests
  14  # and/or benchmark binaries, such as all subtrees and univalue.
  15  # These need to be included before CMAKE_*_OUTPUT_DIRECTORY variables
  16  # are set, so output locations of subproject tests and libraries are
  17  # not overridden.
  18  include(../cmake/crc32c.cmake)
  19  include(../cmake/leveldb.cmake)
  20  include(../cmake/minisketch.cmake)
  21  add_subdirectory(univalue)
  22  if (ENABLE_IPC AND NOT WITH_EXTERNAL_LIBMULTIPROCESS)
  23    include(../cmake/libmultiprocess.cmake)
  24    add_libmultiprocess(ipc/libmultiprocess)
  25  endif()
  26  include(../cmake/secp256k1.cmake)
  27  add_secp256k1(secp256k1)
  28  
  29  # Set top-level target output locations.
  30  if(NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY)
  31    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)
  32  endif()
  33  if(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)
  34    set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
  35  endif()
  36  if(NOT CMAKE_ARCHIVE_OUTPUT_DIRECTORY)
  37    set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
  38  endif()
  39  
  40  set(IS_SOURCE_TARBALL FALSE)
  41  # git will expand the next line to "set(IS_SOURCE_TARBALL TRUE)" inside archives:
  42  #$Format:%nset(IS_SOURCE_TARBALL TRUE)$
  43  if(NOT IS_SOURCE_TARBALL AND PROJECT_IS_TOP_LEVEL)
  44    find_package(Git QUIET)
  45  endif()
  46  add_custom_target(generate_build_info
  47    BYPRODUCTS ${PROJECT_BINARY_DIR}/src/bitcoin-build-info.h
  48    COMMAND ${CMAKE_COMMAND} -DGIT_EXECUTABLE=${GIT_EXECUTABLE} -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
  49    COMMENT "Generating bitcoin-build-info.h"
  50    VERBATIM
  51  )
  52  add_library(bitcoin_clientversion STATIC
  53    clientversion.cpp
  54  )
  55  target_link_libraries(bitcoin_clientversion
  56    PRIVATE
  57      core_interface
  58  )
  59  add_dependencies(bitcoin_clientversion generate_build_info)
  60  
  61  add_subdirectory(crypto)
  62  add_subdirectory(util)
  63  if(ENABLE_IPC)
  64    add_subdirectory(ipc)
  65  else()
  66    add_library(bitcoin_ipc STATIC EXCLUDE_FROM_ALL ipc/stub.cpp)
  67  endif()
  68  
  69  add_library(bitcoin_consensus STATIC EXCLUDE_FROM_ALL
  70    arith_uint256.cpp
  71    consensus/merkle.cpp
  72    consensus/tx_check.cpp
  73    hash.cpp
  74    primitives/block.cpp
  75    primitives/transaction.cpp
  76    pubkey.cpp
  77    script/interpreter.cpp
  78    script/script.cpp
  79    script/script_error.cpp
  80    uint256.cpp
  81  )
  82  target_link_libraries(bitcoin_consensus
  83    PRIVATE
  84      core_interface
  85      bitcoin_crypto
  86      secp256k1
  87  )
  88  
  89  if(WITH_ZMQ)
  90    add_subdirectory(zmq)
  91  endif()
  92  
  93  # Home for common functionality shared by different executables and libraries.
  94  # Similar to `bitcoin_util` library, but higher-level.
  95  add_library(bitcoin_common STATIC EXCLUDE_FROM_ALL
  96    addresstype.cpp
  97    base58.cpp
  98    bech32.cpp
  99    chain.cpp
 100    chainparams.cpp
 101    chainparamsbase.cpp
 102    coins.cpp
 103    common/args.cpp
 104    common/bloom.cpp
 105    common/config.cpp
 106    common/init.cpp
 107    common/interfaces.cpp
 108    common/license_info.cpp
 109    common/messages.cpp
 110    common/netif.cpp
 111    common/pcp.cpp
 112    common/run_command.cpp
 113    common/settings.cpp
 114    common/signmessage.cpp
 115    common/system.cpp
 116    common/url.cpp
 117    compressor.cpp
 118    core_io.cpp
 119    deploymentinfo.cpp
 120    external_signer.cpp
 121    init/common.cpp
 122    kernel/chainparams.cpp
 123    key.cpp
 124    key_io.cpp
 125    merkleblock.cpp
 126    musig.cpp
 127    net_permissions.cpp
 128    net_types.cpp
 129    netaddress.cpp
 130    netbase.cpp
 131    outputtype.cpp
 132    policy/feerate.cpp
 133    policy/policy.cpp
 134    pow.cpp
 135    protocol.cpp
 136    psbt.cpp
 137    rpc/rawtransaction_util.cpp
 138    rpc/request.cpp
 139    rpc/util.cpp
 140    scheduler.cpp
 141    script/descriptor.cpp
 142    script/miniscript.cpp
 143    script/parsing.cpp
 144    script/sign.cpp
 145    script/signingprovider.cpp
 146    script/solver.cpp
 147  )
 148  target_link_libraries(bitcoin_common
 149    PRIVATE
 150      core_interface
 151      bitcoin_consensus
 152      bitcoin_util
 153      univalue
 154      secp256k1
 155      $<TARGET_NAME_IF_EXISTS:USDT::headers>
 156      $<$<PLATFORM_ID:Windows>:ws2_32>
 157  )
 158  
 159  include(InstallBinaryComponent)
 160  
 161  if(ENABLE_WALLET)
 162    add_subdirectory(wallet)
 163  
 164    if(BUILD_WALLET_TOOL)
 165      add_executable(bitcoin-wallet
 166        bitcoin-wallet.cpp
 167        init/bitcoin-wallet.cpp
 168        wallet/wallettool.cpp
 169      )
 170      add_windows_resources(bitcoin-wallet bitcoin-wallet-res.rc)
 171      add_windows_application_manifest(bitcoin-wallet)
 172      target_link_libraries(bitcoin-wallet
 173        core_interface
 174        bitcoin_wallet
 175        bitcoin_common
 176        bitcoin_util
 177      )
 178      install_binary_component(bitcoin-wallet HAS_MANPAGE)
 179    endif()
 180  endif()
 181  
 182  
 183  # P2P and RPC server functionality used by `bitcoind` and `bitcoin-qt` executables.
 184  add_library(bitcoin_node STATIC EXCLUDE_FROM_ALL
 185    addrdb.cpp
 186    addrman.cpp
 187    banman.cpp
 188    bip324.cpp
 189    blockencodings.cpp
 190    blockfilter.cpp
 191    consensus/tx_verify.cpp
 192    dbwrapper.cpp
 193    deploymentstatus.cpp
 194    flatfile.cpp
 195    headerssync.cpp
 196    httprpc.cpp
 197    httpserver.cpp
 198    i2p.cpp
 199    index/base.cpp
 200    index/blockfilterindex.cpp
 201    index/coinstatsindex.cpp
 202    index/txindex.cpp
 203    index/txospenderindex.cpp
 204    init.cpp
 205    kernel/chain.cpp
 206    kernel/checks.cpp
 207    kernel/coinstats.cpp
 208    kernel/context.cpp
 209    kernel/cs_main.cpp
 210    kernel/disconnected_transactions.cpp
 211    kernel/mempool_removal_reason.cpp
 212    mapport.cpp
 213    net.cpp
 214    net_processing.cpp
 215    netgroup.cpp
 216    node/abort.cpp
 217    node/blockmanager_args.cpp
 218    node/blockstorage.cpp
 219    node/caches.cpp
 220    node/chainstate.cpp
 221    node/chainstatemanager_args.cpp
 222    node/coin.cpp
 223    node/coins_view_args.cpp
 224    node/connection_types.cpp
 225    node/context.cpp
 226    node/database_args.cpp
 227    node/eviction.cpp
 228    node/interface_ui.cpp
 229    node/interfaces.cpp
 230    node/kernel_notifications.cpp
 231    node/mempool_args.cpp
 232    node/mempool_persist.cpp
 233    node/mempool_persist_args.cpp
 234    node/miner.cpp
 235    node/mining_args.cpp
 236    node/mini_miner.cpp
 237    node/minisketchwrapper.cpp
 238    node/peerman_args.cpp
 239    node/psbt.cpp
 240    node/timeoffsets.cpp
 241    node/transaction.cpp
 242    node/txdownloadman_impl.cpp
 243    node/txorphanage.cpp
 244    node/txreconciliation.cpp
 245    node/utxo_snapshot.cpp
 246    node/warnings.cpp
 247    noui.cpp
 248    policy/ephemeral_policy.cpp
 249    policy/fees/block_policy_estimator.cpp
 250    policy/fees/block_policy_estimator_args.cpp
 251    policy/packages.cpp
 252    policy/rbf.cpp
 253    policy/settings.cpp
 254    policy/truc_policy.cpp
 255    private_broadcast.cpp
 256    rest.cpp
 257    rpc/blockchain.cpp
 258    rpc/external_signer.cpp
 259    rpc/fees.cpp
 260    rpc/mempool.cpp
 261    rpc/mining.cpp
 262    rpc/net.cpp
 263    rpc/node.cpp
 264    rpc/output_script.cpp
 265    rpc/rawtransaction.cpp
 266    rpc/server.cpp
 267    rpc/server_util.cpp
 268    rpc/signmessage.cpp
 269    rpc/txoutproof.cpp
 270    script/sigcache.cpp
 271    signet.cpp
 272    torcontrol.cpp
 273    txdb.cpp
 274    txgraph.cpp
 275    txmempool.cpp
 276    txrequest.cpp
 277    validation.cpp
 278    validationinterface.cpp
 279    versionbits.cpp
 280    $<$<TARGET_EXISTS:bitcoin_wallet>:wallet/init.cpp>
 281    $<$<NOT:$<TARGET_EXISTS:bitcoin_wallet>>:dummywallet.cpp>
 282  )
 283  target_link_libraries(bitcoin_node
 284    PRIVATE
 285      core_interface
 286      bitcoin_common
 287      bitcoin_util
 288      $<TARGET_NAME_IF_EXISTS:bitcoin_zmq>
 289      leveldb
 290      minisketch
 291      univalue
 292      $<TARGET_NAME_IF_EXISTS:Boost::headers>
 293      $<TARGET_NAME_IF_EXISTS:USDT::headers>
 294  )
 295  if(WITH_EMBEDDED_ASMAP)
 296    target_compile_definitions(bitcoin_node PRIVATE ENABLE_EMBEDDED_ASMAP=1)
 297    include(TargetDataSources)
 298    target_raw_data_sources(bitcoin_node NAMESPACE node::data
 299      node/data/ip_asn.dat
 300    )
 301  endif()
 302  
 303  # Bitcoin wrapper executable that can call other executables.
 304  if(BUILD_BITCOIN_BIN)
 305    add_executable(bitcoin bitcoin.cpp)
 306    add_windows_resources(bitcoin bitcoin-res.rc)
 307    add_windows_application_manifest(bitcoin)
 308    target_link_libraries(bitcoin core_interface bitcoin_common bitcoin_util)
 309    install_binary_component(bitcoin HAS_MANPAGE)
 310  endif()
 311  
 312  # Bitcoin Core bitcoind.
 313  if(BUILD_DAEMON)
 314    add_executable(bitcoind
 315      bitcoind.cpp
 316      init/bitcoind.cpp
 317    )
 318    add_windows_resources(bitcoind bitcoind-res.rc)
 319    add_windows_application_manifest(bitcoind)
 320    target_link_libraries(bitcoind
 321      core_interface
 322      bitcoin_node
 323      $<TARGET_NAME_IF_EXISTS:bitcoin_wallet>
 324    )
 325    install_binary_component(bitcoind HAS_MANPAGE)
 326  endif()
 327  if(ENABLE_IPC AND BUILD_DAEMON)
 328    add_executable(bitcoin-node
 329      bitcoind.cpp
 330      init/bitcoin-node.cpp
 331    )
 332    target_link_libraries(bitcoin-node
 333      core_interface
 334      bitcoin_node
 335      bitcoin_ipc
 336      $<TARGET_NAME_IF_EXISTS:bitcoin_wallet>
 337    )
 338    install_binary_component(bitcoin-node INTERNAL)
 339  endif()
 340  
 341  
 342  add_library(bitcoin_cli STATIC EXCLUDE_FROM_ALL
 343    compat/stdin.cpp
 344    rpc/client.cpp
 345  )
 346  target_link_libraries(bitcoin_cli
 347    PUBLIC
 348      core_interface
 349      univalue
 350  )
 351  
 352  
 353  # Bitcoin Core RPC client
 354  if(BUILD_CLI)
 355    add_executable(bitcoin-cli bitcoin-cli.cpp init/basic.cpp)
 356    add_windows_resources(bitcoin-cli bitcoin-cli-res.rc)
 357    add_windows_application_manifest(bitcoin-cli)
 358    target_link_libraries(bitcoin-cli
 359      core_interface
 360      bitcoin_cli
 361      bitcoin_common
 362      bitcoin_ipc
 363      bitcoin_util
 364    )
 365    install_binary_component(bitcoin-cli HAS_MANPAGE)
 366  endif()
 367  
 368  
 369  if(BUILD_TX)
 370    add_executable(bitcoin-tx bitcoin-tx.cpp)
 371    add_windows_resources(bitcoin-tx bitcoin-tx-res.rc)
 372    add_windows_application_manifest(bitcoin-tx)
 373    target_link_libraries(bitcoin-tx
 374      core_interface
 375      bitcoin_common
 376      bitcoin_util
 377      univalue
 378    )
 379    install_binary_component(bitcoin-tx HAS_MANPAGE)
 380  endif()
 381  
 382  
 383  if(BUILD_UTIL)
 384    add_executable(bitcoin-util bitcoin-util.cpp)
 385    add_windows_resources(bitcoin-util bitcoin-util-res.rc)
 386    add_windows_application_manifest(bitcoin-util)
 387    target_link_libraries(bitcoin-util
 388      core_interface
 389      bitcoin_common
 390      bitcoin_util
 391    )
 392    install_binary_component(bitcoin-util HAS_MANPAGE)
 393  endif()
 394  
 395  
 396  if(BUILD_GUI)
 397    add_subdirectory(qt)
 398  endif()
 399  
 400  
 401  if(BUILD_KERNEL_LIB)
 402    add_subdirectory(kernel)
 403    if (BUILD_KERNEL_TEST)
 404      add_subdirectory(test/kernel)
 405    endif()
 406    if(BUILD_UTIL_CHAINSTATE)
 407      add_executable(bitcoin-chainstate
 408        bitcoin-chainstate.cpp
 409      )
 410      add_windows_application_manifest(bitcoin-chainstate)
 411      target_link_libraries(bitcoin-chainstate
 412        PRIVATE
 413          core_interface
 414          bitcoinkernel
 415      )
 416      install_binary_component(bitcoin-chainstate INTERNAL)
 417    endif()
 418  endif()
 419  
 420  
 421  add_subdirectory(test/util)
 422  if(BUILD_BENCH)
 423    add_subdirectory(bench)
 424  endif()
 425  
 426  if(BUILD_TESTS)
 427    add_subdirectory(test)
 428  endif()
 429  
 430  if(BUILD_FUZZ_BINARY)
 431    add_subdirectory(test/fuzz)
 432  endif()
 433