From 2f0ceb596894521d62d8b675349e54d6256b5884 Mon Sep 17 00:00:00 2001 From: Andrew Senetar Date: Wed, 26 Jul 2017 21:38:17 -0500 Subject: [PATCH] Update setup.nsi Updates to setup.nsi including: - Defines from CLI - Version information (MAJOR, MINOR, PATCH) - Bits (64 / 32) - SourcePath (if we wanted something other than build) - Added extra defines to move application specifics to one location - Added extra defines for uninstall information - Added calculation of install size - Added switching between 64 and 32 bit contexts (need to verify functionality) - Updated output file naming - Added NSIS supported languages which are also supported by dupeGuru - Added rest of registry keys for uninstall information - Added missing registry key for installType - Added removeing Vendor folder and registry key if empty on uninstall Should be very close to having this installer script ready to integrate into the package.py script if desired. Ref #393 --- setup.nsi | 328 ++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 220 insertions(+), 108 deletions(-) diff --git a/setup.nsi b/setup.nsi index 68129482..90d0b959 100644 --- a/setup.nsi +++ b/setup.nsi @@ -1,148 +1,260 @@ +;============================================================================== +; dupeGuru Installer Script for Windows via NSIS +; +; When calling makensis use the following: +; makensis /DVERSIONMAJOR=x /DVERSIONMINOR=x /DVERSIONPATCH=x /DBITS=x \ +; /DSOURCEPATH=x +; NOTE: +; If SOURCEPATH is not set it will default to build (uses subdir based on app). +;============================================================================== + +; Compression Setting SetCompressor /SOLID lzma +; General Headers +!include "FileFunc.nsh" -; General Defines - !define REGKEY "Software\Hardcoded Software\dupeGuru" - !define INSTPATH "Hardcoded Software\dupeGuru" - var StartMenuFolder +;============================================================================== +; Configuration Defines +;============================================================================== - ; todo include a way to point between x64 and x32 builds via env - ; need to also change between PROGRAMS64 and PROGRAMS -;-------------------------------- +; Environment Defines +!verbose push +!verbose 4 +!ifndef VERSIONMAJOR + !echo "VERSIONMAJOR is NOT defined" +!endif +!ifndef VERSIONMINOR + !echo "VERSIONMINOR is NOT defined" +!endif +!ifndef VERSIONPATCH + !echo "VERSIONPATCH is NOT defined" +!endif +!ifndef BITS + !echo "BITS is NOT defined" +!endif +!ifndef SOURCEPATH + !echo "SOURCEPATH is NOT defined" + !define SOURCEPATH "build" +!endif +!ifndef VERSIONMAJOR | VERSIONMINOR | VERSIONPATCH | BITS | SOURCEPATH + !error "Command line Defines missing use /DDEFINE=VALUE to define before script" +!endif +!verbose pop -;MultiUser +; Application Specific Defines +!define APPNAME "dupeGuru" +!define COMPANYNAME "Hardcoded Software" +!define DESCRIPTION "dupeGuru is a tool to find duplicate files on your computer." +!define APPLICENSE "LICENSE" ; License is not in build directory +!define APPICON "images\dgse_logo.ico" ; nor is the icon +!define DISTDIR "dist" +!define HELPURL "http://www.hardcoded.net/support/" +!define UPDATEURL "http://www.hardcoded.net/dupeguru/" +!define ABOUTURL "http://www.hardcoded.net/dupeguru/" - !define MULTIUSER_EXECUTIONLEVEL Highest - !define MULTIUSER_MUI - !define MULTIUSER_INSTALLMODE_COMMANDLINE - !define MULTIUSER_INSTALLMODE_INSTDIR "${INSTPATH}" - !define MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY "${REGKEY}" - !define MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME "InstallPath" - !define MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY "${REGKEY}" - !define MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME "InstallType" - !include MultiUser.nsh +; Static Defines +!define UNINSTALLREGBASE "Software\Microsoft\Windows\CurrentVersion\Uninstall" + +; Derived Defines +!define BASEREGKEY "Software\${COMPANYNAME}\${APPNAME}" ;without root key +!define VENDORREGKEY "Software\${COMPANYNAME}" ;without root key +!define UNINSTALLREG "${UNINSTALLREGBASE}\${APPNAME}" ;without root key +!define INSTPATH "${COMPANYNAME}\${APPNAME}" ;without programs / appdata + +; Global vars +var StartMenuFolder +var InstallSize + +;============================================================================== +; Plugin Setup +;============================================================================== + +; MultiUser Plugin - Allow single user or all install based on execution level +!define MULTIUSER_EXECUTIONLEVEL Highest +!define MULTIUSER_MUI +!define MULTIUSER_INSTALLMODE_COMMANDLINE +!define MULTIUSER_INSTALLMODE_INSTDIR "${INSTPATH}" ; without programs /appdata +; allow for next run of installer to automatically find install path and type +!define MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY "${BASEREGKEY}" +!define MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME "InstallPath" +!define MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY "${BASEREGKEY}" +!define MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME "InstallType" +!if ${BITS} == "64" + !define MULTIUSER_USE_PROGRAMFILES64 +!endif +!include MultiUser.nsh -;-------------------------------- +; Modern UI 2 +!include "MUI2.nsh" +!define MUI_ICON "${APPICON}" +!define MUI_ABORTWARNING +!define MUI_UNABORTWARNING -;-------------------------------- -;Modern UI 2 +;============================================================================== +; NSIS Variables +;============================================================================== - !include "MUI2.nsh" - !define MUI_ICON "images\dgse_logo.ico" +Name "${APPNAME}" +!system 'mkdir "${DISTDIR}"' +OutFile "${DISTDIR}\${APPNAME}_win${BITS}_${VERSIONMAJOR}.${VERSIONMINOR}.${VERSIONPATCH}.exe" +Icon "${APPICON}" -;-------------------------------- +;============================================================================== +; Pages +;============================================================================== -;General +!insertmacro MUI_PAGE_WELCOME +!insertmacro MUI_PAGE_LICENSE "${APPLICENSE}" +!insertmacro MULTIUSER_PAGE_INSTALLMODE +!insertmacro MUI_PAGE_DIRECTORY - ;Name and file - Name "dupeGuru" - OutFile "DupeGuruInstaller.exe" +; values for start menu page +!define MUI_STARTMENUPAGE_REGISTRY_ROOT "SHCTX" ; uses shell context +!define MUI_STARTMENUPAGE_REGISTRY_KEY "${BASEREGKEY}" +!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder" +!insertmacro MUI_PAGE_STARTMENU Application $StartMenuFolder -;-------------------------------- +!insertmacro MUI_PAGE_INSTFILES +!insertmacro MUI_PAGE_FINISH -;Interface Settings - - !define MUI_ABORTWARNING - !define !define MUI_UNABORTWARNING - -;-------------------------------- -;Pages - - !insertmacro MUI_PAGE_WELCOME - !insertmacro MUI_PAGE_LICENSE LICENSE - !insertmacro MULTIUSER_PAGE_INSTALLMODE - - !insertmacro MUI_PAGE_DIRECTORY - - !define MUI_STARTMENUPAGE_REGISTRY_ROOT "SHCTX" - !define MUI_STARTMENUPAGE_REGISTRY_KEY "${REGKEY}" - !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder" - !insertmacro MUI_PAGE_STARTMENU Application $StartMenuFolder - !insertmacro MUI_PAGE_INSTFILES - !insertmacro MUI_PAGE_FINISH +; uninstaller pages +!insertmacro MUI_UNPAGE_CONFIRM +!insertmacro MUI_UNPAGE_INSTFILES - !insertmacro MUI_UNPAGE_CONFIRM - !insertmacro MUI_UNPAGE_INSTFILES +;============================================================================== +; Languages +;============================================================================== + +!insertmacro MUI_LANGUAGE "English" ;first language is the default language +!insertmacro MUI_LANGUAGE "French" +!insertmacro MUI_LANGUAGE "German" +!insertmacro MUI_LANGUAGE "Greek" +!insertmacro MUI_LANGUAGE "Italian" +!insertmacro MUI_LANGUAGE "Korean" +!insertmacro MUI_LANGUAGE "Polish" +!insertmacro MUI_LANGUAGE "Russian" +!insertmacro MUI_LANGUAGE "Spanish" +!insertmacro MUI_LANGUAGE "Ukrainian" +!insertmacro MUI_LANGUAGE "Vietnamese" +!insertmacro MUI_LANGUAGE "Dutch" +!insertmacro MUI_LANGUAGE "Czech" +;!insertmacro MUI_LANGUAGE "Chinese" ; no NSIS builtin support +;!insertmacro MUI_LANGUAGE "Brazilian" ; no NSIS builtin support +;!insertmacro MUI_LANGUAGE "Armenian" ; requires UNICODE + +;============================================================================== +; Reserve Files +;============================================================================== + +; If you are using solid compression, files that are required before +; the actual installation should be stored first in the data block, +; because this will make your installer start faster. + +!insertmacro MUI_RESERVEFILE_LANGDLL +ReserveFile /nonfatal "${NSISDIR}\Plugins\*.dll" ;reserve if needed + +;============================================================================== +; Installer Sections +;============================================================================== + +Section "!Application" AppSec + SetOutPath "$INSTDIR" ; set from result of installer pages -;-------------------------------- -;Languages + ; Files to install + File /r "${SOURCEPATH}\${APPNAME}-win${BITS}bit\*" - !insertmacro MUI_LANGUAGE "English" ;first language is the default language - -;-------------------------------- - -;Reserve Files - - ;If you are using solid compression, files that are required before - ;the actual installation should be stored first in the data block, - ;because this will make your installer start faster. - - !insertmacro MUI_RESERVEFILE_LANGDLL - ReserveFile /nonfatal "${NSISDIR}\Plugins\*.dll" - -;-------------------------------- - -;Installer Sections - -Section "DupeGuru" SecDupeGuru - - SetOutPath "$INSTDIR" - - ;Files to install - File /r "build\dupeguru-win64bit\*" - File "images\dgse_logo.ico" ; image for ? - - ;Store installation folder - WriteRegStr SHCTX "${REGKEY}" "Path" $INSTDIR - - ;Uninstall Entry - WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\dupeGuru" \ - "DisplayName" "dupeGuru" - WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\dupeGuru" \ - "UninstallString" "$\"$INSTDIR\uninstall.exe$\" /$MultiUser.InstallMode" - WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\dupeGuru" "QuietUninstallString" \ - "$\"$INSTDIR\uninstall.exe$\" /$MultiUser.InstallMode /S" - ;todo add the rest of the keys needed here - ;Create uninstaller - WriteUninstaller "$INSTDIR\Uninstall.exe" - + ; Create Start Menu Items !insertmacro MUI_STARTMENU_WRITE_BEGIN Application - - ;Create shortcuts CreateDirectory "$SMPROGRAMS\$StartMenuFolder" - CreateShortcut "$SMPROGRAMS\$StartMenuFolder\dupeGuru.lnk" "$INSTDIR\dupeGuru.exe" + CreateShortcut "$SMPROGRAMS\$StartMenuFolder\${APPNAME}.lnk" "$INSTDIR\${APPNAME}.exe" CreateShortcut "$SMPROGRAMS\$StartMenuFolder\Uninstall.lnk" "$INSTDIR\Uninstall.exe" - !insertmacro MUI_STARTMENU_WRITE_END + ; Store installation folder + WriteRegStr SHCTX "${BASEREGKEY}" "InstallPath" $INSTDIR + WriteRegStr SHCTX "${BASEREGKEY}" "InstallType" $MultiUser.InstallMode + + ; get installed size + Push $R0 + Push $R1 + Push $R2 + ${GetSize} "$INSTDIR" "/S=0K" $R0 $R1 $R2 ; look into locate + IntFmt $InstallSize "0x%08X" $R0 + Pop $R2 + Pop $R1 + Pop $R0 + + ; Uninstall Entry + WriteRegStr SHCTX "${UNINSTALLREG}" "DisplayName" "${APPNAME} ${VERSIONMAJOR}.${VERSIONMINOR}.${VERSIONPATCH}" + WriteRegStr SHCTX "${UNINSTALLREG}" "DisplayVersion" "${VERSIONMAJOR}.${VERSIONMINOR}.${VERSIONPATCH}" + WriteRegStr SHCTX "${UNINSTALLREG}" "DisplayIcon" "$INSTDIR\${APPNAME}.exe" + WriteRegDWORD SHCTX "${UNINSTALLREG}" "VersionMajor" ${VERSIONMAJOR} + WriteRegDWORD SHCTX "${UNINSTALLREG}" "VersionMinor" ${VERSIONMINOR} + WriteRegDWORD SHCTX "${UNINSTALLREG}" "VersionPatch" ${VERSIONPATCH} + WriteRegStr SHCTX "${UNINSTALLREG}" "Comments" "${APPNAME} installer" + WriteRegStr SHCTX "${UNINSTALLREG}" "InstallLocation" "$INSTDIR" + WriteRegStr SHCTX "${UNINSTALLREG}" "Publisher" "${COMPANYNAME}" + WriteRegStr SHCTX "${UNINSTALLREG}" "Contact" "${HELPURL}" + WriteRegStr SHCTX "${UNINSTALLREG}" "HelpLink" "${HELPURL}" + WriteRegStr SHCTX "${UNINSTALLREG}" "URLUpdateInfo" "${UPDATEURL}" + WriteRegStr SHCTX "${UNINSTALLREG}" "URLInfoAbout" "${ABOUTURL}" + WriteRegDWORD SHCTX "${UNINSTALLREG}" "NoModify" 1 + WriteRegDWORD SHCTX "${UNINSTALLREG}" "NoRepair" 1 + WriteRegDWORD SHCTX "${UNINSTALLREG}" "EstimatedSize" $InstallSize + WriteRegStr SHCTX "${UNINSTALLREG}" "UninstallString" "$\"$INSTDIR\uninstall.exe$\" /$MultiUser.InstallMode" + WriteRegStr SHCTX "${UNINSTALLREG}" "QuietUninstallString" "$\"$INSTDIR\uninstall.exe$\" /$MultiUser.InstallMode /S" + + ; Create uninstaller + WriteUninstaller "$INSTDIR\Uninstall.exe" SectionEnd -;-------------------------------- -;Descriptions +;============================================================================== +; Descriptions +;============================================================================== +; Add descriptions as needed - -;-------------------------------- -;Uninstaller Section +;============================================================================== +; Uninstaller Sections +;============================================================================== Section "Uninstall" - - ;ADD YOUR OWN FILES HERE... + ; Remove Start Menu Folder !insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuFolder RMDir /r "$SMPROGRAMS\$StartMenuFolder" - Delete "$INSTDIR\Uninstall.exe" - RMDir /r "$INSTDIR" - ; todo delete vendor dir and keys if empty - DeleteRegKey SHCTX "${REGKEY}" - DeleteRegKey SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\dupeGuru" + ; Delete the Install Directory and vendor directory (if empty) + Push $R0 + RMDir /r "$INSTDIR" ;NSIS seems to recomend against this... look into options + ${GetParent} "$INSTDIR" $R0 + RMDir $R0 + Pop $R0 + ; Remove registry keys and vendor keys (if empty) + DeleteRegKey SHCTX "${BASEREGKEY}" + DeleteRegKey /ifempty SHCTX "${VENDORREGKEY}" + DeleteRegKey SHCTX "${UNINSTALLREG}" SectionEnd +;============================================================================== +; Functions +;============================================================================== + Function .onInit + !if ${BITS} == "64" + SetRegView 64 + !else + SetRegView 32 + !endif !insertmacro MULTIUSER_INIT - !insertmacro MUI_LANGDLL_DISPLAY + !insertmacro MUI_LANGDLL_DISPLAY FunctionEnd Function un.onInit + !if ${BITS} == "64" + SetRegView 64 + !else + SetRegView 32 + !endif !insertmacro MULTIUSER_UNINIT !insertmacro MUI_UNGETLANGUAGE FunctionEnd \ No newline at end of file