Release note: Bug 2203 - [Raptor] Building extension makefile with SBS_BUILD_DIR set to another drive
# Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).# All rights reserved.# This component and the accompanying materials are made available# under the terms of the License "Eclipse Public License v1.0"# which accompanies this distribution, and is available# at the URL "http://www.eclipse.org/legal/epl-v10.html".## Initial Contributors:# Nokia Corporation - initial contribution.## Contributors:## Description: # Raptor installer/uninstaller script# Standard NSIS Library includes !include "MUI2.nsh"!include "LogicLib.nsh"!include "WinMessages.nsh"# Extra plugin includes!include "nsDialogs.nsh"!include "Registry.nsh"!include "NSISpcre.nsh"!include "Time.nsh"# Define functions from NSISpcre.nsh !insertmacro REMatches!insertmacro un.REMatches!insertmacro REQuoteMeta# VariablesVar DIALOGVar RESULT # Generic variable to obtain results, and immediately thrown away afterVar RESULT2 # Generic variable to obtain results, and immediately thrown away afterVar SBS_HOMEVar USERONLYINSTALL_HWND # HWND of radio button control for user-only installationVar ALLUSERSINSTALL_HWND # HWND of radio button control for system installationVar NOENVCHANGES_HWND # HWND of radio button control for file-only installationVar USERONLYINSTALL_STATE # State of user-only radio buttonVar ALLUSERSINSTALL_STATE # State of system radio buttonVar NOENVCHANGES_STATE # State of file-only installation radio buttonVar INSTALL_TYPE # Type of installer ("USR" or "SYS")# Custom includes (depend on above variables so much be here)!include "raptorinstallerutils.nsh" # Functions and macros for handling environment variables# !include "raptorversion.nsh" # Define the RAPTOR_VERSION variable# Defines!define INSTALLER_NAME "Raptor v${RAPTOR_VERSION}"!define RAPTOR "sbs"!define INSTALLER_FILENAME "${RAPTOR}-${RAPTOR_VERSION}.exe"!define UNINSTALLER_FILENAME "${RAPTOR}-${RAPTOR_VERSION}-uninstaller.exe"########################## Attributes ############################ Name of installer executable to create!OutFile ${INSTALLER_FILENAME}# Name for the installer captionName "Raptor v${RAPTOR_VERSION}"####################### Generic Behaviour ######################## Vista support; use admin in case user decides to install Raptor for all usersRequestExecutionLevel admin# Set XPStyle onXPStyle on###################### Installer Behaviour ####################### Warn on Cancel!define MUI_ABORTWARNING# Abort warning text!define MUI_ABORTWARNING_TEXT "Are you sure you want to quit the ${INSTALLER_NAME} installer?"# Cancel is default button on cancel dialogue boxes.!define MUI_ABORTWARNING_CANCEL_DEFAULT# Don't just to final page!define MUI_FINISHPAGE_NOAUTOCLOSE# Show installer detailsShowInstDetails show##################### Pages in the installer #####################!insertmacro MUI_PAGE_WELCOME!insertmacro MUI_PAGE_LICENSE ${RAPTOR_LOCATION}\license.txt!define MUI_PAGE_HEADER_TEXT "Installation type"Page custom UserOrSysInstall UserOrSysInstallLeave!define MUI_PAGE_CUSTOMFUNCTION_LEAVE DirLeave # Directory page exit function - disallow spaces in $INSTDIR!insertmacro MUI_PAGE_DIRECTORY!insertmacro MUI_PAGE_INSTFILES!insertmacro MUI_PAGE_FINISH######################## .onInit function ########################Function .onInit StrCpy $INSTDIR "C:\Apps\Raptor"FunctionEnd#################### Sections in the installer ##################### "Sections" - i.e. components to install. This installer# only has Raptor, so there is no point giving options # to the user.Section "Install Raptor" INSTALLRAPTOR StrCpy $SBS_HOME "SBS_HOME" # Install Raptor SetOutPath "$INSTDIR\bin" File /r /x distribution.policy.s60 ${RAPTOR_LOCATION}\bin\*.* SetOutPath "$INSTDIR\examples" File /r /x distribution.policy.s60 ${RAPTOR_LOCATION}\examples\*.* SetOutPath "$INSTDIR\lib" File /r /x distribution.policy.s60 ${RAPTOR_LOCATION}\lib\*.* SetOutPath "$INSTDIR\python" File /r /x distribution.policy.s60 ${RAPTOR_LOCATION}\python\*.* SetOutPath "$INSTDIR\schema" File /r /x distribution.policy.s60 ${RAPTOR_LOCATION}\schema\*.* SetOutPath "$INSTDIR\win32\bin" File /r /x distribution.policy.s60 ${RAPTOR_LOCATION}\win32\bin\*.* SetOutPath "$INSTDIR\win32\bv" File /r /x distribution.policy.s60 /x .hg ${BV_LOCATION}\*.* SetOutPath "$INSTDIR\win32\cygwin" File /r /x distribution.policy.s60 /x .hg ${CYGWIN_LOCATION}\*.* SetOutPath "$INSTDIR\win32\mingw" File /r /x distribution.policy.s60 /x .hg ${MINGW_LOCATION}\*.* SetOutPath "$INSTDIR\win32\python264" File /r /x distribution.policy.s60 /x .hg ${PYTHON_LOCATION}\*.* SetOutPath "$INSTDIR" File ${RAPTOR_LOCATION}\RELEASE-NOTES.html SetOutPath "$INSTDIR\notes" File /r /x distribution.policy.s60 ${RAPTOR_LOCATION}\notes\*.* ${Unless} $INSTALL_TYPE == "NO_ENV" # Back up system and user environments before changing them. !insertmacro DefineDateStamp !define SYS_REG_BACKUP_FILE "$INSTDIR\SysEnvBackUpPreInstall-${DATE_STAMP}.reg" !define USR_REG_BACKUP_FILE "$INSTDIR\UsrEnvBackUpPreInstall-${DATE_STAMP}.reg" # Save System Environment just in case. ${registry::SaveKey} "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "${SYS_REG_BACKUP_FILE}" "" "$RESULT" ${If} $RESULT == 0 DetailPrint "Successfully backed up system environment in ${SYS_REG_BACKUP_FILE}." ${Else} DetailPrint "Failed to back up system environment due to an unknown error." ${EndIf} # Save user Environment just in case. ${registry::SaveKey} "HKCU\Environment" "${USR_REG_BACKUP_FILE}" "" "$RESULT" ${If} $RESULT == 0 DetailPrint "Successfully backed up user environment in ${USR_REG_BACKUP_FILE}." ${Else} DetailPrint "Failed to back up user environment due to an unknown error." ${EndIf} # Reset error flag ClearErrors # Write SBS_HOME variable; if it exists, the user will be asked if they want it to be overwritten. # Read the env var from the appropriate place !insertmacro ReadEnvVar $SBS_HOME $RESULT ${Unless} ${Errors} # No errors, so $SBS_HOME exists DetailPrint "Env Var $SBS_HOME exists with value $RESULT" # Ask user if they want it replaced. If yes, write it, if no don't write it. MessageBox MB_YESNO|MB_ICONQUESTION "The ${INSTALLER_NAME} installer has detected that you already have the SBS_HOME environment variable set with value $RESULT. Would you like the installer to overwrite it with the value $INSTDIR? Click yes to over write with value $INSTDIR, and no to leave it as $RESULT." IDYES write_env_var_yes IDNO write_env_var_no ${Else} # No env var named $SBS_HOME DetailPrint "Env Var $SBS_HOME does not exist!" ${EndUnless}write_env_var_yes: # Write SBS_HOME to registry Push "SBS_HOME" # Third on stack Push "$INSTDIR" # Second on stack Push "" # First on stack # Needs env var name, env var value, then "" on the stack call WriteEnvVar # Prepend PATH with %SBS_HOME%\bin Push "%SBS_HOME%\bin" # First on stack call PrependToPath goto endwrite_env_var_no: DetailPrint "Not writing the environment variable $SBS_HOME."end: ${EndUnless} # Generate batch file to set environment variables for Raptor StrCpy $RESULT "@REM Environment variables for ${INSTALLER_NAME}$\r$\nset SBS_HOME=$INSTDIR$\r$\nset PATH=%SBS_HOME%\bin;%PATH%$\r$\n" SetOutPath "$INSTDIR" !insertmacro WriteFile "RaptorEnv.bat" "$RESULT"SectionEnd# Finishing up installation.Section ${Unless} $INSTALL_TYPE == "NO_ENV" # Refresh environment to get changes for SBS_HOME and PATH !insertmacro RefreshEnv ${EndUnless} # Write the uninstaller # WriteUninstaller "$INSTDIR\${UNINSTALLER_FILENAME}" WriteUninstaller "$INSTDIR\${UNINSTALLER_FILENAME}" # Unload registry plug in ${registry::Unload}SectionEnd# Custom install page to select install typeFunction UserOrSysInstall !insertmacro MUI_HEADER_TEXT "Choose Installation Type" "Choose the type of installation \ you would like for your computer." nsDialogs::Create 1018 Pop $DIALOG # Exit is unable to create dialog ${If} $DIALOG == error Abort ${EndIf} # Create second radio button for system install #${NSD_CreateRadioButton} 0 10u 100% 33% "Install Raptor for all users on this computer. \ #(Recommended).$\nThis option modifies system wide environment variables." #Pop $ALLUSERSINSTALL_HWND # Create first radio button for user install #${NSD_CreateRadioButton} 0 45u 100% 67% "Install Raptor just for me on this computer.\ #$\nThis option modifies only user environment variables." #Pop $USERONLYINSTALL_HWND # Create first radio button for system install ${NSD_CreateRadioButton} 0 0% 100% 30% "Install Raptor for all users on this computer. \ (Recommended).$\nThis option modifies system wide environment variables." Pop $ALLUSERSINSTALL_HWND # Create second radio button for user install ${NSD_CreateRadioButton} 0 25% 100% 30% "Install Raptor just for me on this computer.\ $\nThis option modifies only user environment variables." Pop $USERONLYINSTALL_HWND # Create third radio button for file-only install ${NSD_CreateRadioButton} 0 50% 100% 40% "Install, but do not modify the environment.\ $\nThis option only unpacks Raptor's files. A batch file in the installation \ folder (RaptorEnv.bat) can be used to set Raptor's environment variables in a command prompt." Pop $NOENVCHANGES_HWND # Update page control with previous state, if set. # Initially these will be blank, so set system install to be on by default. ${If} $USERONLYINSTALL_STATE == "" ${AndIf} $ALLUSERSINSTALL_STATE == "" ${AndIf} $NOENVCHANGES_STATE == "" ${NSD_SetState} $ALLUSERSINSTALL_HWND ${BST_CHECKED} ${Else} # Previously set, user has returned to this page using "Back" button ${If} $USERONLYINSTALL_STATE == ${BST_CHECKED} ${NSD_SetState} $USERONLYINSTALL_HWND ${BST_CHECKED} ${ElseIf} $NOENVCHANGES_STATE == ${BST_CHECKED} ${NSD_SetState} $NOENVCHANGES_HWND ${BST_CHECKED} ${Else} ${NSD_SetState} $ALLUSERSINSTALL_HWND ${BST_CHECKED} ${EndIf} ${EndIf} nsDialogs::ShowFunctionEnd# Store the states of the radio buttons once the user has left the page.Function UserOrSysInstallLeave ${NSD_GetState} $USERONLYINSTALL_HWND $USERONLYINSTALL_STATE ${NSD_GetState} $ALLUSERSINSTALL_HWND $ALLUSERSINSTALL_STATE ${NSD_GetState} $NOENVCHANGES_HWND $NOENVCHANGES_STATE # Set the ${INSTALL_TYPE} variable ${If} $USERONLYINSTALL_STATE == ${BST_CHECKED} StrCpy $INSTALL_TYPE "USR" ${EndIf} ${If} $ALLUSERSINSTALL_STATE == ${BST_CHECKED} StrCpy $INSTALL_TYPE "SYS" ${EndIf} ${If} $NOENVCHANGES_STATE == ${BST_CHECKED} StrCpy $INSTALL_TYPE "NO_ENV" ${EndIf} ${Unless} $INSTALL_TYPE == "USR" ${AndUnless} $INSTALL_TYPE == "SYS" ${AndUnless} $INSTALL_TYPE == "NO_ENV" Abort "Failed to determine installation type.\n\ $$INSTALL_TYPE = $\"$INSTALL_TYPE$\"." ${EndUnless} FunctionEndFunction DirLeave StrCpy $0 " " ${REQuoteMeta} $9 $0 # $9 now contains the meta-quoted version of $0 ${If} $INSTDIR =~ $9 MessageBox MB_OK|MB_ICONSTOP "Please choose a directory without a space in it." Abort ${EndIf}FunctionEnd########################### Uninstaller ################################################# .onInit function ########################Function un.onInit !undef DATE_STAMP !insertmacro DefineDateStampFunctionEnd########################### Behaviour ############################ Warn on Cancel!define MUI_UNABORTWARNING# Abort warning text!undef MUI_UNABORTWARNING_TEXT!define MUI_UNABORTWARNING_TEXT "Are you sure you want to quit the ${INSTALLER_NAME} uninstaller?"# Cancel is default button on cancel dialogue boxes.!define MUI_UNABORTWARNING_CANCEL_DEFAULT# Don't just to final page!define MUI_UNFINISHPAGE_NOAUTOCLOSE# Show uninstaller detailsShowUninstDetails show#################### Pages in the uninstaller ####################!insertmacro MUI_UNPAGE_WELCOME!insertmacro MUI_UNPAGE_CONFIRM!insertmacro MUI_UNPAGE_INSTFILES!insertmacro MUI_UNPAGE_FINISH################## Sections in the uninstaller ################### There is only one section in the uninstaller.Section "Uninstall" # Delete Raptor RmDir /r $INSTDIR\bin RmDir /r $INSTDIR\examples RmDir /r $INSTDIR\lib RmDir /r $INSTDIR\python RmDir /r $INSTDIR\schema RmDir /r $INSTDIR\win32 Delete $INSTDIR\RELEASE-NOTES.html RmDir /r $INSTDIR\notes Delete $INSTDIR\RaptorEnv.bat Delete $INSTDIR\${UNINSTALLER_FILENAME} !undef SYS_REG_BACKUP_FILE !undef USR_REG_BACKUP_FILE !define SYS_REG_BACKUP_FILE "$INSTDIR\SysEnvBackUpPreUninstall-${DATE_STAMP}.reg" !define USR_REG_BACKUP_FILE "$INSTDIR\UsrEnvBackUpPreUninstall-${DATE_STAMP}.reg" # Save System Environment just in case. ${registry::SaveKey} "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "${SYS_REG_BACKUP_FILE}" "" "$RESULT" ${If} $RESULT == 0 DetailPrint "Successfully backed up system environment in ${SYS_REG_BACKUP_FILE}." ${Else} DetailPrint "Failed to back up system environment due to an unknown error." ${EndIf} # Save user Environment just in case. ${registry::SaveKey} "HKCU\Environment" "${USR_REG_BACKUP_FILE}" "" "$RESULT" ${If} $RESULT == 0 DetailPrint "Successfully backed up user environment in ${USR_REG_BACKUP_FILE}." ${Else} DetailPrint "Failed to back up user environment due to an unknown error." ${EndIf} # Reset error flag ClearErrors # Read user SBS_HOME !insertmacro ReadUsrEnvVar "SBS_HOME" $RESULT ${Unless} ${Errors} # No errors, so user %SBS_HOME% exists DetailPrint "Removing user environment variable SBS_HOME ($RESULT)" # Reset error flag ClearErrors !insertmacro RmUsrEnvVar "SBS_HOME" ${If} ${Errors} DetailPrint "ERROR: The ${INSTALLER_NAME} uninstaller could not remove the user environment variable SBS_HOME." DetailPrint "Please remove it manually." ${EndIf} ${Else} # No env var named $SBS_HOME DetailPrint "Note: Unable to find user environment variable SBS_HOME." DetailPrint "If required, this variable may need to be removed manually." ${EndUnless} # Reset error flag ClearErrors # Read system SBS_HOME !insertmacro ReadSysEnvVar "SBS_HOME" $RESULT ${Unless} ${Errors} # No errors, so system $SBS_HOME exists DetailPrint "Removing system environment variable SBS_HOME ($RESULT)" # Reset error flag ClearErrors !insertmacro RmSysEnvVar "SBS_HOME" ${If} ${Errors} DetailPrint "ERROR: The ${INSTALLER_NAME} uninstaller could not remove the \ System environment variable SBS_HOME." DetailPrint "Please remove it manually." ${EndIf} ${Else} # No env var named $SBS_HOME DetailPrint "Note: Unable to find system environment variable SBS_HOME." DetailPrint "If required, this variable may need to be removed manually." ${EndUnless} ################################# Clean up the path env vars ################################# # Reset error flag ClearErrors # Read user path !insertmacro ReadUsrPath $RESULT DetailPrint "Read user Path: $RESULT" ${Unless} ${Errors} # No errors, so user $SBS_HOME exists ${If} $RESULT == "" # If it came back empty. DetailPrint "No user Path available - nothing to do." ${Else} ${If} $RESULT un.=~ "%SBS_HOME%\\bin;" # Only need to act if %SBS_HOME%\bin; is in the Path DetailPrint "Removing %SBS_HOME%\bin; from user path" # Reset error flag and clean user Path ClearErrors !insertmacro RemoveFromPathString $RESULT "%SBS_HOME%\bin;" DetailPrint "DEBUG: User path $$RESULT = " DetailPrint "DEBUG: User path $RESULT" ${If} $RESULT == "" !insertmacro RmUsrEnvVar "Path" ${Else} # Write cleaned Path to registry !insertmacro WriteUsrEnvVarExp "Path" $RESULT ${EndIf} ${If} ${Errors} DetailPrint "ERROR: The ${INSTALLER_NAME} uninstaller could not clean the user Path. Please clean it manually." ${EndIf} ${Else} DetailPrint "Nothing to remove from user path." ${EndIf} ${EndIf} ${Else} # No user path DetailPrint "Note: Unable to find user Path environment variable." DetailPrint "Please check that the variable exists and remove %SBS_HOME\bin manually if required." ${EndUnless} # Read system path !insertmacro ReadSysPath $RESULT DetailPrint "Read system Path: $RESULT" ${Unless} ${Errors} # No errors, so system path read OK. ${If} $RESULT un.=~ "%SBS_HOME%\\bin;" # Only need to act if %SBS_HOME%\bin; is in the Path DetailPrint "Removing %SBS_HOME%\bin; from system path" # Reset error flag ClearErrors !insertmacro RemoveFromPathString $RESULT "%SBS_HOME%\bin;" DetailPrint "DEBUG: System Path $$RESULT = " DetailPrint "DEBUG: System Path $RESULT" ClearErrors # Write cleaned PATH to registry !insertmacro WriteSysEnvVarExp "Path" $RESULT ${If} ${Errors} DetailPrint "ERROR: The ${INSTALLER_NAME} uninstaller could not clean the PATH." DetailPrint "Please clean it manually." ${EndIf} ${Else} DetailPrint "Nothing to remove from system path." ${EndIf} ${Else} # Some error reading system path DetailPrint "Note: Unable to read the system Path environment variable." DetailPrint "Please check that the variable and remove %SBS_HOME\bin manually if required." ${EndUnless} ########################################################################## # Refresh environment to get changes for SBS_HOME and PATH !insertmacro RefreshEnv # Unload registry plug in ${registry::Unload}SectionEnd# Languages!insertmacro MUI_LANGUAGE "English"################################################ End ################################################