diff --git a/cmake/modules/WindowsVersionInfo.cmake b/cmake/modules/WindowsVersionInfo.cmake new file mode 100644 --- /dev/null +++ b/cmake/modules/WindowsVersionInfo.cmake @@ -0,0 +1,64 @@ +function(generate_windows_version_info TARGET) + # The file is only used on windows + if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Windows") + return() + endif() + + cmake_parse_arguments( + ARG + "" + "DESCRIPTION" + "ICONS" + ${ARGN} + ) + + set(NAME "$") + set(FILENAME "$") + + # If no description is supplied, just use the target name + set(DESCRIPTION "${NAME}") + if(ARG_DESCRIPTION) + string(APPEND DESCRIPTION " (${ARG_DESCRIPTION})") + endif() + + set(INDEX 1) + foreach(ICON ${ARG_ICONS}) + string(APPEND ICONS "IDI_ICON${INDEX} ICON DISCARDABLE \"${CMAKE_CURRENT_SOURCE_DIR}/${ICON}\"\n") + math(EXPR INDEX "${INDEX} + 1") + endforeach() + + # First replace the variables + configure_file( + "${CMAKE_SOURCE_DIR}/cmake/templates/version.rc.in" + "${TARGET}-version.rc.in" + ) + + # Then interpret the generator expressions to get the final version file. + # The output file is generated for each configuration and the name should be + # unique, so append it the configuration name. + set(CONFIG_VERSION_FILE "${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_$.rc") + file(GENERATE + OUTPUT "${CONFIG_VERSION_FILE}" + INPUT "${CMAKE_CURRENT_BINARY_DIR}/${TARGET}-version.rc.in" + ) + + # Now we have a proper resource file which needs to be added to the target + # sources. But this file is generated at the end of the configuration process, + # so cmake will error out because it is unable to find the file. + # The solution is to mark the file as generated, which should be as simple as + # setting the property to it. Unfortunately the functions for setting source + # file properties do not support generator expressions yet in the file name, + # so we cannot use them. + # A workaroud is to use a custom command to copy the file, which will cause + # it to be marked as generated by cmake. + set(VERSION_FILE "${CMAKE_CURRENT_BINARY_DIR}/${TARGET}.rc") + add_custom_command( + OUTPUT "${VERSION_FILE}" + COMMENT "Creating version file for ${TARGET}" + COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${CONFIG_VERSION_FILE}" "${VERSION_FILE}" + DEPENDS "${CONFIG_VERSION_FILE}" + ) + + # Add the version file to the target sources + target_sources("${TARGET}" PRIVATE "${VERSION_FILE}") +endfunction() diff --git a/src/bitcoind-res.rc b/cmake/templates/version.rc.in rename from src/bitcoind-res.rc rename to cmake/templates/version.rc.in --- a/src/bitcoind-res.rc +++ b/cmake/templates/version.rc.in @@ -1,3 +1,5 @@ +${ICONS} + #include // needed for VERSIONINFO #include // holds the needed client version information @@ -16,14 +18,14 @@ BEGIN BLOCK "040904E4" // U.S. English - multilingual (hex) BEGIN - VALUE "CompanyName", "Bitcoin" - VALUE "FileDescription", "bitcoind (Bitcoin node with a JSON-RPC server)" + VALUE "CompanyName", "Bitcoin ABC" + VALUE "FileDescription", "${DESCRIPTION}" VALUE "FileVersion", VER_FILEVERSION_STR - VALUE "InternalName", "bitcoind" + VALUE "InternalName", "${NAME}" VALUE "LegalCopyright", COPYRIGHT_STR VALUE "LegalTrademarks1", "Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php." - VALUE "OriginalFilename", "bitcoind.exe" - VALUE "ProductName", "bitcoind" + VALUE "OriginalFilename", "${FILENAME}" + VALUE "ProductName", "${NAME}" VALUE "ProductVersion", VER_PRODUCTVERSION_STR END END @@ -32,4 +34,4 @@ BEGIN VALUE "Translation", 0x0, 1252 // language neutral - multilingual (decimal) END -END +END \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -578,6 +578,7 @@ add_subdirectory(bench) include(BinaryTest) +include(WindowsVersionInfo) # Wallet if(BUILD_BITCOIN_WALLET) @@ -586,9 +587,9 @@ # bitcoin-wallet add_executable(bitcoin-wallet bitcoin-wallet.cpp) - if(${CMAKE_SYSTEM_NAME} MATCHES "Windows") - target_sources(bitcoin-wallet PRIVATE bitcoin-wallet-res.rc) - endif() + generate_windows_version_info(bitcoin-wallet + DESCRIPTION "CLI tool for ${PACKAGE_NAME} wallets" + ) target_link_libraries(bitcoin-wallet wallet-tool common util) @@ -619,9 +620,9 @@ # bitcoin-cli if(BUILD_BITCOIN_CLI) add_executable(bitcoin-cli bitcoin-cli.cpp) - if(${CMAKE_SYSTEM_NAME} MATCHES "Windows") - target_sources(bitcoin-cli PRIVATE bitcoin-cli-res.rc) - endif() + generate_windows_version_info(bitcoin-cli + DESCRIPTION "JSON-RPC client for ${PACKAGE_NAME}" + ) target_link_libraries(bitcoin-cli common rpcclient Event::event) @@ -635,9 +636,9 @@ # bitcoin-tx if(BUILD_BITCOIN_TX) add_executable(bitcoin-tx bitcoin-tx.cpp) - if(${CMAKE_SYSTEM_NAME} MATCHES "Windows") - target_sources(bitcoin-tx PRIVATE bitcoin-tx-res.rc) - endif() + generate_windows_version_info(bitcoin-tx + DESCRIPTION "CLI Bitcoin transaction editor utility" + ) target_link_libraries(bitcoin-tx bitcoinconsensus) @@ -651,9 +652,9 @@ # bitcoind add_executable(bitcoind bitcoind.cpp) target_link_libraries(bitcoind server) -if(${CMAKE_SYSTEM_NAME} MATCHES "Windows") - target_sources(bitcoind PRIVATE bitcoind-res.rc) -endif() +generate_windows_version_info(bitcoind + DESCRIPTION "Bitcoin node with a JSON-RPC server" +) add_to_symbols_check(bitcoind) add_to_security_check(bitcoind) diff --git a/src/bitcoin-cli-res.rc b/src/bitcoin-cli-res.rc deleted file mode 100644 --- a/src/bitcoin-cli-res.rc +++ /dev/null @@ -1,35 +0,0 @@ -#include // needed for VERSIONINFO -#include // holds the needed client version information - -#define VER_PRODUCTVERSION CLIENT_VERSION_MAJOR,CLIENT_VERSION_MINOR,CLIENT_VERSION_REVISION -#define VER_PRODUCTVERSION_STR STRINGIZE(CLIENT_VERSION_MAJOR) "." STRINGIZE(CLIENT_VERSION_MINOR) "." STRINGIZE(CLIENT_VERSION_REVISION) -#define VER_FILEVERSION VER_PRODUCTVERSION -#define VER_FILEVERSION_STR VER_PRODUCTVERSION_STR - -VS_VERSION_INFO VERSIONINFO -FILEVERSION VER_FILEVERSION -PRODUCTVERSION VER_PRODUCTVERSION -FILEOS VOS_NT_WINDOWS32 -FILETYPE VFT_APP -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904E4" // U.S. English - multilingual (hex) - BEGIN - VALUE "CompanyName", "Bitcoin" - VALUE "FileDescription", "bitcoin-cli (JSON-RPC client for " PACKAGE_NAME ")" - VALUE "FileVersion", VER_FILEVERSION_STR - VALUE "InternalName", "bitcoin-cli" - VALUE "LegalCopyright", COPYRIGHT_STR - VALUE "LegalTrademarks1", "Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php." - VALUE "OriginalFilename", "bitcoin-cli.exe" - VALUE "ProductName", "bitcoin-cli" - VALUE "ProductVersion", VER_PRODUCTVERSION_STR - END - END - - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x0, 1252 // language neutral - multilingual (decimal) - END -END diff --git a/src/bitcoin-tx-res.rc b/src/bitcoin-tx-res.rc deleted file mode 100644 --- a/src/bitcoin-tx-res.rc +++ /dev/null @@ -1,35 +0,0 @@ -#include // needed for VERSIONINFO -#include // holds the needed client version information - -#define VER_PRODUCTVERSION CLIENT_VERSION_MAJOR,CLIENT_VERSION_MINOR,CLIENT_VERSION_REVISION -#define VER_PRODUCTVERSION_STR STRINGIZE(CLIENT_VERSION_MAJOR) "." STRINGIZE(CLIENT_VERSION_MINOR) "." STRINGIZE(CLIENT_VERSION_REVISION) -#define VER_FILEVERSION VER_PRODUCTVERSION -#define VER_FILEVERSION_STR VER_PRODUCTVERSION_STR - -VS_VERSION_INFO VERSIONINFO -FILEVERSION VER_FILEVERSION -PRODUCTVERSION VER_PRODUCTVERSION -FILEOS VOS_NT_WINDOWS32 -FILETYPE VFT_APP -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904E4" // U.S. English - multilingual (hex) - BEGIN - VALUE "CompanyName", "Bitcoin" - VALUE "FileDescription", "bitcoin-tx (CLI Bitcoin transaction editor utility)" - VALUE "FileVersion", VER_FILEVERSION_STR - VALUE "InternalName", "bitcoin-tx" - VALUE "LegalCopyright", COPYRIGHT_STR - VALUE "LegalTrademarks1", "Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php." - VALUE "OriginalFilename", "bitcoin-tx.exe" - VALUE "ProductName", "bitcoin-tx" - VALUE "ProductVersion", VER_PRODUCTVERSION_STR - END - END - - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x0, 1252 // language neutral - multilingual (decimal) - END -END diff --git a/src/bitcoin-wallet-res.rc b/src/bitcoin-wallet-res.rc deleted file mode 100644 --- a/src/bitcoin-wallet-res.rc +++ /dev/null @@ -1,35 +0,0 @@ -#include // needed for VERSIONINFO -#include // holds the needed client version information - -#define VER_PRODUCTVERSION CLIENT_VERSION_MAJOR,CLIENT_VERSION_MINOR,CLIENT_VERSION_REVISION -#define VER_PRODUCTVERSION_STR STRINGIZE(CLIENT_VERSION_MAJOR) "." STRINGIZE(CLIENT_VERSION_MINOR) "." STRINGIZE(CLIENT_VERSION_REVISION) -#define VER_FILEVERSION VER_PRODUCTVERSION -#define VER_FILEVERSION_STR VER_PRODUCTVERSION_STR - -VS_VERSION_INFO VERSIONINFO -FILEVERSION VER_FILEVERSION -PRODUCTVERSION VER_PRODUCTVERSION -FILEOS VOS_NT_WINDOWS32 -FILETYPE VFT_APP -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904E4" // U.S. English - multilingual (hex) - BEGIN - VALUE "CompanyName", "Bitcoin" - VALUE "FileDescription", "bitcoin-wallet (CLI tool for " PACKAGE_NAME " wallets)" - VALUE "FileVersion", VER_FILEVERSION_STR - VALUE "InternalName", "bitcoin-wallet" - VALUE "LegalCopyright", COPYRIGHT_STR - VALUE "LegalTrademarks1", "Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php." - VALUE "OriginalFilename", "bitcoin-wallet.exe" - VALUE "ProductName", "bitcoin-wallet" - VALUE "ProductVersion", VER_PRODUCTVERSION_STR - END - END - - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x0, 1252 // language neutral - multilingual (decimal) - END -END diff --git a/src/qt/CMakeLists.txt b/src/qt/CMakeLists.txt --- a/src/qt/CMakeLists.txt +++ b/src/qt/CMakeLists.txt @@ -330,9 +330,13 @@ # The executable add_executable(bitcoin-qt WIN32 main.cpp) -if(${CMAKE_SYSTEM_NAME} MATCHES "Windows") - target_sources(bitcoin-qt PRIVATE res/bitcoin-qt-res.rc) -endif() +include(WindowsVersionInfo) +generate_windows_version_info(bitcoin-qt + DESCRIPTION "GUI node for Bitcoin" + ICONS + "res/icons/bitcoin.ico" + "res/icons/bitcoin_testnet.ico" +) target_link_libraries(bitcoin-qt bitcoin-qt-base) include(BinaryTest) diff --git a/src/qt/res/bitcoin-qt-res.rc b/src/qt/res/bitcoin-qt-res.rc deleted file mode 100644 --- a/src/qt/res/bitcoin-qt-res.rc +++ /dev/null @@ -1,38 +0,0 @@ -IDI_ICON1 ICON DISCARDABLE "icons/bitcoin.ico" -IDI_ICON2 ICON DISCARDABLE "icons/bitcoin_testnet.ico" - -#include // needed for VERSIONINFO -#include // holds the needed client version information - -#define VER_PRODUCTVERSION CLIENT_VERSION_MAJOR,CLIENT_VERSION_MINOR,CLIENT_VERSION_REVISION -#define VER_PRODUCTVERSION_STR STRINGIZE(CLIENT_VERSION_MAJOR) "." STRINGIZE(CLIENT_VERSION_MINOR) "." STRINGIZE(CLIENT_VERSION_REVISION) -#define VER_FILEVERSION VER_PRODUCTVERSION -#define VER_FILEVERSION_STR VER_PRODUCTVERSION_STR - -VS_VERSION_INFO VERSIONINFO -FILEVERSION VER_FILEVERSION -PRODUCTVERSION VER_PRODUCTVERSION -FILEOS VOS_NT_WINDOWS32 -FILETYPE VFT_APP -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904E4" // U.S. English - multilingual (hex) - BEGIN - VALUE "CompanyName", "Bitcoin" - VALUE "FileDescription", PACKAGE_NAME " (GUI node for Bitcoin)" - VALUE "FileVersion", VER_FILEVERSION_STR - VALUE "InternalName", "bitcoin-qt" - VALUE "LegalCopyright", COPYRIGHT_STR - VALUE "LegalTrademarks1", "Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php." - VALUE "OriginalFilename", "bitcoin-qt.exe" - VALUE "ProductName", PACKAGE_NAME - VALUE "ProductVersion", VER_PRODUCTVERSION_STR - END - END - - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x0, 1252 // language neutral - multilingual (decimal) - END -END