From 102b6c32ebc6cd6fabe6d413239c2008fcf89f64 Mon Sep 17 00:00:00 2001 From: sledgehammer999 Date: Sun, 2 Oct 2022 04:11:46 +0300 Subject: [PATCH] NSIS: Refactor configuration to ease installer creation via scripting --- dist/windows/3rdparty/VersionCompleteXXXX.nsi | 61 ++++++++++++ dist/windows/README.txt | 21 +++-- dist/windows/config.nsi | 94 ++++++++++++++----- dist/windows/installer.nsi | 2 +- 4 files changed, 145 insertions(+), 33 deletions(-) create mode 100644 dist/windows/3rdparty/VersionCompleteXXXX.nsi diff --git a/dist/windows/3rdparty/VersionCompleteXXXX.nsi b/dist/windows/3rdparty/VersionCompleteXXXX.nsi new file mode 100644 index 000000000..bb5ca9d02 --- /dev/null +++ b/dist/windows/3rdparty/VersionCompleteXXXX.nsi @@ -0,0 +1,61 @@ +; Code taken from https://nsis.sourceforge.io/VersionCompleteXXXX +; See http://nsis.sourceforge.net/VersionCompleteXXXX for documentation +!macro VersionCompleteXXXRevision _INPUT_VALUE _OUTPUT_SYMBOL _REVISION + !searchparse /noerrors ${_INPUT_VALUE} "" _VERSION_1 "." _VERSION_2 "." _VERSION_3 "." _VERSION_4 + !ifndef _VERSION_1 + !define _VERSION_1 0 + !else if `${_VERSION_1}` == `` + !define /redef _VERSION_1 0 + !endif + !ifndef _VERSION_2 + !define _VERSION_2 0 + !else if `${_VERSION_2}` == `` + !define /redef _VERSION_2 0 + !endif + !ifndef _VERSION_3 + !define _VERSION_3 0 + !else if `${_VERSION_3}` == `` + !define /redef _VERSION_3 0 + !endif + !ifndef _VERSION_4 + !define _VERSION_4 0 + !else if `${_VERSION_4}` == `` + !define /redef _VERSION_4 0 + !endif + !define ${_OUTPUT_SYMBOL} ${_VERSION_1}.${_VERSION_2}.${_VERSION_3}.${_REVISION} + !undef _VERSION_1 + !undef _VERSION_2 + !undef _VERSION_3 + !undef _VERSION_4 + !undef _REVISION +!macroend +!define VersionCompleteXXXRevision `!insertmacro VersionCompleteXXXRevision` +!macro VersionCompleteXXXX _INPUT_VALUE _OUTPUT_SYMBOL + !searchparse /noerrors ${_INPUT_VALUE} "" _VERSION_1 "." _VERSION_2 "." _VERSION_3 "." _VERSION_4 + !ifndef _VERSION_1 + !define _VERSION_1 0 + !else if `${_VERSION_1}` == `` + !define /redef _VERSION_1 0 + !endif + !ifndef _VERSION_2 + !define _VERSION_2 0 + !else if `${_VERSION_2}` == `` + !define /redef _VERSION_2 0 + !endif + !ifndef _VERSION_3 + !define _VERSION_3 0 + !else if `${_VERSION_3}` == `` + !define /redef _VERSION_3 0 + !endif + !ifndef _VERSION_4 + !define _VERSION_4 0 + !else if `${_VERSION_4}` == `` + !define /redef _VERSION_4 0 + !endif + !define ${_OUTPUT_SYMBOL} ${_VERSION_1}.${_VERSION_2}.${_VERSION_3}.${_VERSION_4} + !undef _VERSION_1 + !undef _VERSION_2 + !undef _VERSION_3 + !undef _VERSION_4 +!macroend +!define VersionCompleteXXXX `!insertmacro VersionCompleteXXXX` diff --git a/dist/windows/README.txt b/dist/windows/README.txt index a1d7d1542..fe5bb562c 100644 --- a/dist/windows/README.txt +++ b/dist/windows/README.txt @@ -16,16 +16,16 @@ TRANSLATORS: PACKAGERS: -You will need NSIS and upx to make the installer. You need a unicode version of NSIS. -I tested with NSIS 3.0 (final). +You will need NSIS 3 to make the installer. UPX is an optional requirement. -1. Open the options.nsi file in an editor and change line that contains +1. Open the config.nsi file in an editor and change line that contains "!define QBT_VERSION "3.0.3"" to the version of qbittorrent you just built. -2. Extract the plugins found in the folder "nsis plugins" into your +2. config.nsi contains some other defines that control the installer output. Read the comments in that file. +3. Extract the plugins found in the folder "nsis plugins" into your NSIS's unicode Plugin directory(usually C:\Program Files\NSIS\Plugins\x86-unicode). Only the *.dll files are needed. Use the unicode version of the dlls. -3. The script you need to compile is "qbittorrent.nsi". It includes all other necessary scripts. -4. The script expects the following file tree: +4. The script you need to compile is "qbittorrent.nsi". It includes all other necessary scripts. +5. The script expects the following file tree: The installer script expects the following file tree: @@ -46,8 +46,10 @@ translations qt_zh_TW.qm installer.nsi license.txt -options.nsi +config.nsi +helper.nsi qbittorrent.exe +qbittorrent.pdb qbittorrent.nsi qt.conf translations.nsi @@ -55,9 +57,10 @@ UAC.nsh uninstaller.nsi -5. "license.txt" is a text file that contains the text rendered +6. "license.txt" is a text file that contains the text rendered from src\gui\gpl.html -6. "qbittorrent.exe" is the compiled binary file. +7. "qbittorrent.exe" is the compiled binary file. +8. "qbittorrent.pdb" is the compiled binary's PDB file. SCRIPT HACKERS: diff --git a/dist/windows/config.nsi b/dist/windows/config.nsi index 1d5d3e529..3342e2b6c 100644 --- a/dist/windows/config.nsi +++ b/dist/windows/config.nsi @@ -1,3 +1,10 @@ +;Start of user configurable options +;============================================================================== + +; Uncomment if you want to use UPX to pack the installer header +; Doing so may make antivirus software flag the installer as virus/malware +;!define USE_UPX + ; Uncomment when packaging 64bit qbittorrent ;!define QBT_IS_X64 @@ -10,25 +17,79 @@ !endif ; qBittorrent version +; The string MUST contain ONLY numbers delimited by dots. +; It MUST contain a maximum of 4 delimited numbers +; Other values will result in undefined behavior +; examples: +; 4.5.0 -> good +; 4.5.1.3 -> good +; 4.5.1.3.2 -> bad +; 4.5.0beta -> bad !define /ifndef QBT_VERSION "4.5.0" +; Option that controls the installer's window name +; If set, its value will be used like this: +; "qBittorrent ${QBT_INSTALLER_FILENAME}" +; If not set, the window name will be auto composed from QBT_VERSION, QBT_USES_QT6, QBT_IS_X64 +; If you set this define then you MUST set QBT_INSTALLER_FILENAME too. Otherwise it will be ignored. +; This define is meant to ease automation from scripts/commandline +;!define QBT_INSTALLER_WINDOWNAME + +; Option that controls the installer's window name +; If set, its value will be used like this: +; "qbittorrent_${QBT_INSTALLER_FILENAME}_setup.exe" +; If not set, the window name will be auto composed from QBT_VERSION, QBT_USES_QT6, QBT_IS_X64 +; If you set this define then you MUST set QBT_INSTALLER_WINDOWNAME too. Otherwise it will be ignored. +; This define is meant to ease automation from scripts/commandline +;!define QBT_INSTALLER_FILENAME + +;End of user configurable options +;============================================================================== + +!ifndef QBT_INSTALLER_WINDOWNAME | QBT_INSTALLER_FILENAME + !ifndef QBT_IS_X64 + ; The name of the installer + !define QBT_INSTALLER_WINDOWNAME "${QBT_VERSION}" + + ; The file to write + !define QBT_INSTALLER_FILENAME "${QBT_VERSION}" + !else ; QBT_IS_X64 + !ifndef QBT_USES_QT6 + ; The name of the installer + !define QBT_INSTALLER_WINDOWNAME "${QBT_VERSION} x64" + + ; The file to write + !define QBT_INSTALLER_FILENAME "${QBT_VERSION}_x64" + !else ; QBT_USES_QT6 + ; The name of the installer + !define QBT_INSTALLER_WINDOWNAME "${QBT_VERSION} (qt6) x64" + + ; The file to write + !define QBT_INSTALLER_FILENAME "${QBT_VERSION}_qt6_x64" + !endif ; QBT_USES_QT6 + !endif ; QBT_IS_X64 +!endif + Unicode true ManifestDPIAware true -;Compress the header too + +!ifdef USE_UPX !packhdr "$%TEMP%\exehead.tmp" 'upx.exe -9 --best --ultra-brute "$%TEMP%\exehead.tmp"' +!endif ;Setting the compression SetCompressor /SOLID LZMA SetCompressorDictSize 64 XPStyle on -!include "MUI.nsh" +!include "MUI2.nsh" !include "UAC.nsh" !include "FileFunc.nsh" !include "WinVer.nsh" !ifdef QBT_IS_X64 !include "x64.nsh" !endif +!include "3rdparty\VersionCompleteXXXX.nsi" ;For the file association !define SHCNE_ASSOCCHANGED 0x8000000 @@ -42,27 +103,11 @@ XPStyle on !define MUI_FINISHPAGE_RUN_FUNCTION PageFinishRun !define MUI_FINISHPAGE_RUN_TEXT $(launch_qbt) -!ifndef QBT_IS_X64 - ; The name of the installer - Name "qBittorrent ${QBT_VERSION}" - - ; The file to write - OutFile "qbittorrent_${QBT_VERSION}_setup.exe" -!else ; QBT_IS_X64 - !ifndef QBT_USES_QT6 - ; The name of the installer - Name "qBittorrent ${QBT_VERSION} x64" - - ; The file to write - OutFile "qbittorrent_${QBT_VERSION}_x64_setup.exe" - !else ; QBT_USES_QT6 - ; The name of the installer - Name "qBittorrent ${QBT_VERSION} (qt6) x64" +; The name of the installer +Name "qBittorrent ${QBT_INSTALLER_WINDOWNAME}" - ; The file to write - OutFile "qbittorrent_${QBT_VERSION}_qt6_x64_setup.exe" - !endif ; QBT_USES_QT6 -!endif ; QBT_IS_X64 +; The file to write +OutFile "qbittorrent_${QBT_INSTALLER_FILENAME}_setup.exe" ;Installer Version Information VIAddVersionKey "ProductName" "qBittorrent" @@ -71,7 +116,10 @@ VIAddVersionKey "LegalCopyright" "Copyright ©2006-2022 The qBittorrent project" VIAddVersionKey "FileDescription" "qBittorrent - A Bittorrent Client" VIAddVersionKey "FileVersion" "${QBT_VERSION}" -VIProductVersion "${QBT_VERSION}.0" +; VIProductVersion needs a 4 part version. +; If QBT_VERSION contains less than 4 parts then VersionCompleteXXXX, will extend it with zeroes. +${VersionCompleteXXXX} ${QBT_VERSION} VERSION_4_PART +VIProductVersion "${VERSION_4_PART}" ; The default installation directory. It changes depending if we install in the 64bit dir or not. ; A caveat of this is if a user has installed a 32bit version and then runs the 64bit installer diff --git a/dist/windows/installer.nsi b/dist/windows/installer.nsi index 1093dc632..75f2a0f95 100644 --- a/dist/windows/installer.nsi +++ b/dist/windows/installer.nsi @@ -40,7 +40,7 @@ Section $(inst_qbt_req) ;"qBittorrent (required)" WriteRegStr HKLM "Software\qBittorrent" "InstallLocation" "$INSTDIR" ; Write the uninstall keys for Windows - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qBittorrent" "DisplayName" "qBittorrent ${QBT_VERSION}" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qBittorrent" "DisplayName" "qBittorrent" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qBittorrent" "UninstallString" '"$INSTDIR\uninst.exe"' WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qBittorrent" "DisplayIcon" '"$INSTDIR\qbittorrent.exe",0' WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qBittorrent" "Publisher" "The qBittorrent project"