mirror of https://github.com/PCSX2/pcsx2.git
438 lines
15 KiB
Plaintext
438 lines
15 KiB
Plaintext
|
||
; PCSX2 NSIS installer script
|
||
; Copyright 2009-2010 PCSX2 Dev Team
|
||
|
||
; Application version, changed for each release to match the version
|
||
|
||
; Uncomment this to create a package that includes binaries and binary dependencies only.
|
||
!define INC_PLUGINS
|
||
|
||
!system 'SubWCRev.exe ..\pcsx2 templates\svnrev_pcsx2.nsh svnrev_pcsx2.nsh'
|
||
!include "svnrev_pcsx2.nsh"
|
||
|
||
;LoadLanguageFile "${NSISDIR}\Contrib\Language files\english.nlf"
|
||
|
||
; =======================================================================
|
||
; Global Names and Such
|
||
; =======================================================================
|
||
|
||
!define APP_VERSION "0.9.7"
|
||
!define APP_NAME "PCSX2 ${APP_VERSION} (r${SVNREV})"
|
||
!define APP_FILENAME "pcsx2-r${SVNREV}"
|
||
|
||
!define UNINSTALL_LOG "Uninst-${APP_FILENAME}"
|
||
|
||
!define INSTDIR_REG_ROOT "HKLM"
|
||
|
||
|
||
; The name of the installer
|
||
Name "${APP_NAME}"
|
||
|
||
OutFile "${APP_FILENAME}-setup.exe"
|
||
|
||
; The default installation directory
|
||
InstallDir "$PROGRAMFILES\PCSX2 ${APP_VERSION}"
|
||
|
||
; Registry key to check for directory (so if you install again, it will
|
||
; overwrite the old one automatically)
|
||
InstallDirRegKey ${INSTDIR_REG_ROOT} "Software\PCSX2" "Install_Dir"
|
||
|
||
XPStyle on
|
||
|
||
; LZMA is the best, by far, so let's make sure it's always in use:
|
||
; (dictionaries larger than 24MB don't seem to help)
|
||
SetCompressor /SOLID lzma
|
||
SetCompressorDictSize 24
|
||
|
||
; These defines are dependent on NSIS vars assigned above.
|
||
|
||
!define APP_EXE "$INSTDIR\${APP_FILENAME}.exe"
|
||
!define INSTDIR_REG_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_FILENAME}"
|
||
|
||
Var DirectXSetupError
|
||
|
||
; =======================================================================
|
||
; Plugin Includes
|
||
; =======================================================================
|
||
; Note that zzOgl is disabled for now because it requires CG dependencies to be installed.
|
||
|
||
!ifdef INC_PLUGINS
|
||
!system 'SubWCRev.exe ..\plugins\gsdx templates\svnrev_gsdx.nsh svnrev_gsdx.nsh'
|
||
!system 'SubWCRev.exe ..\plugins\spu2-x templates\svnrev_spu2x.nsh svnrev_spu2x.nsh'
|
||
!system 'SubWCRev.exe ..\plugins\cdvdiso templates\svnrev_cdvdiso.nsh svnrev_cdvdiso.nsh'
|
||
!system 'SubWCRev.exe ..\plugins\lilypad templates\svnrev_lilypad.nsh svnrev_lilypad.nsh'
|
||
!system 'SubWCRev.exe ..\plugins\zerogs\dx templates\svnrev_zerogs.nsh svnrev_zerogs.nsh'
|
||
;!system 'SubWCRev.exe ..\plugins\zzogl-pg templates\svnrev_zzogl.nsh svnrev_zzogl.nsh'
|
||
!system 'SubWCRev.exe ..\plugins\zerospu2 templates\svnrev_zerospu2.nsh svnrev_zerospu2.nsh'
|
||
|
||
!include "svnrev_gsdx.nsh"
|
||
!include "svnrev_spu2x.nsh"
|
||
!include "svnrev_cdvdiso.nsh"
|
||
!include "svnrev_lilypad.nsh"
|
||
!include "svnrev_zerogs.nsh"
|
||
;!include "svnrev_zzogl.nsh"
|
||
!include "svnrev_zerospu2.nsh"
|
||
!endif
|
||
|
||
|
||
!include "MUI2.nsh"
|
||
!include "AdvUninstLog.nsh"
|
||
|
||
; =======================================================================
|
||
; Vista/Win7 UAC Stuff
|
||
; =======================================================================
|
||
|
||
!include "IsUserAdmin.nsi"
|
||
|
||
; Allow admin-rights PCSX2 users to be hardcore!
|
||
AllowRootDirInstall true
|
||
|
||
; FIXME !!
|
||
; Request application privileges for Windows Vista/7; I'd love for this to be sensible about which
|
||
; execution level it requests, but UAC is breaking my mind. I included some code for User type
|
||
; detection in function IsUserAdmin, but not really using it constructively yet. (see also our
|
||
; uses of SetShellVarContext in the installer sections)
|
||
RequestExecutionLevel admin
|
||
|
||
; This defines the Advanced Uninstaller mode of operation...
|
||
!insertmacro UNATTENDED_UNINSTALL
|
||
|
||
!define MUI_HEADERIMAGE
|
||
!define MUI_HEADERIMAGE_BITMAP "banner.bmp"
|
||
!define MUI_COMPONENTSPAGE_NODESC
|
||
|
||
!insertmacro MUI_PAGE_COMPONENTS
|
||
!insertmacro MUI_PAGE_DIRECTORY
|
||
!insertmacro MUI_PAGE_INSTFILES
|
||
|
||
!insertmacro MUI_UNPAGE_CONFIRM
|
||
!insertmacro MUI_UNPAGE_COMPONENTS
|
||
!insertmacro MUI_UNPAGE_INSTFILES
|
||
|
||
!insertmacro MUI_LANGUAGE "English"
|
||
|
||
; =======================================================================
|
||
; Setup.exe Properties
|
||
; =======================================================================
|
||
; (for the professionalism!!)
|
||
|
||
VIAddVersionKey /LANG=${LANG_ENGLISH} "ProductName" "${APP_NAME}"
|
||
;VIAddVersionKey /LANG=${LANG_ENGLISH} "Comments" "A test comment"
|
||
VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalCopyright" "<22> 2010 PCSX2 Dev Team"
|
||
VIAddVersionKey /LANG=${LANG_ENGLISH} "FileDescription" "Installs PCSX2, a Playstation 2 Emulator for the PC"
|
||
VIAddVersionKey /LANG=${LANG_ENGLISH} "FileVersion" "${APP_VERSION}.${SVNREV}"
|
||
|
||
VIProductVersion "${APP_VERSION}.${SVNREV}"
|
||
|
||
; =======================================================================
|
||
; Installer Sections
|
||
; =======================================================================
|
||
|
||
; -------------------------------------
|
||
; Test if Visual Studio Redistributables 2008 SP1 installed
|
||
; Returns -1 if there is no VC redistributables intstalled
|
||
;
|
||
Function CheckVCRedist
|
||
|
||
Push $R0
|
||
ClearErrors
|
||
ReadRegDword $R0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{9A25302D-30C0-39D9-BD6F-21E6EC160475}" "Version"
|
||
|
||
IfErrors 0 VSRedistInstalled
|
||
StrCpy $R0 "-1"
|
||
|
||
VSRedistInstalled:
|
||
Exch $R0
|
||
|
||
FunctionEnd
|
||
|
||
; -----------------------------------------------------------------------
|
||
; Basic section (emulation proper)
|
||
Section "${APP_NAME} (required)"
|
||
|
||
SectionIn RO
|
||
|
||
; --- UAC NIGHTMARES ---
|
||
; Ideally this would default to 'current' for user-level installs and 'all' for admin-level installs.
|
||
; There are problems to be aware of, however!
|
||
;
|
||
; * If the user is an admin, Windows Vista/7 will DEFAULT to an "all" shell context (installing shortcuts
|
||
; for all users), even if we don't want it to (which causes the uninstaller to fail!)
|
||
; * If the user is not an admin, setting Shell Context to all will cause the installer to fail because the
|
||
; user won't have permission enough to install it at all (sigh).
|
||
;
|
||
; For now we just require Admin rights to install PCSX2. An ideal solution would be to use our IsUserAdmin
|
||
; function to auto-detect and modify nsis installer behavior accordingly.
|
||
;
|
||
; (note! the SetShellVarContext use in the uninstaller section must match this one!)
|
||
|
||
SetShellVarContext all
|
||
;SetShellVarContext current
|
||
|
||
; Note that v3 pthreads is compatible with v4 pthreads, so we just copy v4 oover both
|
||
; filenames. This allows many older plugin versions to continue to work. (note that
|
||
; v3 will be removed for 0.9.8).
|
||
|
||
SetOutPath "$INSTDIR"
|
||
!insertmacro UNINSTALL.LOG_OPEN_INSTALL
|
||
File /oname=${APP_EXE} ..\bin\pcsx2.exe
|
||
;File /nonfatal /oname=pcsx2-dev-r${SVNREV}.exe ..\bin\pcsx2-dev.exe
|
||
File ..\bin\w32pthreads.v4.dll
|
||
File /oname=w32pthreads.v3.dll ..\bin\w32pthreads.v4.dll
|
||
!insertmacro UNINSTALL.LOG_CLOSE_INSTALL
|
||
|
||
; ------------------------------------------
|
||
; -- Languages and Patches --
|
||
; ------------------------------------------
|
||
|
||
; In 0.9.7 there is only English, so including the other mo files (for now) is pointless.
|
||
; This code will be re-enabled when the new GUI is translated.
|
||
|
||
!ifdef INC_LANGS
|
||
SetOutPath $INSTDIR\Langs
|
||
!insertmacro UNINSTALL.LOG_OPEN_INSTALL
|
||
File /nonfatal /r ..\bin\Langs\*.mo
|
||
!insertmacro UNINSTALL.LOG_CLOSE_INSTALL
|
||
!endif
|
||
|
||
; ------------------------------------------
|
||
; -- Plugins Section --
|
||
; ------------------------------------------
|
||
SetOutPath $INSTDIR\Plugins
|
||
|
||
; NULL plugins are required, and really there should be more but we don't have working
|
||
; SPU2 null plugins right now.
|
||
|
||
!insertmacro UNINSTALL.LOG_CLOSE_INSTALL
|
||
File ..\bin\Plugins\GSnull.dll
|
||
;File ..\bin\Plugins\SPU2null.dll
|
||
File ..\bin\Plugins\USBnull.dll
|
||
File ..\bin\Plugins\DEV9null.dll
|
||
File ..\bin\Plugins\FWnull.dll
|
||
File ..\bin\Plugins\CDVDnull.dll
|
||
!insertmacro UNINSTALL.LOG_CLOSE_INSTALL
|
||
|
||
; -- Other plugins --
|
||
|
||
!ifdef INC_PLUGINS
|
||
|
||
File /nonfatal /oname=gsdx-sse2-r${SVNREV_GSDX}.dll ..\bin\Plugins\gsdx-sse2.dll
|
||
File /nonfatal /oname=gsdx-ssse3-r${SVNREV_GSDX}.dll ..\bin\Plugins\gsdx-ssse3.dll
|
||
File /nonfatal /oname=gsdx-sse4-r${SVNREV_GSDX}.dll ..\bin\Plugins\gsdx-sse4.dll
|
||
File /nonfatal /oname=spu2-x-r${SVNREV_SPU2X}.dll ..\bin\Plugins\spu2-x.dll
|
||
File /nonfatal /oname=cdvdiso-r${SVNREV_CDVDISO}.dll ..\bin\Plugins\cdvdiso.dll
|
||
File /nonfatal /oname=lilypad-r${SVNREV_LILYPAD}.dll ..\bin\Plugins\lilypad.dll
|
||
|
||
File /nonfatal /oname=zerogs-r${SVNREV_ZEROGS}.dll ..\bin\Plugins\zerogs.dll
|
||
File /nonfatal /oname=zerospu2-r${SVNREV_ZEROSPU2}.dll ..\bin\Plugins\zerospu2.dll
|
||
|
||
!endif
|
||
|
||
!insertmacro UNINSTALL.LOG_CLOSE_INSTALL
|
||
|
||
; ------------------------------------------
|
||
; -- Registry Section --
|
||
; ------------------------------------------
|
||
|
||
; Write the installation path into the registry
|
||
WriteRegStr HKLM Software\PCSX2 "Install_Dir" "$INSTDIR"
|
||
|
||
; Write the uninstall keys for Windows
|
||
WriteRegStr HKLM "${INSTDIR_REG_KEY}" "DisplayName" "PCSX2 - Playstation 2 Emulator"
|
||
WriteRegStr HKLM "${INSTDIR_REG_KEY}" "UninstallString" "${UNINST_EXE}"
|
||
WriteRegDWORD HKLM "${INSTDIR_REG_KEY}" "NoModify" 1
|
||
WriteRegDWORD HKLM "${INSTDIR_REG_KEY}" "NoRepair" 1
|
||
WriteUninstaller "${UNINST_EXE}"
|
||
|
||
SectionEnd
|
||
|
||
; -----------------------------------------------------------------------
|
||
; Start Menu - Optional section (can be disabled by the user)
|
||
Section "Start Menu Shortcuts"
|
||
|
||
; CreateShortCut gets the working directory from OutPath
|
||
SetOutPath "$INSTDIR"
|
||
|
||
CreateDirectory "$SMPROGRAMS\PCSX2"
|
||
CreateShortCut "$SMPROGRAMS\PCSX2\Uninstall ${APP_NAME}.lnk" "${UNINST_EXE}" "" "${UNINST_EXE}" 0
|
||
CreateShortCut "$SMPROGRAMS\PCSX2\${APP_NAME}.lnk" "${APP_EXE}" "" "${APP_EXE}" 0
|
||
|
||
;IfFileExists ..\bin\pcsx2-dev.exe 0 +2
|
||
; CreateShortCut "PCSX2\pcsx2-dev-r${SVNREV}.lnk" "$INSTDIR\pcsx2-dev-r${SVNREV}.exe" "" "$INSTDIR\pcsx2-dev-r${SVNREV}.exe" 0 "" "" \
|
||
; "PCSX2 Devel (has additional logging support)"
|
||
|
||
SectionEnd
|
||
|
||
; -----------------------------------------------------------------------
|
||
; Desktop Icon - Optional section (can be disabled by the user)
|
||
Section "Desktop Shortcut"
|
||
|
||
; CreateShortCut gets the working directory from OutPath
|
||
SetOutPath "$INSTDIR"
|
||
|
||
CreateShortCut "$DESKTOP\${APP_NAME}.lnk" "${APP_EXE}" "" "${APP_EXE}" 0 "" "" "A Playstation 2 Emulator"
|
||
|
||
SectionEnd
|
||
|
||
; -----------------------------------------------------------------------
|
||
; MSVC Redistributable - required if the user does not already have it
|
||
; Note: if your NSIS generates an error here it means you need to download the latest
|
||
; visual studio redist package from microsoft. Any redist 2008/SP1 or newer will do.
|
||
Section "Microsoft Visual C++ 2008 SP1 Redist (required)"
|
||
|
||
SectionIn RO
|
||
|
||
SetOutPath "$TEMP"
|
||
File "vcredist_x86.exe"
|
||
|
||
; For some reason the redist check isn't reliable on some fresh XP installs? Whatever, we can
|
||
; just re-run the stupid thing every time. It'll ask to "modify" or "repair", but until we
|
||
; get a better solution, this will have to do --air
|
||
|
||
;Call CheckVCRedist
|
||
;StrCmp $R0 "-1" skipRedist
|
||
ExecWait "$TEMP\vcredist_x86.exe"
|
||
;Goto done
|
||
|
||
;skipRedist:
|
||
;DetailPrint "Visual C++ 2008 SP1 Redistributable already installed, skipping..."
|
||
|
||
;done:
|
||
SectionEnd
|
||
|
||
; -----------------------------------------------------------------------
|
||
; This section needs to be last, so that in case it fails, the rest of the program will
|
||
; be installed cleanly.
|
||
;
|
||
; This section could be optional, but why not? It's pretty painless to double-check that
|
||
; all the libraries are up-to-date.
|
||
;
|
||
Section "DirectX Web Setup (required)" SEC_DIRECTX
|
||
|
||
SectionIn RO
|
||
|
||
SetOutPath "$TEMP"
|
||
File "dxwebsetup.exe"
|
||
DetailPrint "Running DirectX Web Setup..."
|
||
ExecWait '"$TEMP\dxwebsetup.exe" /Q' $DirectXSetupError
|
||
DetailPrint "Finished DirectX Web Setup"
|
||
|
||
Delete "$TEMP\dxwebsetup.exe"
|
||
|
||
SectionEnd
|
||
|
||
;--------------------------------
|
||
Function .onInit
|
||
|
||
;prepare Advanced Uninstall log always within .onInit function
|
||
!insertmacro UNINSTALL.LOG_PREPARE_INSTALL
|
||
|
||
; MORE UAC HELL ---------- >
|
||
call IsUserAdmin
|
||
|
||
FunctionEnd
|
||
|
||
|
||
Function .onInstSuccess
|
||
|
||
;create/update log always within .onInstSuccess function
|
||
!insertmacro UNINSTALL.LOG_UPDATE_INSTALL
|
||
|
||
FunctionEnd
|
||
|
||
|
||
; =======================================================================
|
||
; Un.Installer Sections
|
||
; =======================================================================
|
||
|
||
; Safe directory deletion code. :)
|
||
;
|
||
Function un.DeleteDirIfEmpty
|
||
|
||
; Use $TEMP as the out dir when removing directories, since NSIS won't let us remove the
|
||
; "current" directory.
|
||
SetOutPath "$TEMP"
|
||
|
||
FindFirst $R0 $R1 "$0\*.*"
|
||
strcmp $R1 "." 0 NoDelete
|
||
FindNext $R0 $R1
|
||
strcmp $R1 ".." 0 NoDelete
|
||
ClearErrors
|
||
FindNext $R0 $R1
|
||
IfErrors 0 NoDelete
|
||
FindClose $R0
|
||
Sleep 1000
|
||
RMDir "$0"
|
||
NoDelete:
|
||
FindClose $R0
|
||
FunctionEnd
|
||
|
||
Function un.removeShorties
|
||
|
||
; Remove shortcuts, if any
|
||
|
||
Delete "$DESKTOP\${APP_NAME}.lnk"
|
||
|
||
Delete "$SMPROGRAMS\PCSX2\Uninstall ${APP_NAME}.lnk"
|
||
Delete "$SMPROGRAMS\PCSX2\${APP_NAME}.lnk"
|
||
;Delete "$SMPROGRAMS\PCSX2\pcsx2-dev-r${SVNREV}.lnk"
|
||
|
||
StrCpy $0 "$SMPROGRAMS\PCSX2"
|
||
Call un.DeleteDirIfEmpty
|
||
|
||
FunctionEnd
|
||
|
||
; -----------------------------------------------------------------------
|
||
Section "Un.Core Executables ${APP_NAME}"
|
||
|
||
SetShellVarContext all
|
||
|
||
!insertmacro UNINSTALL.LOG_UNINSTALL "$INSTDIR"
|
||
|
||
; Remove registry keys (but only the ones related to the installer -- user options remain)
|
||
DeleteRegKey HKLM "${INSTDIR_REG_KEY}"
|
||
|
||
Call un.removeShorties
|
||
|
||
SectionEnd
|
||
|
||
; -----------------------------------------------------------------------
|
||
Section "Un.Shared Components (DLLs, Languages, etc)"
|
||
|
||
MessageBox MB_YESNO "WARNING! If you have multiple versions of PCSX2 installed, removing all shared files will probably break them. Are you sure you want to proceed?" \
|
||
IDYES true IDNO false
|
||
|
||
true:
|
||
!insertmacro UNINSTALL.LOG_UNINSTALL "$INSTDIR\Langs"
|
||
!insertmacro UNINSTALL.LOG_UNINSTALL "$INSTDIR\Plugins"
|
||
|
||
; Kill the entire PCSX2 registry key.
|
||
DeleteRegKey ${INSTDIR_REG_ROOT} Software\PCSX2
|
||
|
||
false:
|
||
; User cancelled -- do nothing!!
|
||
|
||
SectionEnd
|
||
|
||
; begin uninstall, could be added on top of uninstall section instead
|
||
Function un.onInit
|
||
!insertmacro UNINSTALL.LOG_BEGIN_UNINSTALL
|
||
FunctionEnd
|
||
|
||
|
||
Function un.onUninstSuccess
|
||
!insertmacro UNINSTALL.LOG_END_UNINSTALL
|
||
|
||
; And remove the various install dir(s) but only if they're clean of user content:
|
||
|
||
StrCpy $0 "$INSTDIR\langs"
|
||
Call un.DeleteDirIfEmpty
|
||
|
||
StrCpy $0 "$INSTDIR\plugins"
|
||
Call un.DeleteDirIfEmpty
|
||
|
||
StrCpy $0 "$INSTDIR"
|
||
Call un.DeleteDirIfEmpty
|
||
FunctionEnd
|
||
|