Skip to content

Commit

Permalink
cmake: Add MULTIPROCESS option
Browse files Browse the repository at this point in the history
  • Loading branch information
hebasto committed Mar 9, 2024
1 parent 3521e2f commit 15ce077
Show file tree
Hide file tree
Showing 9 changed files with 135 additions and 2 deletions.
2 changes: 2 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ tristate_option(WITH_EXTERNAL_SIGNER
"if Boost.Process is found."
AUTO
)
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)

option(BUILD_TESTS "Build test_bitcoin executable." ON)
option(BUILD_BENCH "Build bench_bitcoin executable." ON)
Expand Down Expand Up @@ -428,6 +429,7 @@ message(" Berkeley DB, legacy wallets ......... ${WITH_BDB}")
message("Optional packages:")
message(" GUI ................................. ${WITH_GUI}")
message(" external signer ..................... ${WITH_EXTERNAL_SIGNER}")
message(" multiprocess ........................ ${MULTIPROCESS}")
message(" NAT-PMP ............................. ${WITH_NATPMP}")
message(" UPnP ................................ ${WITH_MINIUPNPC}")
message(" ZeroMQ .............................. ${WITH_ZMQ}")
Expand Down
12 changes: 12 additions & 0 deletions cmake/module/GenerateMPCode.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# 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/.

macro(generate_from_capnp capnp_relpath)
add_custom_command(
OUTPUT ${capnp_relpath}.c++ ${capnp_relpath}.h ${capnp_relpath}.proxy-client.c++ ${capnp_relpath}.proxy-types.h ${capnp_relpath}.proxy-server.c++ ${capnp_relpath}.proxy-types.c++ ${capnp_relpath}.proxy.h
COMMAND ${MPGEN_PREFIX}/bin/mpgen ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/${capnp_relpath}
DEPENDS ${capnp_relpath}
VERBATIM
)
endmacro()
14 changes: 14 additions & 0 deletions cmake/optional.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -187,3 +187,17 @@ else()
set(WITH_SQLITE OFF)
set(WITH_BDB OFF)
endif()

if(MULTIPROCESS)
# TODO: Switch to find_package() command.
include(CrossPkgConfig)
cross_pkg_check_modules(libmultiprocess libmultiprocess IMPORTED_TARGET)
if(libmultiprocess_FOUND)
set(MULTIPROCESS ON)
set(MPGEN_PREFIX "${libmultiprocess_PREFIX}" CACHE PATH "libmultiprocess codegen tool prefix.")
elseif(MULTIPROCESS STREQUAL "AUTO")
set(MULTIPROCESS OFF)
else()
message(FATAL_ERROR "\"-DMULTIPROCESS=ON\" specified, but libmultiprocess library was not found.")
endif()
endif()
1 change: 1 addition & 0 deletions depends/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,7 @@ $(host_prefix)/share/toolchain.cmake : toolchain.cmake.in $(host_prefix)/.stamp_
-e 's|@no_natpmp@|$(NO_NATPMP)|' \
-e 's|@no_usdt@|$(NO_USDT)|' \
-e 's|@no_harden@|$(NO_HARDEN)|' \
-e 's|@multiprocess@|$(MULTIPROCESS)|' \
$< > $@
touch $@

Expand Down
9 changes: 9 additions & 0 deletions depends/toolchain.cmake.in
Original file line number Diff line number Diff line change
Expand Up @@ -146,3 +146,12 @@ endif()
if(NOT HARDENING AND "@no_harden@" STREQUAL "1")
set(HARDENING OFF CACHE STRING "")
endif()

if("@multiprocess@" STREQUAL "1")
if(NOT MULTIPROCESS)
set(MULTIPROCESS ON CACHE STRING "")
endif()
if(NOT MPGEN_PREFIX)
set(MPGEN_PREFIX "${CMAKE_FIND_ROOT_PATH}/native" CACHE PATH "")
endif()
endif()
16 changes: 16 additions & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@ add_dependencies(bitcoin_clientversion generate_build_info)
add_subdirectory(crypto)
add_subdirectory(univalue)
add_subdirectory(util)
if(MULTIPROCESS)
add_subdirectory(ipc)
endif()


