Skip to content

Commit 4e32c98

Browse files
committed
cmake: Add MULTIPROCESS option
1 parent 3521e2f commit 4e32c98

File tree

9 files changed

+131
-2
lines changed

9 files changed

+131
-2
lines changed

CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ tristate_option(WITH_EXTERNAL_SIGNER
8383
"if Boost.Process is found."
8484
AUTO
8585
)
86+
tristate_option(MULTIPROCESS "Build multiprocess bitcoin-node, bitcoin-wallet, and bitcoin-gui executables in addition to monolithic bitcoind and bitcoin-qt executables. Requires libmultiprocess library. Experimental." "if libmultiprocess is found." OFF)
8687

8788
option(BUILD_TESTS "Build test_bitcoin executable." ON)
8889
option(BUILD_BENCH "Build bench_bitcoin executable." ON)
@@ -428,6 +429,7 @@ message(" Berkeley DB, legacy wallets ......... ${WITH_BDB}")
428429
message("Optional packages:")
429430
message(" GUI ................................. ${WITH_GUI}")
430431
message(" external signer ..................... ${WITH_EXTERNAL_SIGNER}")
432+
message(" multiprocess ........................ ${MULTIPROCESS}")
431433
message(" NAT-PMP ............................. ${WITH_NATPMP}")
432434
message(" UPnP ................................ ${WITH_MINIUPNPC}")
433435
message(" ZeroMQ .............................. ${WITH_ZMQ}")

cmake/module/GenerateMPCode.cmake

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
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+
function(target_capnp_sources target)
6+
foreach(capnp_file IN LISTS ARGN)
7+
add_custom_command(
8+
OUTPUT ${capnp_file}.c++ ${capnp_file}.h ${capnp_file}.proxy-client.c++ ${capnp_file}.proxy-types.h ${capnp_file}.proxy-server.c++ ${capnp_file}.proxy-types.c++ ${capnp_file}.proxy.h
9+
COMMAND ${MPGEN_PREFIX}/bin/mpgen ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/${capnp_file}
10+
DEPENDS ${capnp_file}
11+
VERBATIM
12+
)
13+
target_sources(${target}
14+
PRIVATE
15+
${CMAKE_CURRENT_BINARY_DIR}/${capnp_file}.c++
16+
${CMAKE_CURRENT_BINARY_DIR}/${capnp_file}.proxy-client.c++
17+
${CMAKE_CURRENT_BINARY_DIR}/${capnp_file}.proxy-server.c++
18+
${CMAKE_CURRENT_BINARY_DIR}/${capnp_file}.proxy-types.c++
19+
)
20+
endforeach()
21+
22+
target_include_directories(${target}
23+
PUBLIC
24+
$<BUILD_INTERFACE:${CMAKE_BINARY_DIR}>
25+
)
26+
27+
target_link_libraries(${target}
28+
PRIVATE
29+
PkgConfig::libmultiprocess
30+
)
31+
endfunction()

cmake/optional.cmake

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,3 +187,17 @@ else()
187187
set(WITH_SQLITE OFF)
188188
set(WITH_BDB OFF)
189189
endif()
190+
191+
if(MULTIPROCESS)
192+
# TODO: Switch to find_package() command.
193+
include(CrossPkgConfig)
194+
cross_pkg_check_modules(libmultiprocess libmultiprocess IMPORTED_TARGET)
195+
if(libmultiprocess_FOUND)
196+
set(MULTIPROCESS ON)
197+
set(MPGEN_PREFIX "${libmultiprocess_PREFIX}" CACHE PATH "libmultiprocess codegen tool prefix.")
198+
elseif(MULTIPROCESS STREQUAL "AUTO")
199+
set(MULTIPROCESS OFF)
200+
else()
201+
message(FATAL_ERROR "\"-DMULTIPROCESS=ON\" specified, but libmultiprocess library was not found.")
202+
endif()
203+
endif()

depends/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,7 @@ $(host_prefix)/share/toolchain.cmake : toolchain.cmake.in $(host_prefix)/.stamp_
286286
-e 's|@no_natpmp@|$(NO_NATPMP)|' \
287287
-e 's|@no_usdt@|$(NO_USDT)|' \
288288
-e 's|@no_harden@|$(NO_HARDEN)|' \
289+
-e 's|@multiprocess@|$(MULTIPROCESS)|' \
289290
$< > $@
290291
touch $@
291292

