123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265 |
- !define PRODUCT_NAME "[[ib.appname]]"
- !define PRODUCT_VERSION "[[ib.version]]"
- !define PY_VERSION "[[ib.py_version]]"
- !define PY_MAJOR_VERSION "[[ib.py_major_version]]"
- !define BITNESS "[[ib.py_bitness]]"
- !define ARCH_TAG "[[arch_tag]]"
- !define INSTALLER_NAME "[[ib.installer_name]]"
- !define PRODUCT_ICON "[[icon]]"
- ; Marker file to tell the uninstaller that it's a user installation
- !define USER_INSTALL_MARKER _user_install_marker
- SetCompressor lzma
- !if "${NSIS_PACKEDVERSION}" >= 0x03000000
- Unicode true
- ManifestDPIAware true
- !endif
- !define MULTIUSER_EXECUTIONLEVEL Highest
- !define MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER
- !define MULTIUSER_MUI
- !define MULTIUSER_INSTALLMODE_COMMANDLINE
- !define MULTIUSER_INSTALLMODE_INSTDIR "[[ib.appname]]"
- [% if ib.py_bitness == 64 %]
- !define MULTIUSER_INSTALLMODE_FUNCTION correct_prog_files
- [% endif %]
- !include MultiUser.nsh
- !include FileFunc.nsh
- [% block modernui %]
- ; Modern UI installer stuff
- !include "MUI2.nsh"
- !define MUI_ABORTWARNING
- !define MUI_ICON "[[icon]]"
- !define MUI_UNICON "[[icon]]"
- ; UI pages
- [% block ui_pages %]
- !insertmacro MUI_PAGE_WELCOME
- [% if license_file %]
- !insertmacro MUI_PAGE_LICENSE [[license_file]]
- [% endif %]
- !insertmacro MULTIUSER_PAGE_INSTALLMODE
- !insertmacro MUI_PAGE_DIRECTORY
- !insertmacro MUI_PAGE_INSTFILES
- !insertmacro MUI_PAGE_FINISH
- [% endblock ui_pages %]
- !insertmacro MUI_LANGUAGE "English"
- [% endblock modernui %]
- Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
- OutFile "${INSTALLER_NAME}"
- ShowInstDetails show
- Var cmdLineInstallDir
- Section -SETTINGS
- SetOutPath "$INSTDIR"
- SetOverwrite ifnewer
- SectionEnd
- [% block sections %]
- Section "!${PRODUCT_NAME}" sec_app
- SetRegView [[ib.py_bitness]]
- SectionIn RO
- File ${PRODUCT_ICON}
- [% block install_pkgs %]
- [#
- Extend this block if you need to remove the pkgs directory if it already
- exists from previous installations (when upgrading without uninstalling).
- https://github.com/takluyver/pynsist/issues/66
- Example:
- [% block install_pkgs %]
- RMDir /r "$INSTDIR\pkgs"
- [[ super() ]]
- [% endblock install_pkgs %]
- #]
- ; Copy pkgs data
- SetOutPath "$INSTDIR\pkgs"
- File /r "pkgs\*.*"
- [% endblock install_pkgs %]
- SetOutPath "$INSTDIR"
- ; Marker file for per-user install
- StrCmp $MultiUser.InstallMode CurrentUser 0 +3
- FileOpen $0 "$INSTDIR\${USER_INSTALL_MARKER}" w
- FileClose $0
- SetFileAttributes "$INSTDIR\${USER_INSTALL_MARKER}" HIDDEN
- [% block install_files %]
- ; Install files
- [% for destination, group in grouped_files %]
- SetOutPath "[[destination]]"
- [% for file in group %]
- File "[[ file ]]"
- [% endfor %]
- [% endfor %]
- ; Install directories
- [% for dir, destination in ib.install_dirs %]
- SetOutPath "[[ pjoin(destination, dir) ]]"
- File /r "[[dir]]\*.*"
- [% endfor %]
- [% endblock install_files %]
- [% block install_shortcuts %]
- ; Install shortcuts
- ; The output path becomes the working directory for shortcuts
- SetOutPath "%HOMEDRIVE%\%HOMEPATH%"
- [% if single_shortcut %]
- [% for scname, sc in ib.shortcuts.items() %]
- CreateShortCut "$SMPROGRAMS\[[scname]].lnk" "[[sc['target'] ]]" \
- '[[ sc['parameters'] ]]' "$INSTDIR\[[ sc['icon'] ]]"
- [% endfor %]
- [% else %]
- [# Multiple shortcuts: create a directory for them #]
- CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
- [% for scname, sc in ib.shortcuts.items() %]
- CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\[[scname]].lnk" "[[sc['target'] ]]" \
- '[[ sc['parameters'] ]]' "$INSTDIR\[[ sc['icon'] ]]"
- [% endfor %]
- [% endif %]
- SetOutPath "$INSTDIR"
- [% endblock install_shortcuts %]
- [% block install_commands %]
- [% if has_commands %]
- DetailPrint "Setting up command-line launchers..."
- StrCmp $MultiUser.InstallMode CurrentUser 0 AddSysPathSystem
- ; Add to PATH for current user
- nsExec::ExecToLog '[[ python ]] -Es "$INSTDIR\_system_path.py" add_user "$INSTDIR\bin"'
- GoTo AddedSysPath
- AddSysPathSystem:
- ; Add to PATH for all users
- nsExec::ExecToLog '[[ python ]] -Es "$INSTDIR\_system_path.py" add "$INSTDIR\bin"'
- AddedSysPath:
- [% endif %]
- [% endblock install_commands %]
- ; Byte-compile Python files.
- DetailPrint "Byte-compiling Python modules..."
- nsExec::ExecToLog '[[ python ]] -m compileall -q "$INSTDIR\pkgs"'
- WriteUninstaller $INSTDIR\uninstall.exe
- ; Add ourselves to Add/remove programs
- WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" \
- "DisplayName" "${PRODUCT_NAME}"
- WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" \
- "UninstallString" '"$INSTDIR\uninstall.exe"'
- WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" \
- "InstallLocation" "$INSTDIR"
- WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" \
- "DisplayIcon" "$INSTDIR\${PRODUCT_ICON}"
- [% if ib.publisher is not none %]
- WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" \
- "Publisher" "[[ib.publisher]]"
- [% endif %]
- WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" \
- "DisplayVersion" "${PRODUCT_VERSION}"
- WriteRegDWORD SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" \
- "NoModify" 1
- WriteRegDWORD SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" \
- "NoRepair" 1
- ; Check if we need to reboot
- IfRebootFlag 0 noreboot
- MessageBox MB_YESNO "A reboot is required to finish the installation. Do you wish to reboot now?" \
- /SD IDNO IDNO noreboot
- Reboot
- noreboot:
- SectionEnd
- Section "Uninstall"
- SetRegView [[ib.py_bitness]]
- SetShellVarContext all
- IfFileExists "$INSTDIR\${USER_INSTALL_MARKER}" 0 +3
- SetShellVarContext current
- Delete "$INSTDIR\${USER_INSTALL_MARKER}"
- Delete $INSTDIR\uninstall.exe
- Delete "$INSTDIR\${PRODUCT_ICON}"
- RMDir /r "$INSTDIR\pkgs"
- ; Remove ourselves from %PATH%
- [% block uninstall_commands %]
- [% if has_commands %]
- nsExec::ExecToLog '[[ python ]] -Es "$INSTDIR\_system_path.py" remove "$INSTDIR\bin"'
- [% endif %]
- [% endblock uninstall_commands %]
- [% block uninstall_files %]
- ; Uninstall files
- [% for file, destination in ib.install_files %]
- Delete "[[pjoin(destination, file)]]"
- [% endfor %]
- ; Uninstall directories
- [% for dir, destination in ib.install_dirs %]
- RMDir /r "[[pjoin(destination, dir)]]"
- [% endfor %]
- [% endblock uninstall_files %]
- [% block uninstall_shortcuts %]
- ; Uninstall shortcuts
- [% if single_shortcut %]
- [% for scname in ib.shortcuts %]
- Delete "$SMPROGRAMS\[[scname]].lnk"
- [% endfor %]
- [% else %]
- RMDir /r "$SMPROGRAMS\${PRODUCT_NAME}"
- [% endif %]
- [% endblock uninstall_shortcuts %]
- RMDir $INSTDIR
- DeleteRegKey SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
- SectionEnd
- [% endblock sections %]
- ; Functions
- Function .onMouseOverSection
- ; Find which section the mouse is over, and set the corresponding description.
- FindWindow $R0 "#32770" "" $HWNDPARENT
- GetDlgItem $R0 $R0 1043 ; description item (must be added to the UI)
- [% block mouseover_messages %]
- StrCmp $0 ${sec_app} "" +2
- SendMessage $R0 ${WM_SETTEXT} 0 "STR:${PRODUCT_NAME}"
- [% endblock mouseover_messages %]
- FunctionEnd
- Function .onInit
- ; Multiuser.nsh breaks /D command line parameter. Parse /INSTDIR instead.
- ; Cribbing from https://nsis-dev.github.io/NSIS-Forums/html/t-299280.html
- ${GetParameters} $0
- ClearErrors
- ${GetOptions} '$0' "/INSTDIR=" $1
- IfErrors +2 ; Error means flag not found
- StrCpy $cmdLineInstallDir $1
- ClearErrors
- !insertmacro MULTIUSER_INIT
- ; If cmd line included /INSTDIR, override the install dir set by MultiUser
- StrCmp $cmdLineInstallDir "" +2
- StrCpy $INSTDIR $cmdLineInstallDir
- FunctionEnd
- Function un.onInit
- !insertmacro MULTIUSER_UNINIT
- FunctionEnd
- [% if ib.py_bitness == 64 %]
- Function correct_prog_files
- ; The multiuser machinery doesn't know about the different Program files
- ; folder for 64-bit applications. Override the install dir it set.
- StrCmp $MultiUser.InstallMode AllUsers 0 +2
- StrCpy $INSTDIR "$PROGRAMFILES64\${MULTIUSER_INSTALLMODE_INSTDIR}"
- FunctionEnd
- [% endif %]
|