
3 changed files with 486 additions and 0 deletions
@ -0,0 +1,12 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> |
|||
<plist version="1.4"> |
|||
<dict> |
|||
<key>IFPkgDescriptionTitle</key> |
|||
<string>@CPACK_PROJECT_NAME@</string> |
|||
<key>IFPkgDescriptionVersion</key> |
|||
<string>@CPACK_PROJECT_VERSION@-@CPACK_PROJECT_VERSION_PATCH@</string> |
|||
<key>IFPkgDescriptionDescription</key> |
|||
<string>@CPACK_PROJECT_DESCRIPTION@</string> |
|||
</dict> |
|||
</plist> |
@ -0,0 +1,35 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> |
|||
|
|||
<plist version="1.0"> |
|||
<dict> |
|||
<key>IFMajorVersion</key> |
|||
<integer>@CPACK_PACKAGE_MAJOR_VERSION@</integer> |
|||
<key>IFMinorVersion</key> |
|||
<integer>@CPACK_PACKAGE_MINOR_VERSION@</integer> |
|||
<key>IFPkgFlagAllowBackRev</key> |
|||
<false/> |
|||
<key>IFPkgFlagAuthorizationAction</key> |
|||
<string>AdminAuthorization</string> |
|||
<key>IFPkgFlagDefaultLocation</key> |
|||
<string>/</string> |
|||
<key>IFPkgFlagInstallFat</key> |
|||
<false/> |
|||
<key>IFPkgFlagIsRequired</key> |
|||
<false/> |
|||
<key>IFPkgFlagOverwritePermissions</key> |
|||
<true/> |
|||
<key>IFPkgFlagRelocatable</key> |
|||
<false/> |
|||
<key>IFPkgFlagRestartAction</key> |
|||
<string>NoRestart</string> |
|||
<key>IFPkgFlagRootVolumeOnly</key> |
|||
<false/> |
|||
<key>IFPkgFlagUpdateInstalledLanguages</key> |
|||
<false/> |
|||
<key>IFPkgFlagUseUserMask</key> |
|||
<false/> |
|||
<key>IFPkgFormatVersion</key> |
|||
<real>0.10000000149011612</real> |
|||
</dict> |
|||
</plist> |
@ -0,0 +1,439 @@ |
|||
; CPack install script designed for a nmake build |
|||
|
|||
;-------------------------------- |
|||
; You must define these values |
|||
|
|||
!define VERSION "@CPACK_PROJECT_VERSION@" |
|||
!define PATCH "@CPACK_PROJECT_VERSION_PATCH@" |
|||
!define INST_DIR @CPACK_TEMPORARY_DIRECTORY@ |
|||
|
|||
;-------------------------------- |
|||
;Variables |
|||
|
|||
Var MUI_TEMP |
|||
Var STARTMENU_FOLDER |
|||
|
|||
;-------------------------------- |
|||
;Include Modern UI |
|||
|
|||
!include "MUI.nsh" |
|||
|
|||
;Default installation folder |
|||
InstallDir "$PROGRAMFILES\@CPACK_PROJECT_NAME@ ${VERSION}" |
|||
|
|||
;-------------------------------- |
|||
; determine admin versus local install |
|||
Function .onInit |
|||
|
|||
ClearErrors |
|||
UserInfo::GetName |
|||
IfErrors noLM |
|||
Pop $0 |
|||
UserInfo::GetAccountType |
|||
Pop $1 |
|||
StrCmp $1 "Admin" 0 +3 |
|||
SetShellVarContext all |
|||
;MessageBox MB_OK 'User "$0" is in the Admin group' |
|||
Goto done |
|||
StrCmp $1 "Power" 0 +3 |
|||
SetShellVarContext all |
|||
;MessageBox MB_OK 'User "$0" is in the Power Users group' |
|||
Goto done |
|||
|
|||
noLM: |
|||
;Get installation folder from registry if available |
|||
|
|||
done: |
|||
FunctionEnd |
|||
|
|||
|
|||
;-------------------------------- |
|||
;General |
|||
|
|||
;Name and file |
|||
Name "@CPACK_PROJECT_NAME@ ${VERSION}" |
|||
OutFile "@CPACK_TOPLEVEL_DIRECTORY@/@CPACK_PROJECT_NAME@-${VERSION}-${PATCH}-win32.exe" |
|||
|
|||
;-------------------------------- |
|||
;Interface Settings |
|||
|
|||
!define MUI_HEADERIMAGE |
|||
!define MUI_ABORTWARNING |
|||
|
|||
;-------------------------------- |
|||
; path functions |
|||
|
|||
!verbose 3 |
|||
!include "WinMessages.NSH" |
|||
!verbose 4 |
|||
|
|||
; AddToPath - Adds the given dir to the search path. |
|||
; Input - head of the stack |
|||
; Note - Win9x systems requires reboot |
|||
|
|||
Function AddToPath |
|||
Exch $0 |
|||
Push $1 |
|||
Push $2 |
|||
Push $3 |
|||
|
|||
# don't add if the path doesn't exist |
|||
IfFileExists "$0\*.*" "" AddToPath_done |
|||
|
|||
ReadEnvStr $1 PATH |
|||
Push "$1;" |
|||
Push "$0;" |
|||
Call StrStr |
|||
Pop $2 |
|||
StrCmp $2 "" "" AddToPath_done |
|||
Push "$1;" |
|||
Push "$0\;" |
|||
Call StrStr |
|||
Pop $2 |
|||
StrCmp $2 "" "" AddToPath_done |
|||
GetFullPathName /SHORT $3 $0 |
|||
Push "$1;" |
|||
Push "$3;" |
|||
Call StrStr |
|||
Pop $2 |
|||
StrCmp $2 "" "" AddToPath_done |
|||
Push "$1;" |
|||
Push "$3\;" |
|||
Call StrStr |
|||
Pop $2 |
|||
StrCmp $2 "" "" AddToPath_done |
|||
|
|||
Call IsNT |
|||
Pop $1 |
|||
StrCmp $1 1 AddToPath_NT |
|||
; Not on NT |
|||
StrCpy $1 $WINDIR 2 |
|||
FileOpen $1 "$1\autoexec.bat" a |
|||
FileSeek $1 -1 END |
|||
FileReadByte $1 $2 |
|||
IntCmp $2 26 0 +2 +2 # DOS EOF |
|||
FileSeek $1 -1 END # write over EOF |
|||
FileWrite $1 "$\r$\nSET PATH=%PATH%;$3$\r$\n" |
|||
FileClose $1 |
|||
SetRebootFlag true |
|||
Goto AddToPath_done |
|||
|
|||
AddToPath_NT: |
|||
ReadRegStr $1 SHCTX "Environment" "PATH" |
|||
StrCpy $2 $1 1 -1 # copy last char |
|||
StrCmp $2 ";" 0 +2 # if last char == ; |
|||
StrCpy $1 $1 -1 # remove last char |
|||
StrCmp $1 "" AddToPath_NTdoIt |
|||
StrCpy $0 "$1;$0" |
|||
AddToPath_NTdoIt: |
|||
WriteRegExpandStr SHCTX "Environment" "PATH" $0 |
|||
SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000 |
|||
|
|||
AddToPath_done: |
|||
Pop $3 |
|||
Pop $2 |
|||
Pop $1 |
|||
Pop $0 |
|||
FunctionEnd |
|||
|
|||
; RemoveFromPath - Remove a given dir from the path |
|||
; Input: head of the stack |
|||
|
|||
Function un.RemoveFromPath |
|||
Exch $0 |
|||
Push $1 |
|||
Push $2 |
|||
Push $3 |
|||
Push $4 |
|||
Push $5 |
|||
Push $6 |
|||
|
|||
IntFmt $6 "%c" 26 # DOS EOF |
|||
|
|||
Call un.IsNT |
|||
Pop $1 |
|||
StrCmp $1 1 unRemoveFromPath_NT |
|||
; Not on NT |
|||
StrCpy $1 $WINDIR 2 |
|||
FileOpen $1 "$1\autoexec.bat" r |
|||
GetTempFileName $4 |
|||
FileOpen $2 $4 w |
|||
GetFullPathName /SHORT $0 $0 |
|||
StrCpy $0 "SET PATH=%PATH%;$0" |
|||
Goto unRemoveFromPath_dosLoop |
|||
|
|||
unRemoveFromPath_dosLoop: |
|||
FileRead $1 $3 |
|||
StrCpy $5 $3 1 -1 # read last char |
|||
StrCmp $5 $6 0 +2 # if DOS EOF |
|||
StrCpy $3 $3 -1 # remove DOS EOF so we can compare |
|||
StrCmp $3 "$0$\r$\n" unRemoveFromPath_dosLoopRemoveLine |
|||
StrCmp $3 "$0$\n" unRemoveFromPath_dosLoopRemoveLine |
|||
StrCmp $3 "$0" unRemoveFromPath_dosLoopRemoveLine |
|||
StrCmp $3 "" unRemoveFromPath_dosLoopEnd |
|||
FileWrite $2 $3 |
|||
Goto unRemoveFromPath_dosLoop |
|||
unRemoveFromPath_dosLoopRemoveLine: |
|||
SetRebootFlag true |
|||
Goto unRemoveFromPath_dosLoop |
|||
|
|||
unRemoveFromPath_dosLoopEnd: |
|||
FileClose $2 |
|||
FileClose $1 |
|||
StrCpy $1 $WINDIR 2 |
|||
Delete "$1\autoexec.bat" |
|||
CopyFiles /SILENT $4 "$1\autoexec.bat" |
|||
Delete $4 |
|||
Goto unRemoveFromPath_done |
|||
|
|||
unRemoveFromPath_NT: |
|||
ReadRegStr $1 SHCTX "Environment" "PATH" |
|||
StrCpy $5 $1 1 -1 # copy last char |
|||
StrCmp $5 ";" +2 # if last char != ; |
|||
StrCpy $1 "$1;" # append ; |
|||
Push $1 |
|||
Push "$0;" |
|||
Call un.StrStr ; Find `$0;` in $1 |
|||
Pop $2 ; pos of our dir |
|||
StrCmp $2 "" unRemoveFromPath_done |
|||
; else, it is in path |
|||
# $0 - path to add |
|||
# $1 - path var |
|||
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 # copy last char |
|||
StrCmp $5 ";" 0 +2 # if last char == ; |
|||
StrCpy $3 $3 -1 # remove last char |
|||
|
|||
WriteRegExpandStr SHCTX "Environment" "PATH" $3 |
|||
SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000 |
|||
|
|||
unRemoveFromPath_done: |
|||
Pop $6 |
|||
Pop $5 |
|||
Pop $4 |
|||
Pop $3 |
|||
Pop $2 |
|||
Pop $1 |
|||
Pop $0 |
|||
FunctionEnd |
|||
|
|||
########################################### |
|||
# Utility Functions # |
|||
########################################### |
|||
|
|||
; IsNT |
|||
; no input |
|||
; output, top of the stack = 1 if NT or 0 if not |
|||
; |
|||
; Usage: |
|||
; Call IsNT |
|||
; Pop $R0 |
|||
; ($R0 at this point is 1 or 0) |
|||
|
|||
!macro IsNT un |
|||
Function ${un}IsNT |
|||
Push $0 |
|||
ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion |
|||
StrCmp $0 "" 0 IsNT_yes |
|||
; we are not NT. |
|||
Pop $0 |
|||
Push 0 |
|||
Return |
|||
|
|||
IsNT_yes: |
|||
; NT!!! |
|||
Pop $0 |
|||
Push 1 |
|||
FunctionEnd |
|||
!macroend |
|||
!insertmacro IsNT "" |
|||
!insertmacro IsNT "un." |
|||
|
|||
; StrStr |
|||
; input, top of stack = string to search for |
|||
; top of stack-1 = string to search in |
|||
; output, top of stack (replaces with the portion of the string remaining) |
|||
; modifies no other variables. |
|||
; |
|||
; Usage: |
|||
; Push "this is a long ass string" |
|||
; Push "ass" |
|||
; Call StrStr |
|||
; Pop $R0 |
|||
; ($R0 at this point is "ass string") |
|||
|
|||
!macro StrStr un |
|||
Function ${un}StrStr |
|||
Exch $R1 ; st=haystack,old$R1, $R1=needle |
|||
Exch ; st=old$R1,haystack |
|||
Exch $R2 ; st=old$R1,old$R2, $R2=haystack |
|||
Push $R3 |
|||
Push $R4 |
|||
Push $R5 |
|||
StrLen $R3 $R1 |
|||
StrCpy $R4 0 |
|||
; $R1=needle |
|||
; $R2=haystack |
|||
; $R3=len(needle) |
|||
; $R4=cnt |
|||
; $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 |
|||
FunctionEnd |
|||
!macroend |
|||
!insertmacro StrStr "" |
|||
!insertmacro StrStr "un." |
|||
|
|||
;-------------------------------- |
|||
; Define some macro setting for the gui |
|||
|
|||
!define MUI_HEADERIMAGE_BITMAP "@CPACK_PROJECT_ICON@" |
|||
|
|||
;-------------------------------- |
|||
;Pages |
|||
|
|||
!insertmacro MUI_PAGE_DIRECTORY |
|||
|
|||
;Start Menu Folder Page Configuration |
|||
!define MUI_STARTMENUPAGE_REGISTRY_ROOT "SHCTX" |
|||
!define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\@CPACK_PROJECT_VENDOR@\@CPACK_PROJECT_NAME@ ${VERSION}" |
|||
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder" |
|||
!insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER |
|||
|
|||
!insertmacro MUI_PAGE_INSTFILES |
|||
|
|||
!insertmacro MUI_UNPAGE_CONFIRM |
|||
!insertmacro MUI_UNPAGE_INSTFILES |
|||
|
|||
;-------------------------------- |
|||
;Languages |
|||
|
|||
!insertmacro MUI_LANGUAGE "English" |
|||
|
|||
;-------------------------------- |
|||
;Installer Sections |
|||
|
|||
Section "Add to path" |
|||
Push $INSTDIR\bin |
|||
Call AddToPath |
|||
SectionEnd |
|||
|
|||
Section |
|||
SectionEnd |
|||
|
|||
Section "Dummy Section" SecDummy |
|||
|
|||
;Use the entire tree produced by the INSTALL target. Keep the |
|||
;list of directories here in sync with the RMDir commands below. |
|||
SetOutPath "$INSTDIR" |
|||
File /r "${INST_DIR}\bin" |
|||
File /r "${INST_DIR}\doc" |
|||
File /r "${INST_DIR}\share" |
|||
|
|||
@CPACK_NSIS_EXTRA_COMMANDS@ |
|||
|
|||
;Store installation folder |
|||
WriteRegStr SHCTX "Software\@CPACK_PROJECT_VENDOR@\@CPACK_PROJECT_NAME@ ${VERSION}" "" $INSTDIR |
|||
|
|||
;Create uninstaller |
|||
WriteUninstaller "$INSTDIR\Uninstall.exe" |
|||
|
|||
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application |
|||
|
|||
;Create shortcuts |
|||
CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER" |
|||
CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\cmake.lnk" "$INSTDIR\bin\CMakeSetup.exe" |
|||
CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Uninstall.lnk" "$INSTDIR\Uninstall.exe" |
|||
|
|||
!insertmacro MUI_STARTMENU_WRITE_END |
|||
|
|||
SectionEnd |
|||
|
|||
|
|||
;-------------------------------- |
|||
; determine admin versus local install |
|||
Function un.onInit |
|||
|
|||
ClearErrors |
|||
UserInfo::GetName |
|||
IfErrors noLM |
|||
Pop $0 |
|||
UserInfo::GetAccountType |
|||
Pop $1 |
|||
StrCmp $1 "Admin" 0 +3 |
|||
SetShellVarContext all |
|||
;MessageBox MB_OK 'User "$0" is in the Admin group' |
|||
Goto done |
|||
StrCmp $1 "Power" 0 +3 |
|||
SetShellVarContext all |
|||
;MessageBox MB_OK 'User "$0" is in the Power Users group' |
|||
Goto done |
|||
|
|||
noLM: |
|||
;Get installation folder from registry if available |
|||
|
|||
done: |
|||
FunctionEnd |
|||
|
|||
;-------------------------------- |
|||
;Uninstaller Section |
|||
|
|||
Section "Uninstall" |
|||
|
|||
;Remove directories we installed. |
|||
;Keep the list of directories here in sync with the File commands above. |
|||
RMDir /r "$INSTDIR\bin" |
|||
RMDir /r "$INSTDIR\doc" |
|||
RMDir /r "$INSTDIR\share" |
|||
|
|||
;Remove the uninstaller itself. |
|||
Delete "$INSTDIR\Uninstall.exe" |
|||
|
|||
;Remove the installation directory if it is empty. |
|||
RMDir "$INSTDIR" |
|||
|
|||
; Remove the registry entries. |
|||
DeleteRegKey SHCTX "Software\@CPACK_PROJECT_VENDOR@\@CPACK_PROJECT_NAME@ ${VERSION}" |
|||
|
|||
!insertmacro MUI_STARTMENU_GETFOLDER Application $MUI_TEMP |
|||
|
|||
Delete "$SMPROGRAMS\$MUI_TEMP\Uninstall.lnk" |
|||
Delete "$SMPROGRAMS\$MUI_TEMP\cmake.lnk" |
|||
|
|||
;Delete empty start menu parent diretories |
|||
StrCpy $MUI_TEMP "$SMPROGRAMS\$MUI_TEMP" |
|||
|
|||
startMenuDeleteLoop: |
|||
ClearErrors |
|||
RMDir $MUI_TEMP |
|||
GetFullPathName $MUI_TEMP "$MUI_TEMP\.." |
|||
|
|||
IfErrors startMenuDeleteLoopDone |
|||
|
|||
StrCmp $MUI_TEMP $SMPROGRAMS startMenuDeleteLoopDone startMenuDeleteLoop |
|||
startMenuDeleteLoopDone: |
|||
|
|||
DeleteRegKey /ifempty SHCTX "Software\@CPACK_PROJECT_VENDOR@\@CPACK_PROJECT_NAME@ ${VERSION}" |
|||
|
|||
Push $INSTDIR\bin |
|||
Call un.RemoveFromPath |
|||
|
|||
SectionEnd |
|||
|
|||
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue