From 6a3412de1f3105f395e03fec023bbc67b69c5dcc Mon Sep 17 00:00:00 2001 From: Shawn Hoffman Date: Fri, 16 Sep 2022 06:27:25 -0700 Subject: [PATCH] update nsis installer * MUI2 * add new langs supported by nsis 3.08 * MultiUser * specify arch and build version on command line --- Installer/Installer.nsi | 212 +++++++++++++++++++++++----------------- Installer/license.txt | 1 - 2 files changed, 125 insertions(+), 88 deletions(-) delete mode 100644 Installer/license.txt diff --git a/Installer/Installer.nsi b/Installer/Installer.nsi index 1ad09ddce8..f52497f8ce 100644 --- a/Installer/Installer.nsi +++ b/Installer/Installer.nsi @@ -1,38 +1,53 @@ -!define DOLPHIN_ARCH x64 -!define BASE_INSTALL_DIR "$PROGRAMFILES64" +; Usage: +; get the latest nsis: https://nsis.sourceforge.io/Download +; probably also want vscode extension: https://marketplace.visualstudio.com/items?itemName=idleberg.nsis +; makensis /DDOLPHIN_ARCH= /PRODUCT_VERSION= + +; Require /DDOLPHIN_ARCH= to makensis. +; TODO support packing both archs in single installer. +!ifndef DOLPHIN_ARCH + !error "DOLPHIN_ARCH must be defined" +!endif +; Require /PRODUCT_VERSION= to makensis. +!ifndef PRODUCT_VERSION + !error "PRODUCT_VERSION must be defined" +!endif + !define PRODUCT_NAME "Dolphin" -!define PRODUCT_VERSION 5.0 - -!define BASE_DIR "..\Binary\${DOLPHIN_ARCH}" - -; HM NIS Edit Wizard helper defines !define PRODUCT_PUBLISHER "Dolphin Team" !define PRODUCT_WEB_SITE "https://dolphin-emu.org/" !define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\${PRODUCT_NAME}.exe" !define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" -!define PRODUCT_UNINST_ROOT_KEY "HKLM" +!define BINARY_SOURCE_DIR "..\Binary\${DOLPHIN_ARCH}" + +Name "${PRODUCT_NAME}" +OutFile "dolphin-${DOLPHIN_ARCH}-${PRODUCT_VERSION}.exe" SetCompressor /SOLID lzma +ShowInstDetails show +ShowUnInstDetails show -!include "FileFunc.nsh" +; Setup MultiUser support: +; If launched without ability to elevate, user will not see any extra options. +; If user has ability to elevate, they can choose to install system-wide, with default to CurrentUser. +!define MULTIUSER_EXECUTIONLEVEL Highest +!define MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER +!define MULTIUSER_INSTALLMODE_INSTDIR "${PRODUCT_NAME}" +!define MULTIUSER_MUI +!define MULTIUSER_INSTALLMODE_COMMANDLINE +!define MULTIUSER_USE_PROGRAMFILES64 +!include "MultiUser.nsh" -; MUI 1.67 compatible ------ -!include "MUI.nsh" +!include "MUI2.nsh" ; MUI Settings -!define MUI_ABORTWARNING !define MUI_ICON "Dolphin.ico" !define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico" -; Language Selection Dialog Settings -!define MUI_LANGDLL_REGISTRY_ROOT "${PRODUCT_UNINST_ROOT_KEY}" -!define MUI_LANGDLL_REGISTRY_KEY "${PRODUCT_UNINST_KEY}" -!define MUI_LANGDLL_REGISTRY_VALUENAME "NSIS:Language" - ; License page -!insertmacro MUI_PAGE_LICENSE "..\license.txt" -; Components page -!insertmacro MUI_PAGE_COMPONENTS +!insertmacro MUI_PAGE_LICENSE "..\Data\license.txt" +; All/Current user selection page +!insertmacro MULTIUSER_PAGE_INSTALLMODE ; Directory page !insertmacro MUI_PAGE_DIRECTORY ; Instfiles page @@ -47,25 +62,31 @@ SetCompressor /SOLID lzma !insertmacro MUI_LANGUAGE "Afrikaans" !insertmacro MUI_LANGUAGE "Albanian" !insertmacro MUI_LANGUAGE "Arabic" +!insertmacro MUI_LANGUAGE "Armenian" +!insertmacro MUI_LANGUAGE "Asturian" !insertmacro MUI_LANGUAGE "Basque" !insertmacro MUI_LANGUAGE "Belarusian" !insertmacro MUI_LANGUAGE "Bosnian" !insertmacro MUI_LANGUAGE "Breton" !insertmacro MUI_LANGUAGE "Bulgarian" !insertmacro MUI_LANGUAGE "Catalan" +!insertmacro MUI_LANGUAGE "Corsican" !insertmacro MUI_LANGUAGE "Croatian" !insertmacro MUI_LANGUAGE "Czech" !insertmacro MUI_LANGUAGE "Danish" !insertmacro MUI_LANGUAGE "Dutch" !insertmacro MUI_LANGUAGE "English" +!insertmacro MUI_LANGUAGE "Esperanto" !insertmacro MUI_LANGUAGE "Estonian" !insertmacro MUI_LANGUAGE "Farsi" !insertmacro MUI_LANGUAGE "Finnish" !insertmacro MUI_LANGUAGE "French" !insertmacro MUI_LANGUAGE "Galician" +!insertmacro MUI_LANGUAGE "Georgian" !insertmacro MUI_LANGUAGE "German" !insertmacro MUI_LANGUAGE "Greek" !insertmacro MUI_LANGUAGE "Hebrew" +!insertmacro MUI_LANGUAGE "Hindi" !insertmacro MUI_LANGUAGE "Hungarian" !insertmacro MUI_LANGUAGE "Icelandic" !insertmacro MUI_LANGUAGE "Indonesian" @@ -82,11 +103,13 @@ SetCompressor /SOLID lzma !insertmacro MUI_LANGUAGE "Mongolian" !insertmacro MUI_LANGUAGE "Norwegian" !insertmacro MUI_LANGUAGE "NorwegianNynorsk" +!insertmacro MUI_LANGUAGE "Pashto" !insertmacro MUI_LANGUAGE "Polish" !insertmacro MUI_LANGUAGE "Portuguese" !insertmacro MUI_LANGUAGE "PortugueseBR" !insertmacro MUI_LANGUAGE "Romanian" !insertmacro MUI_LANGUAGE "Russian" +!insertmacro MUI_LANGUAGE "ScotsGaelic" !insertmacro MUI_LANGUAGE "Serbian" !insertmacro MUI_LANGUAGE "SerbianLatin" !insertmacro MUI_LANGUAGE "SimpChinese" @@ -95,114 +118,129 @@ SetCompressor /SOLID lzma !insertmacro MUI_LANGUAGE "Spanish" !insertmacro MUI_LANGUAGE "SpanishInternational" !insertmacro MUI_LANGUAGE "Swedish" +!insertmacro MUI_LANGUAGE "Tatar" !insertmacro MUI_LANGUAGE "Thai" !insertmacro MUI_LANGUAGE "TradChinese" !insertmacro MUI_LANGUAGE "Turkish" !insertmacro MUI_LANGUAGE "Ukrainian" !insertmacro MUI_LANGUAGE "Uzbek" +!insertmacro MUI_LANGUAGE "Vietnamese" !insertmacro MUI_LANGUAGE "Welsh" -; Reserve files -!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS - ; MUI end ------ -Name "${PRODUCT_NAME}" -!define UN_NAME "Uninstall $(^Name)" -OutFile "dolphin-${DOLPHIN_ARCH}-${PRODUCT_VERSION}.exe" -InstallDir "${BASE_INSTALL_DIR}\$(^Name)" -InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" "" -ShowInstDetails show -ShowUnInstDetails show +!include "WinVer.nsh" +; Declare the installer itself as win10/win11 compatible, so WinVer.nsh works correctly. +ManifestSupportedOS {8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a} Function .onInit + !insertmacro MULTIUSER_INIT + + ; Keep in sync with build_info.txt + !define MIN_WIN10_VERSION 1703 + ${IfNot} ${AtLeastwin10} + ${OrIfNot} ${AtLeastWaaS} ${MIN_WIN10_VERSION} + MessageBox MB_OK "At least Windows 10 version ${MIN_WIN10_VERSION} is required." + Abort + ${EndIf} + !insertmacro MUI_LANGDLL_DISPLAY FunctionEnd -Section "Base" SEC01 +Function un.onInit + !insertmacro MULTIUSER_UNINIT +FunctionEnd + +Var DisplayName +!macro UPDATE_DISPLAYNAME + ${If} $MultiUser.InstallMode == "CurrentUser" + StrCpy $DisplayName "$(^Name) (User)" + ${Else} + StrCpy $DisplayName "$(^Name)" + ${EndIf} +!macroend + +Section "Base" SectionIn RO - SetShellVarContext all - ; Dolphin exe and dlls - ; TODO: Make a nice subsection-ized display + SetOutPath "$INSTDIR" - SetOverwrite ifnewer - ; Only delete what we put there; all $INSTDIR\User is left as is - Delete "$INSTDIR\uninst.exe" - Delete "$INSTDIR\license.txt" - Delete "$INSTDIR\*.dll" - Delete "$INSTDIR\Dolphin.exe" - Delete "$INSTDIR\DSPTool.exe" - Delete "$INSTDIR\cpack_package_description.txt" - Delete "$INSTDIR\qt.conf" + + ; Clean up some old files possibly leftover from previous installs + ; We only need to care about files which would cause problems if they were to + ; be unexpectedly dynamically picked up by the incoming install. + ; Note NSIS will happily install the same thing even if already installed. RMDir /r "$INSTDIR\Sys" RMDir /r "$INSTDIR\Languages" - File "${BASE_DIR}\Dolphin.exe" - File "${BASE_DIR}\license.txt" - File "${BASE_DIR}\*.dll" - File "${BASE_DIR}\DSPTool.exe" - File "${BASE_DIR}\Updater.exe" - File "${BASE_DIR}\qt.conf" - File /r "${BASE_DIR}\QtPlugins" - File /r "${BASE_DIR}\Languages" - File /r "${BASE_DIR}\Sys" - + ; The binplaced build output will be included verbatim. + File /r "${BINARY_SOURCE_DIR}\*" + + !insertmacro UPDATE_DISPLAYNAME + + ; Create start menu and desktop shortcuts ; This needs to be done after Dolphin.exe is copied CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}" - CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\Dolphin.exe" - CreateShortCut "$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\Dolphin.exe" - + CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\$DisplayName.lnk" "$INSTDIR\Dolphin.exe" + CreateShortCut "$DESKTOP\$DisplayName.lnk" "$INSTDIR\Dolphin.exe" + + ; ?? SetOutPath "$TEMP" - SetOverwrite on SectionEnd Section -AdditionalIcons - CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${UN_NAME}.lnk" "$INSTDIR\uninst.exe" + ; Create start menu shortcut for the uninstaller + CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Uninstall $DisplayName.lnk" "$INSTDIR\uninst.exe" "/$MultiUser.InstallMode" SectionEnd +!include "FileFunc.nsh" + Section -Post WriteUninstaller "$INSTDIR\uninst.exe" - WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\Dolphin.exe" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\Dolphin.exe" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "InstallLocation" "$INSTDIR" + + WriteRegStr SHCTX "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\Dolphin.exe" + + ; Write metadata for add/remove programs applet + WriteRegStr SHCTX "${PRODUCT_UNINST_KEY}" "DisplayName" "$DisplayName" + WriteRegStr SHCTX "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe /$MultiUser.InstallMode" + WriteRegStr SHCTX "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\Dolphin.exe" + WriteRegStr SHCTX "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}" + WriteRegStr SHCTX "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}" + WriteRegStr SHCTX "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}" + WriteRegStr SHCTX "${PRODUCT_UNINST_KEY}" "InstallLocation" "$INSTDIR" ${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2 IntFmt $0 "0x%08X" $0 - WriteRegDWORD ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "EstimatedSize" "$0" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Comments" "GameCube and Wii emulator" + WriteRegDWORD SHCTX "${PRODUCT_UNINST_KEY}" "EstimatedSize" "$0" + WriteRegStr SHCTX "${PRODUCT_UNINST_KEY}" "Comments" "GameCube and Wii emulator" SectionEnd -; Section descriptions -!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN - !insertmacro MUI_DESCRIPTION_TEXT ${SEC01} "Installs all files required to run the Dolphin Emulator." -!insertmacro MUI_FUNCTION_DESCRIPTION_END - Section Uninstall - SetShellVarContext all - ; Only uninstall what we put there; all $INSTDIR\User is left as is - Delete "$INSTDIR\uninst.exe" - Delete "$INSTDIR\license.txt" - Delete "$INSTDIR\*.dll" - Delete "$INSTDIR\Dolphin.exe" - Delete "$INSTDIR\qt.conf" - Delete "$INSTDIR\DSPTool.exe" - Delete "$INSTDIR\Updater.exe" + !insertmacro UPDATE_DISPLAYNAME - Delete "$SMPROGRAMS\${PRODUCT_NAME}\${UN_NAME}.lnk" - Delete "$DESKTOP\${PRODUCT_NAME}.lnk" - Delete "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" + Delete "$SMPROGRAMS\${PRODUCT_NAME}\Uninstall $DisplayName.lnk" + Delete "$DESKTOP\$DisplayName.lnk" + Delete "$SMPROGRAMS\${PRODUCT_NAME}\$DisplayName.lnk" RMDir "$SMPROGRAMS\${PRODUCT_NAME}" + + ; Be a bit careful to not delete files a user may have put into the install directory. + Delete "$INSTDIR\*.dll" + Delete "$INSTDIR\build_info.txt" + Delete "$INSTDIR\Dolphin.exe" + Delete "$INSTDIR\DolphinTool.exe" + Delete "$INSTDIR\DSPTool.exe" + Delete "$INSTDIR\license.txt" + Delete "$INSTDIR\qt.conf" + Delete "$INSTDIR\uninst.exe" + Delete "$INSTDIR\Updater.exe" + Delete "$INSTDIR\Updater.log" RMDir /r "$INSTDIR\Sys" RMDir /r "$INSTDIR\Languages" RMDir /r "$INSTDIR\QtPlugins" RMDir "$INSTDIR" - DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" - DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}" + DeleteRegKey SHCTX "${PRODUCT_UNINST_KEY}" + + DeleteRegKey SHCTX "${PRODUCT_DIR_REGKEY}" + SetAutoClose true SectionEnd diff --git a/Installer/license.txt b/Installer/license.txt deleted file mode 100644 index e7764ee587..0000000000 --- a/Installer/license.txt +++ /dev/null @@ -1 +0,0 @@ -This package is provided "as is" and without warranty. Any express or implied warranties, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose are disclaimed. In no event shall the authors be liable to any party for any direct, indirect, incidental, special, exemplary, or consequential damages arising in any way out of the use of this package.