From 7d69bba466fc88c18320652d874ec166ff58d9d4 Mon Sep 17 00:00:00 2001 From: Hennadii Stepanov <32963518+hebasto@users.noreply.github.com> Date: Tue, 12 Mar 2024 19:46:52 +0000 Subject: [PATCH] cmake: Add `MULTIPROCESS` option --- CMakeLists.txt | 2 ++ cmake/optional.cmake | 12 ++++++++++++ depends/Makefile | 1 + depends/toolchain.cmake.in | 9 +++++++++ src/CMakeLists.txt | 16 ++++++++++++++++ src/ipc/CMakeLists.txt | 18 ++++++++++++++++++ src/qt/CMakeLists.txt | 22 ++++++++++++++++++++-- src/test/CMakeLists.txt | 22 ++++++++++++++++++++++ 8 files changed, 100 insertions(+), 2 deletions(-) create mode 100644 src/ipc/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 18f1270747547..ba18385e4115f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -84,6 +84,7 @@ tristate_option(WITH_EXTERNAL_SIGNER AUTO ) tristate_option(WITH_QRENCODE "Enable QR code support." "if libqrencode 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) cmake_dependent_option(BUILD_GUI_TESTS "Build test_bitcoin-qt executable." ON "BUILD_TESTS" OFF) @@ -538,6 +539,7 @@ if(WITH_GUI) message(" QR code (GUI) ....................... ${WITH_QRENCODE}") endif() message(" external signer ..................... ${WITH_EXTERNAL_SIGNER}") +message(" multiprocess ........................ ${MULTIPROCESS}") message(" NAT-PMP ............................. ${WITH_NATPMP}") message(" UPnP ................................ ${WITH_MINIUPNPC}") message(" ZeroMQ .............................. ${WITH_ZMQ}") diff --git a/cmake/optional.cmake b/cmake/optional.cmake index 96db91f736eee..f2a0c24f484bb 100644 --- a/cmake/optional.cmake +++ b/cmake/optional.cmake @@ -207,3 +207,15 @@ if(WITH_GUI AND WITH_QRENCODE) message(FATAL_ERROR "libqrencode requested, but not found.") endif() endif() + +if(MULTIPROCESS) + find_package(Libmultiprocess CONFIG) + find_package(LibmultiprocessGen CONFIG) + if(TARGET Libmultiprocess::multiprocess AND TARGET Libmultiprocess::mpgen) + set(MULTIPROCESS ON) + elseif(MULTIPROCESS STREQUAL "AUTO") + set(MULTIPROCESS OFF) + else() + message(FATAL_ERROR "\"-DMULTIPROCESS=ON\" specified, but libmultiprocess library was not found.") + endif() +endif() diff --git a/depends/Makefile b/depends/Makefile index 664384a09ed57..50825d8d5d9f3 100644 --- a/depends/Makefile +++ b/depends/Makefile @@ -295,6 +295,7 @@ $(host_prefix)/toolchain.cmake : toolchain.cmake.in $(host_prefix)/.stamp_$(fina -e 's|@no_natpmp@|$(NO_NATPMP)|' \ -e 's|@no_usdt@|$(NO_USDT)|' \ -e 's|@no_harden@|$(NO_HARDEN)|' \ + -e 's|@multiprocess@|$(MULTIPROCESS)|' \ $< > $@ touch $@ diff --git a/depends/toolchain.cmake.in b/depends/toolchain.cmake.in index 4771d80005efa..f5178585c1529 100644 --- a/depends/toolchain.cmake.in +++ b/depends/toolchain.cmake.in @@ -153,3 +153,12 @@ endif() if(NOT HARDENING AND "@no_harden@" STREQUAL "1") set(HARDENING OFF CACHE STRING "Attempt to harden the resulting executables.") endif() + +if("@multiprocess@" STREQUAL "1") + if(NOT MULTIPROCESS) + set(MULTIPROCESS ON CACHE STRING "") + endif() + if(NOT LibmultiprocessGen_DIR) + set(LibmultiprocessGen_DIR "${CMAKE_FIND_ROOT_PATH}/native/lib/cmake/LibmultiprocessGen" CACHE PATH "") + endif() +endif() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3c315bea099f5..2100664b4c200 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -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) @@ -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 + $ + ) + list(APPEND installable_targets bitcoin-node) +endif() add_library(bitcoin_cli STATIC EXCLUDE_FROM_ALL diff --git a/src/ipc/CMakeLists.txt b/src/ipc/CMakeLists.txt new file mode 100644 index 0000000000000..4e4f6314e0ef2 --- /dev/null +++ b/src/ipc/CMakeLists.txt @@ -0,0 +1,18 @@ +# 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/. + +add_library(bitcoin_ipc STATIC EXCLUDE_FROM_ALL + capnp/protocol.cpp + interfaces.cpp + process.cpp +) + +target_capnp_sources(bitcoin_ipc ${CMAKE_SOURCE_DIR} + capnp/echo.capnp capnp/init.capnp +) + +target_link_libraries(bitcoin_ipc + PRIVATE + core_interface +) diff --git a/src/qt/CMakeLists.txt b/src/qt/CMakeLists.txt index 45b8b50da2334..b528b4d68acfc 100644 --- a/src/qt/CMakeLists.txt +++ b/src/qt/CMakeLists.txt @@ -202,12 +202,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 ) diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt index 328944feb45c8..bb3e94ab7f883 100644 --- a/src/test/CMakeLists.txt +++ b/src/test/CMakeLists.txt @@ -175,6 +175,28 @@ if(ENABLE_WALLET) endif() endif() +if(MULTIPROCESS) + add_library(bitcoin_ipc_test STATIC EXCLUDE_FROM_ALL + ipc_test.cpp + ) + + target_capnp_sources(bitcoin_ipc_test ${CMAKE_SOURCE_DIR} + ipc_test.capnp + ) + + target_link_libraries(bitcoin_ipc_test + PRIVATE + core_interface + 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} )