#32387 ipc: add windows support
https://github.com/bitcoin/bitcoin/pull/32387 · · +2274/-775 in 90 files, 30 commits · labels: Needs rebase, IPC · draft
Goal
- Allow multiprocess node and GUI binaries to build and run on Windows
- Enables Windows users and developers to utilize and test process separation
This pull request adds Windows support for Bitcoin Core's IPC subsystem and libmultiprocess. It adapts socket handling, process spawning, and event loop mechanics for Windows APIs, consolidates Windows resource generation via CMake, and enables IPC targets across MinGW and MSVC CI configurations.
Problem: Currently, IPC and multiprocess features are disabled on Windows because libmultiprocess and the process spawning wrappers rely heavily on POSIX socket and exec primitives, preventing Windows users from using the separated process architecture.
Category: IPC / multiprocess (#3 of 20)
P2 · platform fix
- P2 because establishing Windows support allows multiprocess architecture to become cross-platform
- fulfills a stated core milestone for IPC platform coverage
P2 because platform coverage for IPC is a stated milestone for the multiprocess separation project. The PR addresses the primary gap preventing Windows users and developers from compiling and testing IPC binaries.
Membership: Implements Windows platform support across the libmultiprocess subtree and IPC interface layer.
Factors: security/stability 0, bug 0, performance 0, user value 2, leverage 2
Category: Build and CI (#9 of 55)
P3 · platform fix
- P2 because it extends Windows build configurations and CI pipelines to support IPC
- unblocks automated multiprocess testing on Windows
P3 because it enables Windows CI build jobs and cleans up Windows PE resource handling via CMake, which is worthwhile for build maintainability on Windows.
Membership: Modifies CMake build configuration, vcpkg dependencies, depends configuration, and CI environment scripts for Windows targets.
Factors: security/stability 0, bug 0, performance 0, user value 1, leverage 1
Reviewability: Stale: Needs rebase
- Needs rebase due to merge conflicts with master
- Carries temporary in-tree libmultiprocess changes while upstream PRs remain pending
The PR has merge conflicts with master and is explicitly marked draft while integrating upstream libmultiprocess changes (#231, #317, #318).
Author status: Active, rebasing against upstream and resolving Windows CI edge cases.
Resolved concerns:
- Handling of child process exit codes and wrapper process waiting on Windows without POSIX execvp
- AF_UNIX socket path handling and error translation discrepancies between POSIX and Winsock
- MSVC compilation issues with missing POSIX functions, pthreads, and constexpr limits
Agreement: Positive
- Broad support for bringing IPC support to Windows with no objections
- Concept approval without stated reasons (hebasto)
- Feedback focused on testing strategies via Guix and bitcoin-mine (Sjors)
Positive with Concept ACK from hebasto and testing discussion from Sjors.
Maintainers favor adding Windows support to IPC, with no architectural objections raised.
- hebasto: 'Concept ACK.' (2025-04-30)
- Sjors: discussed combining with Guix builds for testing (2025-04-30)
Objections: none enumerated.
Support:
- hebasto: Concept ACK [not substantive]
Participants: hebasto (support), Sjors (neutral)
State derived from the lists: support without stated reasons, no open objection (hebasto)
Review verdicts (DrahtBot): 0
- Concept ACK: hebasto
Dependencies
Enables:
- Windows support for multiprocess bitcoin (#10102)
Files
197 lines under test/bench/ci.
- src/ipc/libmultiprocess/src/mp/util.cpp +416/-37
- src/ipc/libmultiprocess/test/mp/test/connect_tests.cpp +214/-0
- src/ipc/libmultiprocess/src/mp/proxy.cpp +158/-36
- src/ipc/libmultiprocess/test/mp/test/socketlistener.h +157/-0
- src/ipc/libmultiprocess/include/mp/proxy-io.h +119/-32
- src/ipc/libmultiprocess/test/mp/test/listen_tests.cpp +49/-80
- test/functional/test_framework/ipc_util.py +126/-1
- src/ipc/libmultiprocess/test/mp/test/util_tests.cpp +112/-0
- src/ipc/libmultiprocess/include/mp/util.h +95/-16
- src/ipc/libmultiprocess/shell.nix +86/-11
- src/ipc/libmultiprocess/test/mp/test/spawn_tests.cpp +75/-10
- src/ipc/libmultiprocess/test/mp/test/test.cpp +77/-3
- src/ipc/libmultiprocess/src/mp/gen.cpp +38/-41
- src/ipc/util.h +0/-54
- src/ipc/libmultiprocess/ci/scripts/ci.sh +53/-0
- src/ipc/process.cpp +35/-9
- src/ipc/libmultiprocess/cmake/compat_config.cmake +0/-42
- src/qt/res/bitcoin-qt-res.rc +0/-40
- src/ipc/libmultiprocess/include/mp/type-number.h +24/-15
- src/CMakeLists.txt +11/-25
- src/bitcoin-cli-res.rc +0/-33
- src/bitcoin-res.rc +0/-33
- src/bitcoin-tx-res.rc +0/-33
- src/bitcoin-util-res.rc +0/-33
- src/bitcoin-wallet-res.rc +0/-33
- test/functional/interface_ipc_cli.py +32/-1
- cmake/module/AddWindowsResources.cmake +32/-0
- src/ipc/libmultiprocess/include/mp/type-chrono.h +25/-2
- src/ipc/libmultiprocess/test/mp/test/common.h +27/-0
- src/ipc/libmultiprocess/include/mp/type-struct.h +12/-12
- src/ipc/interfaces.cpp +21/-1
- src/ipc/libmultiprocess/.github/workflows/ci.yml +14/-8
- src/ipc/libmultiprocess/ci/configs/windows.bash +21/-0
- src/ipc/libmultiprocess/include/mp/type-interface.h +10/-10
- src/ipc/libmultiprocess/CMakeLists.txt +14/-5
- src/ipc/libmultiprocess/include/mp/proxy-types.h +9/-9
- src/ipc/test/ipc_tests.cpp +17/-1
- CMakeLists.txt +15/-1
- test/functional/tool_bitcoin.py +1/-14
- src/ipc/libmultiprocess/include/mp/proxy.h +8/-6
- src/bitcoin.cpp +12/-1
- src/ipc/capnp/protocol.cpp +10/-3
- src/ipc/libmultiprocess/example/calculator.cpp +4/-9
- src/ipc/libmultiprocess/example/example.cpp +8/-5
- src/ipc/libmultiprocess/example/printer.cpp +4/-9
- src/bitcoind-res.rc => cmake/windows-res.rc.in +6/-6
- src/ipc/libmultiprocess/include/mp/type-char.h +9/-3
- src/ipc/libmultiprocess/doc/versions.md +8/-2
- src/ipc/libmultiprocess/ci/configs/netbsd.bash +1/-7
- src/ipc/libmultiprocess/cmake/pthread_checks.cmake +8/-0
- src/ipc/libmultiprocess/include/mp/type-threadmap.h +4/-4
- src/util/exec.cpp +7/-1
- test/functional/interface_ipc_mining.py +6/-2
- test/functional/test_framework/test_node.py +8/-0
- src/ipc/libmultiprocess/test/mp/test/foo.h +6/-1
- src/qt/CMakeLists.txt +4/-3
- vcpkg.json +7/-0
- .github/ci-windows.py +4/-2
- src/ipc/libmultiprocess/doc/usage.md +6/-0
- src/ipc/libmultiprocess/include/mp/type-context.h +3/-3
- src/ipc/libmultiprocess/ci/configs/olddeps.bash +4/-1
- src/ipc/libmultiprocess/include/mp/type-data.h +2/-3
- src/ipc/libmultiprocess/test/mp/test/foo.capnp +5/-0
- src/util/fs.h +5/-0
- src/ipc/libmultiprocess/doc/design.md +2/-2
- src/ipc/libmultiprocess/include/mp/type-string.h +3/-1
- test/lint/test_runner/src/util.rs +3/-1
- depends/Makefile +1/-2
- src/ipc/libmultiprocess/.github/workflows/bitcoin-core-ci.yml +3/-0
- src/ipc/process.h +0/-3
- .github/ci-windows-cross.py +1/-1
- src/ipc/libmultiprocess/ci/configs/default.bash +1/-1
- src/ipc/libmultiprocess/ci/configs/freebsd.bash +1/-1
- src/ipc/libmultiprocess/ci/configs/llvm.bash +1/-1
- src/ipc/libmultiprocess/ci/configs/macos.bash +1/-1
- src/ipc/libmultiprocess/ci/configs/openbsd.bash +1/-1
- src/ipc/libmultiprocess/ci/configs/sanitize.bash +1/-1
- src/ipc/libmultiprocess/cmake/TargetCapnpSources.cmake +1/-1
- src/ipc/libmultiprocess/include/mp/type-function.h +1/-1
- src/ipc/libmultiprocess/include/mp/type-unordered-set.h +1/-1
- src/ipc/libmultiprocess/include/mp/version.h +1/-1
- src/ipc/libmultiprocess/test/CMakeLists.txt +2/-0
- src/ipc/libmultiprocess/test/mp/test/foo-types.h +2/-0
- ci/test/00_setup_env_win64.sh +0/-1
- ci/test/00_setup_env_win64_msvcrt.sh +0/-1
- depends/packages/capnp.mk +1/-0
- src/ipc/libmultiprocess/ci/README.md +1/-0
- src/ipc/libmultiprocess/include/mp/config.h.in +1/-0
- src/ipc/test/fuzz/ipc.cpp +0/-1
- _keep +0/-0
Card
This PR brings Windows support to the IPC subsystem and libmultiprocess, enabling multiprocess node binaries to build and run on Windows. It adapts socket handling, process management, and event loops for Windows APIs while configuring CMake and CI to build Cap'n Proto under MinGW and MSVC. The PR addresses a major platform coverage goal for the process separation project. Review is currently stale as the PR is marked draft, needs a rebase, and awaits upstream libmultiprocess merges.