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