add_library(bitcoin_consensus_sources INTERFACE)
Expand Down Expand Up @@ -277,6 +280,19 @@ if(BUILD_DAEMON)
)
list(APPEND installable_targets bitcoind)
endif()
if(MULTIPROCESS)
add_executable(bitcoin-node
bitcoind.cpp
init/bitcoin-node.cpp
)
target_link_libraries(bitcoin-node
core_interface
bitcoin_node
bitcoin_ipc
$<TARGET_NAME_IF_EXISTS:bitcoin_wallet>
)
list(APPEND installable_targets bitcoin-node)
endif()


add_library(bitcoin_cli STATIC EXCLUDE_FROM_ALL
Expand Down
32 changes: 32 additions & 0 deletions src/ipc/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# 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/.

include(GenerateMPCode)
generate_from_capnp(capnp/echo.capnp)
generate_from_capnp(capnp/init.capnp)

add_library(bitcoin_ipc STATIC EXCLUDE_FROM_ALL
${CMAKE_CURRENT_BINARY_DIR}/capnp/echo.capnp.c++
${CMAKE_CURRENT_BINARY_DIR}/capnp/echo.capnp.proxy-client.c++
${CMAKE_CURRENT_BINARY_DIR}/capnp/echo.capnp.proxy-server.c++
${CMAKE_CURRENT_BINARY_DIR}/capnp/echo.capnp.proxy-types.c++
${CMAKE_CURRENT_BINARY_DIR}/capnp/init.capnp.c++
${CMAKE_CURRENT_BINARY_DIR}/capnp/init.capnp.proxy-client.c++
${CMAKE_CURRENT_BINARY_DIR}/capnp/init.capnp.proxy-server.c++
${CMAKE_CURRENT_BINARY_DIR}/capnp/init.capnp.proxy-types.c++
capnp/protocol.cpp
interfaces.cpp
process.cpp
)

target_include_directories(bitcoin_ipc
PUBLIC
$<BUILD_INTERFACE:${CMAKE_BINARY_DIR}>
)

target_link_libraries(bitcoin_ipc
PRIVATE
core_interface
PkgConfig::libmultiprocess
)
22 changes: 20 additions & 2 deletions src/qt/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -179,12 +179,30 @@ target_link_libraries(bitcoin-qt
)

import_plugins(bitcoin-qt)

set(installable_targets bitcoin-qt)
if(WIN32)
set_target_properties(bitcoin-qt PROPERTIES WIN32_EXECUTABLE TRUE)
endif()

install(TARGETS bitcoin-qt
if(MULTIPROCESS)
add_executable(bitcoin-gui
main.cpp
../init/bitcoin-gui.cpp
)
target_link_libraries(bitcoin-gui
core_interface
bitcoinqt
bitcoin_node
bitcoin_ipc
)
import_plugins(bitcoin-gui)
list(APPEND installable_targets bitcoin-gui)
if(WIN32)
set_target_properties(bitcoin-gui PROPERTIES WIN32_EXECUTABLE TRUE)
endif()
endif()

install(TARGETS ${installable_targets}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
COMPONENT GUI
)
29 changes: 29 additions & 0 deletions src/test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,35 @@ if(ENABLE_WALLET)
endif()
endif()

if(MULTIPROCESS)
include(GenerateMPCode)
generate_from_capnp(ipc_test.capnp)

add_library(bitcoin_ipc_test STATIC EXCLUDE_FROM_ALL
${CMAKE_CURRENT_BINARY_DIR}/ipc_test.capnp.c++
${CMAKE_CURRENT_BINARY_DIR}/ipc_test.capnp.proxy-client.c++
${CMAKE_CURRENT_BINARY_DIR}/ipc_test.capnp.proxy-server.c++
${CMAKE_CURRENT_BINARY_DIR}/ipc_test.capnp.proxy-types.c++
ipc_test.cpp
)
target_include_directories(bitcoin_ipc_test
PUBLIC
$<BUILD_INTERFACE:${CMAKE_BINARY_DIR}>
)
target_link_libraries(bitcoin_ipc_test
PRIVATE
core_interface
PkgConfig::libmultiprocess
univalue
)

target_sources(test_bitcoin
PRIVATE
ipc_tests.cpp
)
target_link_libraries(test_bitcoin bitcoin_ipc_test)
endif()

install(TARGETS test_bitcoin
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

0 comments on commit 15ce077

Please sign in to comment.