cmake: Add `GenerateWindowsInstaller` script
What changed, and why it matters
This commit is a build-system refactor for creating the Windows installer. It moves the NSIS installer generation logic into a separate, reusable CMake script and changes the template to use configurable directories instead of hardcoded build-tree paths. There is no indication this changes what gets installed, how user data is handled, or any runtime behavior of Bitcoin Core itself.
No security action required. Treat as ordinary build-system maintenance.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The change deletes cmake/module/GenerateSetupNsi.cmake and introduces cmake/script/GenerateWindowsInstaller.cmake.in, which is configured and invoked by Maintenance.cmake’s add_windows_deploy_target. The new script parameterizes binary and libexec directories (BIN_DIR, LIBEXEC_DIR), normalizes them with cmake_path, and configures share/setup.nsi.in to reference @BIN_DIR@ and @LIBEXEC_DIR@ rather than @abs_top_builddir@/release. It also adds COMMAND_ERROR_IS_FATAL ANY to the makensis execute_process call. The commit is preparatory for later Guix-based reproducible builds and does not alter compiled code, runtime logic, or installer content semantics.
Changed components
cmake/module/GenerateSetupNsi.cmakecmake/module/Maintenance.cmakecmake/script/GenerateWindowsInstaller.cmake.inshare/setup.nsi.inInspect captured patch +59 / −49
diff --git a/cmake/module/GenerateSetupNsi.cmake b/cmake/module/GenerateSetupNsi.cmake
deleted file mode 100644
index c8d5bd67..00000000
--- a/cmake/module/GenerateSetupNsi.cmake
+++ /dev/null
@@ -1,19 +0,0 @@
-# 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/.
-
-function(generate_setup_nsi)
- set(abs_top_srcdir ${PROJECT_SOURCE_DIR})
- set(abs_top_builddir ${PROJECT_BINARY_DIR})
- set(CLIENT_URL ${PROJECT_HOMEPAGE_URL})
- set(CLIENT_TARNAME "bitcoin")
- set(BITCOIN_WRAPPER_NAME "bitcoin")
- set(BITCOIN_GUI_NAME "bitcoin-qt")
- set(BITCOIN_DAEMON_NAME "bitcoind")
- set(BITCOIN_CLI_NAME "bitcoin-cli")
- set(BITCOIN_TX_NAME "bitcoin-tx")
- set(BITCOIN_WALLET_TOOL_NAME "bitcoin-wallet")
- set(BITCOIN_TEST_NAME "test_bitcoin")
- set(EXEEXT ${CMAKE_EXECUTABLE_SUFFIX})
- configure_file(${PROJECT_SOURCE_DIR}/share/setup.nsi.in ${PROJECT_BINARY_DIR}/bitcoin-win64-setup.nsi USE_SOURCE_PERMISSIONS @ONLY)
-endfunction()
diff --git a/cmake/module/Maintenance.cmake b/cmake/module/Maintenance.cmake
index 15fbf2be..43e145d6 100644
--- a/cmake/module/Maintenance.cmake
+++ b/cmake/module/Maintenance.cmake
@@ -19,32 +19,21 @@ function(setup_split_debug_script)
endfunction()
function(add_windows_deploy_target)
+ configure_file(${PROJECT_SOURCE_DIR}/cmake/script/GenerateWindowsInstaller.cmake.in ${PROJECT_BINARY_DIR}/GenerateWindowsInstaller.cmake USE_SOURCE_PERMISSIONS @ONLY)
if(MINGW AND TARGET bitcoin AND TARGET bitcoin-qt AND TARGET bitcoind AND TARGET bitcoin-cli AND TARGET bitcoin-tx AND TARGET bitcoin-wallet AND TARGET bitcoin-util AND TARGET test_bitcoin)
- find_program(MAKENSIS_EXECUTABLE makensis)
- if(NOT MAKENSIS_EXECUTABLE)
- add_custom_target(deploy
- COMMAND ${CMAKE_COMMAND} -E echo "Error: NSIS not found"
- )
- return()
- endif()
-
- # TODO: Consider replacing this code with the CPack NSIS Generator.
- # See https://cmake.org/cmake/help/latest/cpack_gen/nsis.html
- include(GenerateSetupNsi)
- generate_setup_nsi()
add_custom_command(
OUTPUT ${PROJECT_BINARY_DIR}/bitcoin-win64-setup.exe
- COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/release
- COMMAND ${CMAKE_STRIP} $<TARGET_FILE:bitcoin> -o ${PROJECT_BINARY_DIR}/release/$<TARGET_FILE_NAME:bitcoin>
- COMMAND ${CMAKE_STRIP} $<TARGET_FILE:bitcoin-qt> -o ${PROJECT_BINARY_DIR}/release/$<TARGET_FILE_NAME:bitcoin-qt>
- COMMAND ${CMAKE_STRIP} $<TARGET_FILE:bitcoind> -o ${PROJECT_BINARY_DIR}/release/$<TARGET_FILE_NAME:bitcoind>
- COMMAND ${CMAKE_STRIP} $<TARGET_FILE:bitcoin-cli> -o ${PROJECT_BINARY_DIR}/release/$<TARGET_FILE_NAME:bitcoin-cli>
- COMMAND ${CMAKE_STRIP} $<TARGET_FILE:bitcoin-tx> -o ${PROJECT_BINARY_DIR}/release/$<TARGET_FILE_NAME:bitcoin-tx>
- COMMAND ${CMAKE_STRIP} $<TARGET_FILE:bitcoin-wallet> -o ${PROJECT_BINARY_DIR}/release/$<TARGET_FILE_NAME:bitcoin-wallet>
- COMMAND ${CMAKE_STRIP} $<TARGET_FILE:bitcoin-util> -o ${PROJECT_BINARY_DIR}/release/$<TARGET_FILE_NAME:bitcoin-util>
- COMMAND ${CMAKE_STRIP} $<TARGET_FILE:test_bitcoin> -o ${PROJECT_BINARY_DIR}/release/$<TARGET_FILE_NAME:test_bitcoin>
- COMMAND ${MAKENSIS_EXECUTABLE} -V2 ${PROJECT_BINARY_DIR}/bitcoin-win64-setup.nsi
- VERBATIM
+ WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
+ COMMAND ${CMAKE_COMMAND} -E make_directory release
+ COMMAND ${CMAKE_STRIP} $<TARGET_FILE:bitcoin> -o release/$<TARGET_FILE_NAME:bitcoin>
+ COMMAND ${CMAKE_STRIP} $<TARGET_FILE:bitcoin-qt> -o release/$<TARGET_FILE_NAME:bitcoin-qt>
+ COMMAND ${CMAKE_STRIP} $<TARGET_FILE:bitcoind> -o release/$<TARGET_FILE_NAME:bitcoind>
+ COMMAND ${CMAKE_STRIP} $<TARGET_FILE:bitcoin-cli> -o release/$<TARGET_FILE_NAME:bitcoin-cli>
+ COMMAND ${CMAKE_STRIP} $<TARGET_FILE:bitcoin-tx> -o release/$<TARGET_FILE_NAME:bitcoin-tx>
+ COMMAND ${CMAKE_STRIP} $<TARGET_FILE:bitcoin-wallet> -o release/$<TARGET_FILE_NAME:bitcoin-wallet>
+ COMMAND ${CMAKE_STRIP} $<TARGET_FILE:bitcoin-util> -o release/$<TARGET_FILE_NAME:bitcoin-util>
+ COMMAND ${CMAKE_STRIP} $<TARGET_FILE:test_bitcoin> -o release/$<TARGET_FILE_NAME:test_bitcoin>
+ COMMAND ${CMAKE_COMMAND} -D BIN_DIR=release -D LIBEXEC_DIR=release -P GenerateWindowsInstaller.cmake
)
add_custom_target(deploy DEPENDS ${PROJECT_BINARY_DIR}/bitcoin-win64-setup.exe)
endif()
diff --git a/cmake/script/GenerateWindowsInstaller.cmake.in b/cmake/script/GenerateWindowsInstaller.cmake.in
new file mode 100644
index 00000000..16ebdd49
--- /dev/null
+++ b/cmake/script/GenerateWindowsInstaller.cmake.in
@@ -0,0 +1,40 @@
+# Copyright (c) 2026-present The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or https://opensource.org/license/mit/.
+
+find_program(MAKENSIS_EXECUTABLE makensis REQUIRED)
+
+# Project variables.
+set(CLIENT_NAME "@CLIENT_NAME@")
+set(CLIENT_VERSION_MAJOR @CLIENT_VERSION_MAJOR@)
+set(CLIENT_VERSION_MINOR @CLIENT_VERSION_MINOR@)
+set(CLIENT_VERSION_BUILD @CLIENT_VERSION_BUILD@)
+set(CLIENT_VERSION_STRING "@CLIENT_VERSION_STRING@")
+set(CLIENT_URL "@PROJECT_HOMEPAGE_URL@")
+set(COPYRIGHT_YEAR "@COPYRIGHT_YEAR@")
+set(COPYRIGHT_HOLDERS_FINAL "@COPYRIGHT_HOLDERS_FINAL@")
+set(abs_top_srcdir @PROJECT_SOURCE_DIR@)
+set(EXEEXT @CMAKE_EXECUTABLE_SUFFIX@)
+
+# Script variables.
+cmake_path(ABSOLUTE_PATH BIN_DIR NORMALIZE)
+cmake_path(ABSOLUTE_PATH LIBEXEC_DIR NORMALIZE)
+
+# Other variables required by the `setup.nsi.in` template.
+set(CLIENT_TARNAME "bitcoin")
+set(BITCOIN_WRAPPER_NAME "bitcoin")
+set(BITCOIN_GUI_NAME "bitcoin-qt")
+set(BITCOIN_DAEMON_NAME "bitcoind")
+set(BITCOIN_CLI_NAME "bitcoin-cli")
+set(BITCOIN_TX_NAME "bitcoin-tx")
+set(BITCOIN_WALLET_TOOL_NAME "bitcoin-wallet")
+set(BITCOIN_TEST_NAME "test_bitcoin")
+configure_file(@PROJECT_SOURCE_DIR@/share/setup.nsi.in ${CMAKE_CURRENT_LIST_DIR}/bitcoin-win64-setup.nsi
+ USE_SOURCE_PERMISSIONS @ONLY
+)
+
+execute_process(
+ WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
+ COMMAND ${MAKENSIS_EXECUTABLE} -V2 bitcoin-win64-setup.nsi
+ COMMAND_ERROR_IS_FATAL ANY
+)
diff --git a/share/setup.nsi.in b/share/setup.nsi.in
index 387d7811..d807b718 100644
--- a/share/setup.nsi.in
+++ b/share/setup.nsi.in
@@ -72,19 +72,19 @@ ShowUninstDetails show
Section -Main SEC0000
SetOutPath $INSTDIR
SetOverwrite on
- File @abs_top_builddir@/release/@BITCOIN_GUI_NAME@@EXEEXT@
- File @abs_top_builddir@/release/@BITCOIN_WRAPPER_NAME@@EXEEXT@
+ File @BIN_DIR@/@BITCOIN_GUI_NAME@@EXEEXT@
+ File @BIN_DIR@/@BITCOIN_WRAPPER_NAME@@EXEEXT@
File /oname=COPYING.txt @abs_top_srcdir@/COPYING
File /oname=readme.txt @abs_top_srcdir@/doc/README_windows.txt
File @abs_top_srcdir@/share/examples/bitcoin.conf
SetOutPath $INSTDIR\share\rpcauth
File @abs_top_srcdir@/share/rpcauth/*.*
SetOutPath $INSTDIR\daemon
- File @abs_top_builddir@/release/@BITCOIN_DAEMON_NAME@@EXEEXT@
- File @abs_top_builddir@/release/@BITCOIN_CLI_NAME@@EXEEXT@
- File @abs_top_builddir@/release/@BITCOIN_TX_NAME@@EXEEXT@
- File @abs_top_builddir@/release/@BITCOIN_WALLET_TOOL_NAME@@EXEEXT@
- File @abs_top_builddir@/release/@BITCOIN_TEST_NAME@@EXEEXT@
+ File @BIN_DIR@/@BITCOIN_DAEMON_NAME@@EXEEXT@
+ File @BIN_DIR@/@BITCOIN_CLI_NAME@@EXEEXT@
+ File @BIN_DIR@/@BITCOIN_TX_NAME@@EXEEXT@
+ File @BIN_DIR@/@BITCOIN_WALLET_TOOL_NAME@@EXEEXT@
+ File @LIBEXEC_DIR@/@BITCOIN_TEST_NAME@@EXEEXT@
SetOutPath $INSTDIR
WriteRegStr HKCU "${REGKEY}\Components" Main 1
SectionEnd
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.