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