# pspp.nsi - a NSIS script for generating a PSPP MSWindows installer. # Copyright (C) 2012-2013 Harry Thijssen # Copyright (C) 2021 John Darrington # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . SetCompressor lzma ;; Turning compression off saves a huge amount of time when working on the ;; installer. Keeping it on makes the installer much smaller. ;SetCompress off !searchparse /${pspp_version} "." vers_min "." ;Include Modern UI !include "MUI2.nsh" !define MUI_ICON "${Prefix}/share/pspp/icons/pspp.ico" !define MUI_UNICON "${Prefix}/share/pspp/icons/pspp.ico" !if ${PtrSize} == 64 !define ProgramFiles $Programfiles64 !else if ${PtrSize} == 32 !define ProgramFiles $Programfiles32 !else !error "Unknown architecture" !endif !define MUI_EXTRAPAGES MUI_EXTRAPAGES.nsh !define AdvUninstLog AdvUninstLog.nsh ;-------------------------------- !define APP_NAME "PSPP" !define INSTDIR_REG_ROOT "HKLM" !define INSTDIR_REG_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" !include "${MUI_EXTRAPAGES}" !include "${AdvUninstLog}" ;------------------------------- Settings -----------------------------------------------; !define SavExt ".sav" !define ZSavExt ".zsav" !define PorExt ".por" !define SpsExt ".sps" ;Name and file Name "${APP_NAME}" ; The name of the installer OutFile "${OutExe}" ; The file to write ;Request application privileges for Windows 7 RequestExecutionLevel highest ;-------------------------------- ;Interface Settings !define MUI_ABORTWARNING ;-------------------------------- ;Pages ;Add the install read me page !insertmacro MUI_PAGE_README "${SourceDir}/COPYING" !insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_INSTFILES !insertmacro UNATTENDED_UNINSTALL ;-------------------------------- ;Languages !insertmacro MUI_LANGUAGE "English" ;first language is the default language !insertmacro MUI_LANGUAGE "French" !insertmacro MUI_LANGUAGE "German" !insertmacro MUI_LANGUAGE "Spanish" ; !insertmacro MUI_LANGUAGE "SpanishInternational" !insertmacro MUI_LANGUAGE "SimpChinese" ; !insertmacro MUI_LANGUAGE "TradChinese" !insertmacro MUI_LANGUAGE "Japanese" ; !insertmacro MUI_LANGUAGE "Korean" ; !insertmacro MUI_LANGUAGE "Italian" !insertmacro MUI_LANGUAGE "Dutch" ; !insertmacro MUI_LANGUAGE "Danish" ; !insertmacro MUI_LANGUAGE "Swedish" ; !insertmacro MUI_LANGUAGE "Norwegian" ; !insertmacro MUI_LANGUAGE "NorwegianNynorsk" ; !insertmacro MUI_LANGUAGE "Finnish" !insertmacro MUI_LANGUAGE "Greek" !insertmacro MUI_LANGUAGE "Russian" ; !insertmacro MUI_LANGUAGE "Portuguese" !insertmacro MUI_LANGUAGE "PortugueseBR" !insertmacro MUI_LANGUAGE "Polish" !insertmacro MUI_LANGUAGE "Ukrainian" !insertmacro MUI_LANGUAGE "Czech" ; !insertmacro MUI_LANGUAGE "Slovak" ; !insertmacro MUI_LANGUAGE "Croatian" ; !insertmacro MUI_LANGUAGE "Bulgarian" !insertmacro MUI_LANGUAGE "Hungarian" ; !insertmacro MUI_LANGUAGE "Thai" ; !insertmacro MUI_LANGUAGE "Romanian" ; !insertmacro MUI_LANGUAGE "Latvian" ; !insertmacro MUI_LANGUAGE "Macedonian" ; !insertmacro MUI_LANGUAGE "Estonian" !insertmacro MUI_LANGUAGE "Turkish" !insertmacro MUI_LANGUAGE "Lithuanian" !insertmacro MUI_LANGUAGE "Slovenian" ; !insertmacro MUI_LANGUAGE "Serbian" ; !insertmacro MUI_LANGUAGE "SerbianLatin" ; !insertmacro MUI_LANGUAGE "Arabic" ; !insertmacro MUI_LANGUAGE "Farsi" ; !insertmacro MUI_LANGUAGE "Hebrew" ; !insertmacro MUI_LANGUAGE "Indonesian" ; !insertmacro MUI_LANGUAGE "Mongolian" ; !insertmacro MUI_LANGUAGE "Luxembourgish" ; !insertmacro MUI_LANGUAGE "Albanian" ; !insertmacro MUI_LANGUAGE "Breton" ; !insertmacro MUI_LANGUAGE "Belarusian" ; !insertmacro MUI_LANGUAGE "Icelandic" ; !insertmacro MUI_LANGUAGE "Malay" ; !insertmacro MUI_LANGUAGE "Bosnian" ; !insertmacro MUI_LANGUAGE "Kurdish" ; !insertmacro MUI_LANGUAGE "Irish" ; !insertmacro MUI_LANGUAGE "Uzbek" !insertmacro MUI_LANGUAGE "Galician" ; !insertmacro MUI_LANGUAGE "Afrikaans" !insertmacro MUI_LANGUAGE "Catalan" ; !insertmacro MUI_LANGUAGE "Esperanto" ; !insertmacro MUI_LANGUAGE "Asturian" ;-------------------------------- ;Installer Sections !macro FilePresent name !if /FileExists ${name} nop !else !error "Missing item: ${name}" !endif !macroend Section "PSPP" SecDummy ;; If these are missing, then someone probably forgot to run "make install-html" ;; and/or "make install-pdf" !insertmacro FilePresent "${Prefix}/share/doc/pspp/pspp.html" !insertmacro FilePresent "${Prefix}/share/doc/pspp/pspp.pdf" SetOutPath "$INSTDIR" !insertmacro UNINSTALL.LOG_OPEN_INSTALL SetOutPath "$INSTDIR\etc" File /r "${EnvDir}/etc/*" SetOutPath "$INSTDIR\bin" File ${BinDir}/*.dll File ${BinDir}/gdbus.exe File ${BinDir}/glib-compile-schemas.exe File ${BinDir}/pspp.exe File ${BinDir}/psppire.exe File ${BinDir}/pspp-*.exe File ${BinDir}/gtk-update-icon-cache.exe SetOutPath "$INSTDIR\share" File /r "${Prefix}/share/*" SetOutPath "$INSTDIR\share\icons\hicolor" File /r "${EnvDir}/share/icons/hicolor/*" SetOutPath "$INSTDIR\share\icons\Adwaita" File /r /x cursors /x legacy "${EnvDir}/share/icons/Adwaita/*" ;; legacy and cursors are HUGE! SetOutPath "$INSTDIR\share\glib-2.0\schemas" File /r "${EnvDir}/share/glib-2.0/schemas/*" ExecWait '"$INSTDIR\bin\glib-compile-schemas.exe" "$INSTDIR\share\glib-2.0\schemas"' $0 SetOutPath "$INSTDIR\share\locale" File /r /x "gtk30-properties.mo" "${EnvDir}/share/locale/*" File "/oname=$INSTDIR\share\README.txt" "${SourceDir}/README" File "/oname=$INSTDIR\share\COPYING.txt" "${SourceDir}/COPYING" File "/oname=$INSTDIR\share\NEWS.txt" "${SourceDir}/NEWS" File "/oname=$INSTDIR\share\THANKS.txt" "${SourceDir}/THANKS" File "/oname=$INSTDIR\share\AUTHORS.txt" "${SourceDir}/AUTHORS" !insertmacro UNINSTALL.LOG_CLOSE_INSTALL # call userInfo plugin to get user info. The plugin puts the result in the stack userInfo::getAccountType pop $0 strCmp $0 "Admin" Admin # not admin WriteRegStr HKCU "Software\Classes\${SavExt}" "" "PSPP System File" WriteRegStr HKCU "Software\Classes\${SavExt}" "Content Type" "application/x-spss-sav" WriteRegStr HKCU "Software\Classes\PSPP System File\DefaultIcon" "" "$INSTDIR\share\pspp\icons\pspp-sav.ico" WriteRegStr HKCU "Software\Classes\PSPP System File\Shell\Open\Command" "" '$INSTDIR\bin\psppire.exe "%1"' WriteRegStr HKCU "Software\Classes\${ZSavExt}" "" "PSPP System File Compressed" # WriteRegStr HKCU "Software\Classes\${ZSavExt}" "Content Type" "application/x-spss-sav" WriteRegStr HKCU "Software\Classes\MIME\Database\Content Type\application/x-spss-sav" "Extension" ".sav" WriteRegStr HKCU "Software\Classes\PSPP System File Compressed\DefaultIcon" "" "$INSTDIR\share\pspp\icons\pspp-zsav.ico" WriteRegStr HKCU "Software\Classes\PSPP System File Compressed\Shell\Open\Command" "" '$INSTDIR\bin\psppire.exe "%1"' WriteRegStr HKCU "Software\Classes\${PorExt}" "" "PSPP Portable File" WriteRegStr HKCU "Software\Classes\${PorExt}" "Content Type" "application/x-spss-por" WriteRegStr HKCU "Software\Classes\MIME\Database\Content Type\application/x-spss-por" "Extension" ".por" WriteRegStr HKCU "Software\Classes\PSPP Portable File\DefaultIcon" "" "$INSTDIR\share\pspp\icons\pspp-por.ico,0" WriteRegStr HKCU "Software\Classes\PSPP Portable File\Shell\Open\Command" "" '$INSTDIR\bin\psppire.exe "%1"' WriteRegStr HKCU "Software\Classes\${SpsExt}" "" "PSPP Syntax File" WriteRegStr HKCU "Software\Classes\${SpsExt}" "Content Type" "application/x-spss-sps" WriteRegStr HKCU "Software\Classes\PSPP Syntax File\DefaultIcon" "" "$INSTDIR\share\pspp\icons\pspp-sps.ico,0" WriteRegStr HKCU "Software\Classes\PSPP Syntax File\Shell\Open\Command" "" '$INSTDIR\bin\psppire.exe "%1"' # registering additional mime types WriteRegStr HKCU "Software\Classes\.txt" "Content Type" "text/plain" WriteRegStr HKCU "Software\Classes\MIME\Database\Content Type\text/plain" "Extension" ".txt" WriteRegStr HKCU "Software\Classes\.text" "Content Type" "text/plain" WriteRegStr HKCU "Software\Classes\MIME\Database\Content Type\text/plain" "Extension" ".text" WriteRegStr HKCU "Software\Classes\.csv" "Content Type" "text/csv" WriteRegStr HKCU "Software\Classes\MIME\Database\Content Type\text/csv" "Extension" ".csv" WriteRegStr HKCU "Software\Classes\.tsv" "Content Type" "text/tab-separated-values" WriteRegStr HKCU "Software\Classes\MIME\Database\Content Type\text/tab-separated-values" "Extension" ".tsv" WriteRegStr HKCU "Software\Classes\.gnumeric" "Content Type" "application/x-gnumeric" WriteRegStr HKCU "Software\Classes\MIME\Database\Content Type\text/plain" "Extension" ".gnumeric" WriteRegStr HKCU "Software\Classes\.ods" "Content Type" "application/vnd.oasis.opendocument.spreadsheet" WriteRegStr HKCU "Software\Classes\MIME\Database\Content Type\application/vnd.oasis.opendocument.spreadsheet" "Extension" ".ods" WriteRegStr HKCU ${INSTDIR_REG_KEY} "DisplayName" "${APP_NAME}" WriteRegStr HKCU ${INSTDIR_REG_KEY} "UninstallString" '"$INSTDIR\UNINSTALL.exe"' WriteRegStr HKCU ${INSTDIR_REG_KEY} "Publisher" "Free Software Foundation, Inc." WriteRegStr HKCU ${INSTDIR_REG_KEY} "DisplayIcon" '"$INSTDIR\bin\psppire.exe"' WriteRegStr HKCU ${INSTDIR_REG_KEY} "DisplayVersion" "${pspp_version}" Goto EndStrCmp Admin: ;MultiUser Install SetShellVarContext all WriteRegStr HKCR "${SavExt}" "" "PSPP System File" WriteRegStr HKCR "${SavExt}" "Content Type" "application/x-spss-sav" WriteRegStr HKCR "MIME\Database\Content Type\application/x-spss-sav" "Extension" ".sav" WriteRegStr HKCR "PSPP System File\DefaultIcon" "" "$INSTDIR\share\pspp\icons\pspp-sav.ico,0" WriteRegStr HKCR "PSPP System File\Shell\Open\Command" "" '$INSTDIR\bin\psppire.exe "%1"' WriteRegStr HKCR "${ZSavExt}" "" "PSPP System File Compressed" WriteRegStr HKCR "PSPP System File Compressed\DefaultIcon" "" "$INSTDIR\share\pspp\icons\pspp-zsav.ico,0" WriteRegStr HKCR "PSPP System File Compressed\Shell\Open\Command" "" '$INSTDIR\bin\psppire.exe "%1"' WriteRegStr HKCR "${PorExt}" "" "PSPP Portable File" WriteRegStr HKCR "${PorExt}" "Content Type" "application/x-spss-por" WriteRegStr HKCR "MIME\Database\Content Type\application/x-spss-por" "Extension" ".por" WriteRegStr HKCR "PSPP Portable File\DefaultIcon" "" "$INSTDIR\share\pspp\icons\pspp-por.ico,0" WriteRegStr HKCR "PSPP Portable File\Shell\Open\Command" "" '$INSTDIR\bin\psppire.exe "%1"' WriteRegStr HKCR "${SpsExt}" "" "PSPP Syntax File" WriteRegStr HKCR "${SpsExt}" "Content Type" "application/x-spss-sps" WriteRegStr HKCR "PSPP Syntax File\DefaultIcon" "" "$INSTDIR\share\pspp\icons\pspp-sps.ico,0" WriteRegStr HKCR "PSPP Syntax File\Shell\Open\Command" "" '$INSTDIR\bin\psppire.exe "%1"' # registering additional mime types WriteRegStr HKCR ".txt" "Content Type" "text/plain" WriteRegStr HKCR "MIME\Database\Content Type\text/plain" "Extension" ".txt" WriteRegStr HKCR ".text" "Content Type" "text/plain" WriteRegStr HKCR "MIME\Database\Content Type\text/plain" "Extension" ".text" WriteRegStr HKCR ".csv" "Content Type" "text/csv" WriteRegStr HKCR "MIME\Database\Content Type\text/csv" "Extension" ".csv" WriteRegStr HKCR ".tsv" "Content Type" "text/tab-separated-values" WriteRegStr HKCR "MIME\Database\Content Type\text/tab-separated-values" "Extension" ".tsv" WriteRegStr HKCR ".gnumeric" "Content Type" "application/x-gnumeric" WriteRegStr HKCR "MIME\Database\Content Type\text/plain" "Extension" ".gnumeric" WriteRegStr HKCR ".ods" "Content Type" "application/vnd.oasis.opendocument.spreadsheet" WriteRegStr HKCR "MIME\Database\Content Type\application/vnd.oasis.opendocument.spreadsheet" "Extension" ".ods" WriteRegStr HKLM ${INSTDIR_REG_KEY} "DisplayName" "${APP_NAME}" WriteRegStr HKLM ${INSTDIR_REG_KEY} "UninstallString" '"$INSTDIR\UNINSTALL.exe"' WriteRegStr HKLM ${INSTDIR_REG_KEY} "Publisher" "Free Software Foundation, Inc." WriteRegStr HKLM ${INSTDIR_REG_KEY} "DisplayIcon" '"$INSTDIR\bin\psppire.exe"' WriteRegStr HKLM ${INSTDIR_REG_KEY} "DisplayVersion" "${pspp_version}" EndStrCmp: # flush the icon cache System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)' ; Now create shortcuts SetOutPath "%HOMEDRIVE%HOMEPATH" CreateDirectory "$SMPROGRAMS\${APP_NAME}" CreateShortCut "$SMPROGRAMS\${APP_NAME}\PSPP.lnk" "$INSTDIR\bin\psppire.exe" "" "$INSTDIR\share\pspp\icons\pspp.ico" CreateShortCut "$SMPROGRAMS\${APP_NAME}\README.lnk" "$INSTDIR\share\README.txt" CreateShortCut "$SMPROGRAMS\${APP_NAME}\Manual.lnk" "$INSTDIR\share\doc\pspp\pspp.pdf" CreateShortCut "$SMPROGRAMS\${APP_NAME}\License.lnk" "$INSTDIR\share\COPYING.txt" CreateShortCut "$SMPROGRAMS\${APP_NAME}\NEWS.lnk" "$INSTDIR\share\NEWS.txt" CreateShortCut "$SMPROGRAMS\${APP_NAME}\THANKS.lnk" "$INSTDIR\share\THANKS.txt" CreateShortCut "$SMPROGRAMS\${APP_NAME}\AUTHORS.lnk" "$INSTDIR\share\AUTHORS.txt" CreateShortCut "$SMPROGRAMS\${APP_NAME}\Examples.lnk" "$INSTDIR\share\pspp\examples" CreateShortCut "$SMPROGRAMS\${APP_NAME}\Uninstall PSPP.lnk" "$INSTDIR\Uninstall.exe" CreateShortCut "$DESKTOP\${APP_NAME}.lnk" "$INSTDIR\bin\psppire.exe" "" "$INSTDIR\share\pspp\icons\pspp.ico" IfFileExists "$INSTDIR\bin\gdb.exe" file_found file_not_found file_found: IfFileExists "c:\windows\command\start.exe" on-wine on-windows on-wine: SetOutPath "$INSTDIR" CreateShortcut "$DESKTOP\DebugPSPP.lnk" "$INSTDIR\bin\gdb" 'bin\psppire.exe' '"$INSTDIR\bin"' CreateShortcut "$INSTDIR\DebugPSPP.lnk" "$INSTDIR\bin\gdb" 'bin\psppire.exe' '"$INSTDIR\bin"' SetOutPath "%HOMEDRIVE%HOMEPATH" goto end_of_test-win on-windows: SetOutPath "$INSTDIR" CreateShortCut "$DESKTOP\PSPPDebug.lnk" "$INSTDIR\bin\DebugPSPP.bat" '"$INSTDIR\bin"' CreateShortcut "$SMPROGRAMS\PSPP\DebugPSPP.lnk" "$INSTDIR\bin\DebugPSPP.BAT" '"$INSTDIR\bin"' SetOutPath "%HOMEDRIVE%HOMEPATH" CreateShortcut "$DESKTOP\GDB Manual.lnk" "http://sourceware.org/gdb/current/onlinedocs/gdb/" CreateShortcut "$SMPROGRAMS\PSPP\GDB Manual.lnk" "http://sourceware.org/gdb/current/onlinedocs/gdb/" end_of_test-win: file_not_found: CreateShortCut "$DESKTOP\PSPP Manual.lnk" "$INSTDIR\share\doc\pspp\pspp.pdf" CreateShortcut "$SMPROGRAMS\PSPP\PSPP_Commandline.lnk" "$INSTDIR\bin\pspp.exe" '"$INSTDIR\bin"' ;Create uninstaller SetOutPath "$INSTDIR" WriteUninstaller "$INSTDIR\Uninstall.exe" SectionEnd ;-------------------------------- ;Installer Functions Function .onInit ;; Test Versions get a default directory of "PSPP-TESTING" ;; Released Versions have "PSPP" ;; Debug Versions have "PSPP-DEBUG" Var /global DefaultInstallDir ${If} ${DEBUG} == 1 StrCpy $DefaultInstallDir "${APP_NAME}-DEBUG" ${Else} Intop $0 ${vers_min} % 2 ${If} $0 == 0 StrCpy $DefaultInstallDir "${APP_NAME}" ${Else} StrCpy $DefaultInstallDir "${APP_NAME}-TESTING" ${Endif} ${Endif} MessageBox MB_OKCANCEL "This windoze installer is work in progress. It is known to have deficiencies and is recommended for testing and evaluation purposes only." IDOK continue Abort ; Allow the use to decide not to continue continue: ; initial actions # call userInfo plugin to get user info. The plugin puts the result in the stack userInfo::getAccountType pop $0 strCmp $0 "Admin" Admin # not admin StrCpy $INSTDIR "$PROFILE\$DefaultInstallDir" Goto EndStrCmp Admin: StrCpy $INSTDIR "${ProgramFiles}\$DefaultInstallDir" EndStrCmp: !insertmacro UNINSTALL.LOG_PREPARE_INSTALL FunctionEnd Function .onInstSuccess !insertmacro UNINSTALL.LOG_UPDATE_INSTALL FunctionEnd ;Uninstaller Section Section "Uninstall" ;; Remove these directories in a single operation. ;; Doing so makes uninstallation much faster. However don't ;; be tempted to do "Rmdir /r $INSTDIR" - this would wipe out ;; the user's entire system if she had decided that INSTDIR is ;; the C:\ directory. Rmdir /r "$INSTDIR\etc" Rmdir /r "$INSTDIR\bin" Rmdir /r "$INSTDIR\share" !insertmacro UNINSTALL.LOG_UNINSTALL "$INSTDIR" !insertmacro UNINSTALL.LOG_UNINSTALL "$APPDATA\${APP_NAME}" !insertmacro UNINSTALL.LOG_END_UNINSTALL userInfo::getAccountType pop $0 strCmp $0 "Admin" Admin # not admin DeleteRegKey HKCU "Software\Classes\${PorExt}" DeleteRegKey HKCU "Software\Classes\${SavExt}" DeleteRegKey HKCU "Software\Classes\${SpsExt}" DeleteRegKey HKCU "Software\Classes\PSPP Portable File" DeleteRegKey HKCU "Software\Classes\PSPP System File" DeleteRegKey HKCU "Software\Classes\PSPP Syntax File" DeleteRegKey HKCU "${INSTDIR_REG_KEY}" Goto EndStrCmp Admin: SetShellVarContext all DeleteRegKey HKCR "${PorExt}" DeleteRegKey HKCR "${SavExt}" DeleteRegKey HKCR "${SpsExt}" DeleteRegKey HKCR "PSPP Portable File" DeleteRegKey HKCR "PSPP System File" DeleteRegKey HKCR "PSPP Syntax File" DeleteRegKey HKLM "${INSTDIR_REG_KEY}" EndStrCmp: ; Now remove shortcuts too RMDIR /r "$SMPROGRAMS\PSPP" Delete "$DESKTOP\PSPP.lnk" Delete "$DESKTOP\PSPPDebug.lnk" Delete "$DESKTOP\PSPP Manual.lnk" Delete "$DESKTOP\GDB Manual.lnk" # call userInfo plugin to get user info. The plugin puts the result in the stack SectionEnd ;---------------------------------------------------- Function UN.onInit !insertmacro UNINSTALL.LOG_BEGIN_UNINSTALL FunctionEnd ;--------------------------------------------