cmake: Add GenerateWindowsInstaller script

The new script is parameterized by paths to executables. It can be used
to generate the installer from the install tree rather than the build
tree. This capability will be used by the Guix scripts in subsequent
commits.
This commit is contained in:
Hennadii Stepanov
2026-06-20 00:14:58 +01:00
committed by fanquake
parent 18c05d9301
commit a3b5dc0572
4 changed files with 59 additions and 49 deletions

View File

@@ -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()

View File

@@ -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()

View File

@@ -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
)

View File

@@ -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