;Application for Windows install script ;Copyright (C) 2005-2013 Team XBMC ;http://xbmc.org ;-------------------------------- ;Include Modern UI !include "MUI2.nsh" !include "nsDialogs.nsh" !include "LogicLib.nsh" !include "WinVer.nsh" !include "x64.nsh" ;-------------------------------- ;General ;Name and file Name "${APP_NAME}" OutFile "${APP_NAME}Setup-${app_revision}-${app_branch}-${TARGET_ARCHITECTURE}.exe" ;Default installation folder !ifdef x64 InstallDir "$PROGRAMFILES64\${APP_NAME}" !else InstallDir "$PROGRAMFILES\${APP_NAME}" !endif ;Get installation folder from registry if available InstallDirRegKey HKCU "Software\${APP_NAME}" "" ;Request application privileges for Windows Vista RequestExecutionLevel admin InstProgressFlags smooth ; Installer file properties VIProductVersion ${VERSION_NUMBER} VIAddVersionKey "ProductName" "${APP_NAME}" VIAddVersionKey "Comments" "This application and its source code are freely distributable." VIAddVersionKey "LegalCopyright" "The trademark is owned by ${COMPANY_NAME}" VIAddVersionKey "CompanyName" "${COMPANY_NAME}" VIAddVersionKey "FileDescription" "${APP_NAME} ${VERSION_NUMBER} Setup" VIAddVersionKey "FileVersion" "${VERSION_NUMBER}" VIAddVersionKey "ProductVersion" "${VERSION_NUMBER}" VIAddVersionKey "LegalTrademarks" "${APP_NAME}" ;VIAddVersionKey "OriginalFilename" "${APP_NAME}Setup-${app_revision}-${app_branch}.exe" ;-------------------------------- ;Variables Var StartMenuFolder Var PageProfileState Var VSRedistSetupError Var /GLOBAL CleanDestDir ;-------------------------------- ;Interface Settings !define MUI_HEADERIMAGE !define MUI_ICON "..\..\tools\windows\packaging\media\application.ico" !define MUI_UNICON "..\..\tools\windows\packaging\media\application.ico" !define MUI_HEADERIMAGE_BITMAP "..\..\tools\windows\packaging\media\installer\header.bmp" !define MUI_HEADERIMAGE_UNBITMAP "..\..\tools\windows\packaging\media\installer\header.bmp" !define MUI_WELCOMEFINISHPAGE_BITMAP "..\..\tools\windows\packaging\media\installer\welcome-left.bmp" !define MUI_UNWELCOMEFINISHPAGE_BITMAP "..\..\tools\windows\packaging\media\installer\welcome-left.bmp" !define MUI_COMPONENTSPAGE_SMALLDESC !define MUI_FINISHPAGE_LINK "Please visit ${WEBSITE} for more information." !define MUI_FINISHPAGE_LINK_LOCATION "${WEBSITE}" !define MUI_FINISHPAGE_RUN "$INSTDIR\${APP_NAME}.exe" !define MUI_FINISHPAGE_RUN_NOTCHECKED !define MUI_ABORTWARNING ;-------------------------------- ;Pages !insertmacro MUI_PAGE_WELCOME !insertmacro MUI_PAGE_LICENSE "..\..\LICENSE.md" !insertmacro MUI_PAGE_COMPONENTS !define MUI_PAGE_CUSTOMFUNCTION_LEAVE CallbackDirLeave !insertmacro MUI_PAGE_DIRECTORY ;Start Menu Folder Page Configuration !define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU" !define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\${APP_NAME}" !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder" !insertmacro MUI_PAGE_STARTMENU Application $StartMenuFolder !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_PAGE_FINISH !insertmacro MUI_UNPAGE_WELCOME !insertmacro MUI_UNPAGE_CONFIRM UninstPage custom un.UnPageProfile un.UnPageProfileLeave !insertmacro MUI_UNPAGE_INSTFILES !insertmacro MUI_UNPAGE_FINISH ;-------------------------------- ;Languages !insertmacro MUI_LANGUAGE "English" ;-------------------------------- ;HelperFunction Function CallbackDirLeave ;deinstall kodi if it is already there in destination folder Call HandleKodiInDestDir FunctionEnd Function HandleOldKodiInstallation Var /GLOBAL INSTDIR_KODI ReadRegStr $INSTDIR_KODI HKCU "Software\${APP_NAME}" "" ;if former Kodi installation was detected in a different directory then the destination dir ;ask for uninstallation ;only ask about the other installation if user didn't already ;decide to not overwrite the installation in his originally selected destination dir ${IfNot} $CleanDestDir == "0" ${AndIfNot} $INSTDIR_KODI == "" ${AndIfNot} $INSTDIR_KODI == $INSTDIR MessageBox MB_YESNO|MB_ICONQUESTION "A previous ${APP_NAME} installation in a different folder was detected. Would you like to uninstall it?$\nYour current settings and library data will be kept intact." IDYES true IDNO false true: DetailPrint "Uninstalling $INSTDIR_KODI" SetDetailsPrint none ExecWait '"$INSTDIR_KODI\uninstall.exe" /S _?=$INSTDIR_KODI' SetDetailsPrint both ;this also removes the uninstall.exe which doesn't remove it self... Delete "$INSTDIR_KODI\uninstall.exe" ;if the directory is now empty we can safely remove it (rmdir won't remove non-empty dirs!) RmDir "$INSTDIR_KODI" false: ${EndIf} FunctionEnd Function HandleKodiInDestDir ;if former Kodi installation was detected in the destination directory - uninstall it first ${IfNot} $INSTDIR == "" ${AndIf} ${FileExists} "$INSTDIR\uninstall.exe" MessageBox MB_YESNO|MB_ICONQUESTION "A previous installation was detected in the selected destination folder. Do you really want to overwrite it?$\nYour settings and library data will be kept intact." IDYES true IDNO false true: StrCpy $CleanDestDir "1" Goto done false: StrCpy $CleanDestDir "0" Abort done: MessageBox MB_OK|MB_ICONINFORMATION "All binary add-ons (e.g. pvr, visualizations, inputstream, etc) that were previously included by default in the installer have been moved to the Kodi repository. You will have to install the ones you previously used from the repository.$\nYour add-on settings are kept intact and will be used again after installing the add-on." ${EndIf} FunctionEnd Function DeinstallKodiInDestDir ${If} $CleanDestDir == "1" DetailPrint "Uninstalling former ${APP_NAME} Installation in $INSTDIR" SetDetailsPrint none ExecWait '"$INSTDIR\uninstall.exe" /S _?=$INSTDIR' SetDetailsPrint both ;this also removes the uninstall.exe which doesn't remove it self... Delete "$INSTDIR\uninstall.exe" ${EndIf} FunctionEnd ;-------------------------------- ;Install levels InstType "Full" ; 1. InstType "Normal" ; 2. InstType "Minimal" ; 3. ;-------------------------------- ;Installer Sections Section "${APP_NAME}" SecAPP SetShellVarContext all SectionIn RO SectionIn 1 2 3 #section is in install type Normal/Full/Minimal ;deinstall kodi in destination dir if $CleanDestDir == "1" - meaning user has confirmed it Call DeinstallKodiInDestDir ;Start copying files SetOutPath "$INSTDIR" File "${app_root}\application\*.*" SetOutPath "$INSTDIR\addons" File /r "${app_root}\application\addons\*.*" File /nonfatal /r "${app_root}\addons\peripheral.*" SetOutPath "$INSTDIR\media" File /r "${app_root}\application\media\*.*" SetOutPath "$INSTDIR\system" File /r "${app_root}\application\system\*.*" SetOutPath "$INSTDIR\userdata" File /r "${app_root}\application\userdata\*.*" ;Store installation folder WriteRegStr HKCU "Software\${APP_NAME}" "" $INSTDIR ;Create uninstaller WriteUninstaller "$INSTDIR\Uninstall.exe" !insertmacro MUI_STARTMENU_WRITE_BEGIN Application ;Create shortcuts SetOutPath "$INSTDIR" CreateDirectory "$SMPROGRAMS\$StartMenuFolder" CreateShortCut "$SMPROGRAMS\$StartMenuFolder\${APP_NAME}.lnk" "$INSTDIR\${APP_NAME}.exe" \ "" "$INSTDIR\${APP_NAME}.exe" 0 SW_SHOWNORMAL \ "" "Start ${APP_NAME}." CreateShortCut "$SMPROGRAMS\$StartMenuFolder\Uninstall ${APP_NAME}.lnk" "$INSTDIR\Uninstall.exe" \ "" "$INSTDIR\Uninstall.exe" 0 SW_SHOWNORMAL \ "" "Uninstall ${APP_NAME}." WriteINIStr "$SMPROGRAMS\$StartMenuFolder\Visit ${APP_NAME} Online.url" "InternetShortcut" "URL" "${WEBSITE}" !insertmacro MUI_STARTMENU_WRITE_END ;add entry to add/remove programs WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" \ "DisplayName" "${APP_NAME}" WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" \ "UninstallString" "$INSTDIR\uninstall.exe" WriteRegDWORD HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" \ "NoModify" 1 WriteRegDWORD HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" \ "NoRepair" 1 WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" \ "InstallLocation" "$INSTDIR" WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" \ "DisplayIcon" "$INSTDIR\${APP_NAME}.exe,0" WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" \ "Publisher" "${COMPANY_NAME}" WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" \ "HelpLink" "${WEBSITE}" WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" \ "URLInfoAbout" "${WEBSITE}" SectionEnd ;*-addons.nsi are generated by genNsisIncludes.bat !include /nonfatal "audiodecoder-addons.nsi" !include /nonfatal "audioencoder-addons.nsi" !include /nonfatal "game-addons.nsi" !include /nonfatal "imagedecoder-addons.nsi" !include /nonfatal "inputstream-addons.nsi" !include /nonfatal "pvr-addons.nsi" !include /nonfatal "screensaver-addons.nsi" !include /nonfatal "vfs-addons.nsi" !include /nonfatal "visualization-addons.nsi" ;-------------------------------- ;Descriptions ;Language strings LangString DESC_SecAPP ${LANG_ENGLISH} "${APP_NAME} ${VERSION_NUMBER}" ;Assign language strings to sections !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN !insertmacro MUI_DESCRIPTION_TEXT ${SecAPP} $(DESC_SecAPP) !insertmacro MUI_FUNCTION_DESCRIPTION_END ;-------------------------------- ;Uninstaller Section Var UnPageProfileDialog Var UnPageProfileCheckbox Var UnPageProfileCheckbox_State Var UnPageProfileEditBox Function un.UnPageProfile !insertmacro MUI_HEADER_TEXT "Uninstall ${APP_NAME}" "Remove ${APP_NAME}'s profile folder from your computer." nsDialogs::Create /NOUNLOAD 1018 Pop $UnPageProfileDialog ${If} $UnPageProfileDialog == error Abort ${EndIf} ${NSD_CreateLabel} 0 0 100% 12u "Do you want to delete the profile folder which contains your ${APP_NAME} settings and library data?" Pop $0 ${NSD_CreateText} 0 13u 100% 12u "$APPDATA\${APP_NAME}\" Pop $UnPageProfileEditBox SendMessage $UnPageProfileEditBox ${EM_SETREADONLY} 1 0 ${NSD_CreateLabel} 0 30u 100% 24u "Leave the option box below unchecked to keep the profile folder which contains ${APP_NAME}'s settings and library data for later use. If you are sure you want to delete the profile folder you may check the option box.$\nWARNING: Deletion of the profile folder cannot be undone and you will lose all settings and library data." Pop $0 ${NSD_CreateCheckbox} 0 71u 100% 8u "Yes, I am sure and grant permission to also delete the profile folder." Pop $UnPageProfileCheckbox nsDialogs::Show FunctionEnd Function un.UnPageProfileLeave ${NSD_GetState} $UnPageProfileCheckbox $UnPageProfileCheckbox_State FunctionEnd Section "Uninstall" SetShellVarContext all ;ADD YOUR OWN FILES HERE... RMDir /r "$INSTDIR\addons" RMDir /r "$INSTDIR\language" RMDir /r "$INSTDIR\media" RMDir /r "$INSTDIR\system" RMDir /r "$INSTDIR\userdata" Delete "$INSTDIR\*.*" ;Un-install User Data if option is checked, otherwise skip ${If} $UnPageProfileCheckbox_State == ${BST_CHECKED} SetShellVarContext current RMDir /r "$APPDATA\${APP_NAME}\" SetShellVarContext all RMDir /r "$INSTDIR\portable_data\" ${EndIf} RMDir "$INSTDIR" !insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuFolder Delete "$SMPROGRAMS\$StartMenuFolder\${APP_NAME}.lnk" Delete "$SMPROGRAMS\$StartMenuFolder\Uninstall ${APP_NAME}.lnk" Delete "$SMPROGRAMS\$StartMenuFolder\Visit ${APP_NAME} Online.url" RMDir "$SMPROGRAMS\$StartMenuFolder" DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" DeleteRegKey /ifempty HKCU "Software\${APP_NAME}" SectionEnd ;-------------------------------- ;vs redist installer Section SectionGroup "Microsoft Visual C++ packages" SEC_VCREDIST Section "VS2017 C++ re-distributable Package (${TARGET_ARCHITECTURE})" SEC_VCREDIST1 DetailPrint "Running VS2017 re-distributable setup..." SectionIn 1 2 #section is in install type Full SetOutPath "$TEMP\vc2017" File "${app_root}\..\..\BuildDependencies\downloads\vcredist\2017\vcredist_${TARGET_ARCHITECTURE}.exe" ExecWait '"$TEMP\vc2017\vcredist_${TARGET_ARCHITECTURE}.exe" /install /quiet /norestart' $VSRedistSetupError RMDir /r "$TEMP\vc2017" DetailPrint "Finished VS2017 re-distributable setup" SetOutPath "$INSTDIR" SectionEnd SectionGroupEnd Function .onInit !ifdef x64 SetRegView 64 ${IfNot} ${RunningX64} MessageBox MB_OK|MB_ICONSTOP 'This is the 64-bit ${APP_NAME} installer.$\nPlease download the 32-bit version from ${WEBSITE}.$\n$\nClick Ok to quit Setup.' Quit ${Endif} !else ${If} ${RunningX64} MessageBox MB_YESNO|MB_ICONEXCLAMATION|MB_DEFBUTTON2 'There is a specific 64-bit ${APP_NAME} version available for download. Please consider installing the 64-bit version instead.$\nFor details visit ${WEBSITE}.$\nProceed with 32-bit installation anyway?' IDYES noprob Quit noprob: ${Endif} !endif ; Win7 SP1 is minimum requirement ${IfNot} ${AtLeastWin7} ${OrIf} ${IsWin7} ${AndIfNot} ${AtLeastServicePack} 1 MessageBox MB_OK|MB_ICONSTOP|MB_TOPMOST|MB_SETFOREGROUND "Windows 7 SP1 or above required.$\nInstall Service Pack 1 for Windows 7 and run setup again." Quit ${EndIf} Var /GLOBAL HotFixID ${If} ${IsWin7} StrCpy $HotFixID "2670838" ; Platform Update for Windows 7 SP1 ${Else} StrCpy $HotFixID "" ${Endif} ${If} $HotFixID != "" nsExec::ExecToStack 'cmd /Q /C "%SYSTEMROOT%\System32\wbem\wmic.exe /?"' Pop $0 ; return value (it always 0 even if an error occured) Pop $1 ; command output ${If} $0 != 0 ${OrIf} $1 == "" MessageBox MB_OK|MB_ICONSTOP|MB_TOPMOST|MB_SETFOREGROUND "Unable to run the Windows program wmic.exe to verify that Windows Update KB$HotFixID is installed.$\nWmic is not installed correctly.$\nPlease fix this issue and try again to install Kodi." Quit ${EndIf} nsExec::ExecToStack 'cmd /Q /C "%SYSTEMROOT%\System32\findstr.exe /?"' Pop $0 ; return value (it always 0 even if an error occured) Pop $1 ; command output ${If} $0 != 0 ${OrIf} $1 == "" MessageBox MB_OK|MB_ICONSTOP|MB_TOPMOST|MB_SETFOREGROUND "Unable to run the Windows program findstr.exe to verify that Windows Update KB$HotFixID is installed.$\nFindstr is not installed correctly.$\nPlease fix this issue and try again to install Kodi." Quit ${EndIf} nsExec::ExecToStack 'cmd /Q /C "%SYSTEMROOT%\System32\wbem\wmic.exe qfe get hotfixid | %SYSTEMROOT%\System32\findstr.exe "^KB$HotFixID[^0-9]""' Pop $0 ; return value (it always 0 even if an error occured) Pop $1 ; command output ${If} $0 != 0 ${OrIf} $1 == "" MessageBox MB_OK|MB_ICONSTOP|MB_TOPMOST|MB_SETFOREGROUND "Platform Update for Windows (KB$HotFixID) is required.$\nDownload and install Platform Update for Windows then run setup again." ExecShell "open" "http://support.microsoft.com/kb/$HotFixID" Quit ${EndIf} SetOutPath "$INSTDIR" ${EndIf} StrCpy $CleanDestDir "-1" FunctionEnd