depends/toolchain.cmake.in

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,3 +146,12 @@ endif()
146146
if(NOT HARDENING AND "@no_harden@" STREQUAL "1")
147147
set(HARDENING OFF CACHE STRING "")
148148
endif()
149+
150+
if("@multiprocess@" STREQUAL "1")
151+
if(NOT MULTIPROCESS)
152+
set(MULTIPROCESS ON CACHE STRING "")
153+
endif()
154+
if(NOT MPGEN_PREFIX)
155+
set(MPGEN_PREFIX "${CMAKE_FIND_ROOT_PATH}/native" CACHE PATH "")
156+
endif()
157+
endif()

src/CMakeLists.txt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ add_dependencies(bitcoin_clientversion generate_build_info)
3535
add_subdirectory(crypto)
3636
add_subdirectory(univalue)
3737
add_subdirectory(util)
38+
if(MULTIPROCESS)
39+
add_subdirectory(ipc)
40+
endif()
3841

3942

4043
add_library(bitcoin_consensus_sources INTERFACE)
@@ -277,6 +280,19 @@ if(BUILD_DAEMON)
277280
)
278281
list(APPEND installable_targets bitcoind)
279282
endif()
283+
if(MULTIPROCESS)
284+
add_executable(bitcoin-node
285+
bitcoind.cpp
286+
init/bitcoin-node.cpp
287+
)
288+
target_link_libraries(bitcoin-node
289+
core_interface
290+
bitcoin_node
291+
bitcoin_ipc
292+
$<TARGET_NAME_IF_EXISTS:bitcoin_wallet>
293+
)
294+
list(APPEND installable_targets bitcoin-node)
295+
endif()
280296

281297

282298
add_library(bitcoin_cli STATIC EXCLUDE_FROM_ALL

src/ipc/CMakeLists.txt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
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+
add_library(bitcoin_ipc STATIC EXCLUDE_FROM_ALL
6+
capnp/protocol.cpp
7+
interfaces.cpp
8+
process.cpp
9+
)
10+
11+
include(GenerateMPCode)
12+
target_capnp_sources(bitcoin_ipc capnp/echo.capnp capnp/init.capnp)
13+
14+
target_link_libraries(bitcoin_ipc
15+
PRIVATE
16+
core_interface
17+
)

src/qt/CMakeLists.txt

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,12 +179,30 @@ target_link_libraries(bitcoin-qt
179179
)
180180

181181
import_plugins(bitcoin-qt)
182-
182+
set(installable_targets bitcoin-qt)
183183
if(WIN32)
184184
set_target_properties(bitcoin-qt PROPERTIES WIN32_EXECUTABLE TRUE)
185185
endif()
186186

187-
install(TARGETS bitcoin-qt
187+
if(MULTIPROCESS)
188+
add_executable(bitcoin-gui
189+
main.cpp
190+
../init/bitcoin-gui.cpp
191+
)
192+
target_link_libraries(bitcoin-gui
193+
core_interface
194+
bitcoinqt
195+
bitcoin_node
196+
bitcoin_ipc
197+
)
198+
import_plugins(bitcoin-gui)
199+
list(APPEND installable_targets bitcoin-gui)
200+
if(WIN32)
201+
set_target_properties(bitcoin-gui PROPERTIES WIN32_EXECUTABLE TRUE)
202+
endif()
203+
endif()
204+
205+
install(TARGETS ${installable_targets}
188206
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
189207
COMPONENT GUI
190208
)

src/test/CMakeLists.txt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,27 @@ if(ENABLE_WALLET)
174174
endif()
175175
endif()
176176

177+
if(MULTIPROCESS)
178+
add_library(bitcoin_ipc_test STATIC EXCLUDE_FROM_ALL
179+
ipc_test.cpp
180+
)
181+
182+
include(GenerateMPCode)
183+
target_capnp_sources(bitcoin_ipc_test ipc_test.capnp)
184+
185+
target_link_libraries(bitcoin_ipc_test
186+
PRIVATE
187+
core_interface
188+
univalue
189+
)
190+
191+
target_sources(test_bitcoin
192+
PRIVATE
193+
ipc_tests.cpp
194+
)
195+
target_link_libraries(test_bitcoin bitcoin_ipc_test)
196+
endif()
197+
177198
install(TARGETS test_bitcoin
178199
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
179200
)

0 commit comments

Comments
 (0)