315 lines
10 KiB
Plaintext
315 lines
10 KiB
Plaintext
# This installs two files, app.exe and logo.ico, creates a start menu shortcut, builds an uninstaller, and
|
|
# adds uninstall information to the registry for Add/Remove Programs
|
|
|
|
# To get started, put this script into a folder with the two files (app.exe, logo.ico, and license.rtf -
|
|
# You'll have to create these yourself) and run makensis on it
|
|
|
|
# If you change the names "app.exe", "logo.ico", or "license.rtf" you should do a search and replace - they
|
|
# show up in a few places.
|
|
# All the other settings can be tweaked by editing the !defines at the top of this script
|
|
!define APPNAME "I2CDriver"
|
|
!define COMPANYNAME "Excamera Labs"
|
|
!define DESCRIPTION "Utilities for the I2CDriver"
|
|
# These three must be integers
|
|
!define VERSIONMAJOR 1
|
|
!define VERSIONMINOR 0
|
|
!define VERSIONBUILD 0
|
|
# These will be displayed by the "Click here for support information" link in "Add/Remove Programs"
|
|
# It is possible to use "mailto:" links in here to open the email client
|
|
!define HELPURL "http://i2cdriver.com" # "Support Information" link
|
|
!define UPDATEURL "http://i2cdriver.com" # "Product Updates" link
|
|
!define ABOUTURL "http://excamera.com." # "Publisher" link
|
|
# This is the size (in kB) of all the files copied into "Program Files"
|
|
!define INSTALLSIZE 700
|
|
|
|
RequestExecutionLevel admin ;Require admin rights on NT6+ (When UAC is turned on)
|
|
|
|
InstallDir "$PROGRAMFILES\${COMPANYNAME}\${APPNAME}"
|
|
|
|
# rtf or txt file - remember if it is txt, it must be in the DOS text format (\r\n)
|
|
LicenseData "license.txt"
|
|
# This will be in the installer/uninstaller's title bar
|
|
Name "${COMPANYNAME} - ${APPNAME}"
|
|
Icon "Application.ico"
|
|
outFile "i2cdriver-installer.exe"
|
|
|
|
!include LogicLib.nsh
|
|
|
|
# Just three pages - license agreement, install location, and installation
|
|
page license
|
|
page directory
|
|
Page instfiles
|
|
|
|
!macro VerifyUserIsAdmin
|
|
UserInfo::GetAccountType
|
|
pop $0
|
|
${If} $0 != "admin" ;Require admin rights on NT4+
|
|
messageBox mb_iconstop "Administrator rights required!"
|
|
setErrorLevel 740 ;ERROR_ELEVATION_REQUIRED
|
|
quit
|
|
${EndIf}
|
|
!macroend
|
|
|
|
function .onInit
|
|
setShellVarContext all
|
|
!insertmacro VerifyUserIsAdmin
|
|
functionEnd
|
|
|
|
section "install"
|
|
# Files for the install directory - to build the installer, these should be in the same directory as the install script (this file)
|
|
setOutPath $INSTDIR
|
|
# Files added here should be removed by the uninstaller (see section "uninstall")
|
|
file "i2ccl.exe"
|
|
file "i2cgui.exe"
|
|
# Add any other files for the install directory (license files, app data, etc) here
|
|
|
|
# Uninstaller - See function un.onInit and section "uninstall" for configuration
|
|
writeUninstaller "$INSTDIR\uninstall.exe"
|
|
|
|
# Start Menu
|
|
createDirectory "$SMPROGRAMS\${COMPANYNAME}"
|
|
createShortCut "$SMPROGRAMS\${COMPANYNAME}\${APPNAME}.lnk" "$INSTDIR\i2cgui.exe"
|
|
|
|
# Desktop Shortcut
|
|
CreateShortCut "$DESKTOP\I2CDriver.lnk" "$INSTDIR\i2cgui.exe"
|
|
|
|
# Registry information for add/remove programs
|
|
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "DisplayName" "${COMPANYNAME} - ${APPNAME} - ${DESCRIPTION}"
|
|
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "UninstallString" "$\"$INSTDIR\uninstall.exe$\""
|
|
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "QuietUninstallString" "$\"$INSTDIR\uninstall.exe$\" /S"
|
|
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "InstallLocation" "$\"$INSTDIR$\""
|
|
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "DisplayIcon" "$\"$INSTDIR\logo.ico$\""
|
|
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "Publisher" "$\"${COMPANYNAME}$\""
|
|
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "HelpLink" "$\"${HELPURL}$\""
|
|
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "URLUpdateInfo" "$\"${UPDATEURL}$\""
|
|
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "URLInfoAbout" "$\"${ABOUTURL}$\""
|
|
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "DisplayVersion" "$\"${VERSIONMAJOR}.${VERSIONMINOR}.${VERSIONBUILD}$\""
|
|
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "VersionMajor" ${VERSIONMAJOR}
|
|
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "VersionMinor" ${VERSIONMINOR}
|
|
# There is no option for modifying or repairing the install
|
|
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "NoModify" 1
|
|
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "NoRepair" 1
|
|
# Set the INSTALLSIZE constant (!defined at the top of this script) so Add/Remove Programs can accurately report the size
|
|
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "EstimatedSize" ${INSTALLSIZE}
|
|
|
|
Push "$INSTDIR"
|
|
Call AddToPath
|
|
sectionEnd
|
|
|
|
# Uninstaller
|
|
|
|
function un.onInit
|
|
SetShellVarContext all
|
|
|
|
#Verify the uninstaller - last chance to back out
|
|
MessageBox MB_OKCANCEL "Permanantly remove ${APPNAME}?" IDOK next
|
|
Abort
|
|
next:
|
|
!insertmacro VerifyUserIsAdmin
|
|
functionEnd
|
|
|
|
section "uninstall"
|
|
|
|
# Remove Start Menu launcher
|
|
delete "$SMPROGRAMS\${COMPANYNAME}\${APPNAME}.lnk"
|
|
# Try to remove the Start Menu folder - this will only happen if it is empty
|
|
rmDir "$SMPROGRAMS\${COMPANYNAME}"
|
|
|
|
# Remove files
|
|
delete $INSTDIR\i2ccl.exe
|
|
delete $INSTDIR\i2cgui.exe
|
|
|
|
# Always delete uninstaller as the last action
|
|
delete $INSTDIR\uninstall.exe
|
|
|
|
# Try to remove the install directory - this will only happen if it is empty
|
|
rmDir $INSTDIR
|
|
|
|
# Remove uninstaller information from the registry
|
|
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}"
|
|
|
|
# Remove the desktop shortcut
|
|
delete "$DESKTOP\I2CDriver.lnk"
|
|
|
|
# Remove install dir from PATH
|
|
Push "$INSTDIR"
|
|
Call un.RemoveFromPath
|
|
sectionEnd
|
|
|
|
;--------------------------------------------------------------------
|
|
; Path functions
|
|
;
|
|
; Based on example from:
|
|
; http://nsis.sourceforge.net/Path_Manipulation
|
|
;
|
|
|
|
|
|
!include "WinMessages.nsh"
|
|
|
|
; Registry Entry for environment (NT4,2000,XP)
|
|
; All users:
|
|
;!define Environ 'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"'
|
|
; Current user only:
|
|
!define Environ 'HKCU "Environment"'
|
|
|
|
; AddToPath - Appends dir to PATH
|
|
; (does not work on Win9x/ME)
|
|
;
|
|
; Usage:
|
|
; Push "dir"
|
|
; Call AddToPath
|
|
|
|
Function AddToPath
|
|
Exch $0
|
|
Push $1
|
|
Push $2
|
|
Push $3
|
|
Push $4
|
|
|
|
; NSIS ReadRegStr returns empty string on string overflow
|
|
; Native calls are used here to check actual length of PATH
|
|
|
|
; $4 = RegOpenKey(HKEY_CURRENT_USER, "Environment", &$3)
|
|
System::Call "advapi32::RegOpenKey(i 0x80000001, t'Environment', *i.r3) i.r4"
|
|
IntCmp $4 0 0 done done
|
|
; $4 = RegQueryValueEx($3, "PATH", (DWORD*)0, (DWORD*)0, &$1, ($2=NSIS_MAX_STRLEN, &$2))
|
|
; RegCloseKey($3)
|
|
System::Call "advapi32::RegQueryValueEx(i $3, t'PATH', i 0, i 0, t.r1, *i ${NSIS_MAX_STRLEN} r2) i.r4"
|
|
System::Call "advapi32::RegCloseKey(i $3)"
|
|
|
|
IntCmp $4 234 0 +4 +4 ; $4 == ERROR_MORE_DATA
|
|
DetailPrint "AddToPath: original length $2 > ${NSIS_MAX_STRLEN}"
|
|
MessageBox MB_OK "PATH not updated, original length $2 > ${NSIS_MAX_STRLEN}"
|
|
Goto done
|
|
|
|
IntCmp $4 0 +5 ; $4 != NO_ERROR
|
|
IntCmp $4 2 +3 ; $4 != ERROR_FILE_NOT_FOUND
|
|
DetailPrint "AddToPath: unexpected error code $4"
|
|
Goto done
|
|
StrCpy $1 ""
|
|
|
|
; Check if already in PATH
|
|
Push "$1;"
|
|
Push "$0;"
|
|
Call StrStr
|
|
Pop $2
|
|
StrCmp $2 "" 0 done
|
|
Push "$1;"
|
|
Push "$0\;"
|
|
Call StrStr
|
|
Pop $2
|
|
StrCmp $2 "" 0 done
|
|
|
|
; Prevent NSIS string overflow
|
|
StrLen $2 $0
|
|
StrLen $3 $1
|
|
IntOp $2 $2 + $3
|
|
IntOp $2 $2 + 2 ; $2 = strlen(dir) + strlen(PATH) + sizeof(";")
|
|
IntCmp $2 ${NSIS_MAX_STRLEN} +4 +4 0
|
|
DetailPrint "AddToPath: new length $2 > ${NSIS_MAX_STRLEN}"
|
|
MessageBox MB_OK "PATH not updated, new length $2 > ${NSIS_MAX_STRLEN}."
|
|
Goto done
|
|
|
|
; Append dir to PATH
|
|
DetailPrint "Add to PATH: $0"
|
|
StrCpy $2 $1 1 -1
|
|
StrCmp $2 ";" 0 +2
|
|
StrCpy $1 $1 -1 ; remove trailing ';'
|
|
StrCmp $1 "" +2 ; no leading ';'
|
|
StrCpy $0 "$1;$0"
|
|
WriteRegExpandStr ${Environ} "PATH" $0
|
|
SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
|
|
|
|
done:
|
|
Pop $4
|
|
Pop $3
|
|
Pop $2
|
|
Pop $1
|
|
Pop $0
|
|
FunctionEnd
|
|
|
|
; StrStr - find substring in a string
|
|
;
|
|
; Usage:
|
|
; Push "this is some string"
|
|
; Push "some"
|
|
; Call StrStr
|
|
; Pop $0 ; "some string"
|
|
|
|
!macro StrStr un
|
|
Function ${un}StrStr
|
|
Exch $R1 ; $R1=substring, stack=[old$R1,string,...]
|
|
Exch ; stack=[string,old$R1,...]
|
|
Exch $R2 ; $R2=string, stack=[old$R2,old$R1,...]
|
|
Push $R3
|
|
Push $R4
|
|
Push $R5
|
|
StrLen $R3 $R1
|
|
StrCpy $R4 0
|
|
; $R1=substring, $R2=string, $R3=strlen(substring)
|
|
; $R4=count, $R5=tmp
|
|
loop:
|
|
StrCpy $R5 $R2 $R3 $R4
|
|
StrCmp $R5 $R1 done
|
|
StrCmp $R5 "" done
|
|
IntOp $R4 $R4 + 1
|
|
Goto loop
|
|
done:
|
|
StrCpy $R1 $R2 "" $R4
|
|
Pop $R5
|
|
Pop $R4
|
|
Pop $R3
|
|
Pop $R2
|
|
Exch $R1 ; $R1=old$R1, stack=[result,...]
|
|
FunctionEnd
|
|
!macroend
|
|
!insertmacro StrStr ""
|
|
!insertmacro StrStr "un."
|
|
|
|
; RemoveFromPath - Removes dir from PATH
|
|
;
|
|
; Usage:
|
|
; Push "dir"
|
|
; Call RemoveFromPath
|
|
|
|
Function un.RemoveFromPath
|
|
Exch $0
|
|
Push $1
|
|
Push $2
|
|
Push $3
|
|
Push $4
|
|
Push $5
|
|
Push $6
|
|
|
|
ReadRegStr $1 ${Environ} "PATH"
|
|
StrCpy $5 $1 1 -1
|
|
StrCmp $5 ";" +2
|
|
StrCpy $1 "$1;" ; ensure trailing ';'
|
|
Push $1
|
|
Push "$0;"
|
|
Call un.StrStr
|
|
Pop $2 ; pos of our dir
|
|
StrCmp $2 "" done
|
|
|
|
DetailPrint "Remove from PATH: $0"
|
|
StrLen $3 "$0;"
|
|
StrLen $4 $2
|
|
StrCpy $5 $1 -$4 ; $5 is now the part before the path to remove
|
|
StrCpy $6 $2 "" $3 ; $6 is now the part after the path to remove
|
|
StrCpy $3 "$5$6"
|
|
StrCpy $5 $3 1 -1
|
|
StrCmp $5 ";" 0 +2
|
|
StrCpy $3 $3 -1 ; remove trailing ';'
|
|
WriteRegExpandStr ${Environ} "PATH" $3
|
|
SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
|
|
|
|
done:
|
|
Pop $6
|
|
Pop $5
|
|
Pop $4
|
|
Pop $3
|
|
Pop $2
|
|
Pop $1
|
|
Pop $0
|
|
FunctionEnd
|