[cmake-commits] hoffman committed NSIS.template.in 1.11.2.6 1.11.2.7

cmake-commits at cmake.org cmake-commits at cmake.org
Wed Dec 5 10:40:02 EST 2007


Update of /cvsroot/CMake/CMake/Modules
In directory public:/mounts/ram/cvs-serv25747/Modules

Modified Files:
      Tag: CMake-2-4
	NSIS.template.in 
Log Message:
ENH: move fix for nsis to branch


Index: NSIS.template.in
===================================================================
RCS file: /cvsroot/CMake/CMake/Modules/NSIS.template.in,v
retrieving revision 1.11.2.6
retrieving revision 1.11.2.7
diff -u -d -r1.11.2.6 -r1.11.2.7
--- NSIS.template.in	27 Oct 2006 20:01:46 -0000	1.11.2.6
+++ NSIS.template.in	5 Dec 2007 15:40:00 -0000	1.11.2.7
@@ -122,15 +122,51 @@
 ;----------------------------------------------------
 !define NT_current_env 'HKCU "Environment"'
 !define NT_all_env     'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"'
-;====================================================
+
+!ifndef WriteEnvStr_RegKey
+  !ifdef ALL_USERS
+    !define WriteEnvStr_RegKey \
+       'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"'
+  !else
+    !define WriteEnvStr_RegKey 'HKCU "Environment"'
+  !endif
+!endif
+ 
 ; 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
@@ -138,76 +174,47 @@
     ; Not on NT
     StrCpy $1 $WINDIR 2
     FileOpen $1 "$1\autoexec.bat" a
-      FileSeek $1 0 END
-      GetFullPathName /SHORT $0 $0
-      FileWrite $1 "$\r$\n\
-$\r$\n\
-SET PATH=%PATH%;$0$\r$\n\
-$\r$\n\
-"
+    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:
-      Push $4
-      Call select_NT_profile
-      Pop  $4
- 
-      AddToPath_NT_selection_done:
-      StrCmp $4 "current" read_path_NT_current
-         ReadRegStr $1 ${NT_all_env} "PATH"
-         Goto read_path_NT_resume
-      read_path_NT_current:
-         ReadRegStr $1 ${NT_current_env} "PATH"
-      read_path_NT_resume:
-      StrCmp $1 "" AddToPath_NoCurrentPath
-         StrCpy $2 "$0;$1"
-         Goto AddToPath_NTdoIt
-      AddToPath_NoCurrentPath:
-         DetailPrint "No current path, so just use $0"
-         StrCpy $2 $0
-         Goto AddToPath_NTdoIt
+    ReadRegStr $1 ${WriteEnvStr_RegKey} "PATH"
+    StrCmp $1 "" AddToPath_NTdoIt
+      Push $1
+      Call Trim
+      Pop $1
+      StrCpy $0 "$1;$0"
     AddToPath_NTdoIt:
-         StrCmp $4 "current" write_path_NT_current
-            ClearErrors
-            WriteRegExpandStr ${NT_all_env} "PATH" $2
-            IfErrors 0 write_path_NT_resume
-            MessageBox MB_YESNO|MB_ICONQUESTION "The path could not be set for all users$\n\
-$\n\
-Should I try for the current user?" \
-               IDNO write_path_NT_failed
-            ; change selection
-            StrCpy $4 "current"
-            Goto AddToPath_NT_selection_done
-         write_path_NT_current:
-            ClearErrors
-            WriteRegExpandStr ${NT_current_env} "PATH" $2
-            IfErrors 0 write_path_NT_resume
-            MessageBox MB_OK|MB_ICONINFORMATION "The path could not be set for the current user."
-            Goto write_path_NT_failed
-         write_path_NT_resume:
+      WriteRegExpandStr ${WriteEnvStr_RegKey} "PATH" $0
       SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
-         DetailPrint "Added path for user ($4), $0"
-         DetailPrint "New path is: $2"
-         write_path_NT_failed:
  
-      Pop $4
   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
@@ -219,20 +226,22 @@
     FileOpen $2 $4 w
     GetFullPathName /SHORT $0 $0
     StrCpy $0 "SET PATH=%PATH%;$0"
-      SetRebootFlag true
     Goto unRemoveFromPath_dosLoop
  
     unRemoveFromPath_dosLoop:
       FileRead $1 $3
-         StrCmp $3 "$0$$\r$\n\
-$\r$\n\
-" unRemoveFromPath_dosLoop
-         StrCmp $3 "$0$\r$\n\
-" unRemoveFromPath_dosLoop
-         StrCmp $3 "$0" unRemoveFromPath_dosLoop
+      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
@@ -244,60 +253,42 @@
       Goto unRemoveFromPath_done
  
   unRemoveFromPath_NT:
-      StrLen $2 $0
-      Call un.select_NT_profile
-      Pop  $4
- 
-      StrCmp $4 "current" un_read_path_NT_current
-         ReadRegStr $1 ${NT_all_env} "PATH"
-         Goto un_read_path_NT_resume
-      un_read_path_NT_current:
-         ReadRegStr $1 ${NT_current_env} "PATH"
-      un_read_path_NT_resume:
- 
-      StrCpy $8 $0
+    ReadRegStr $1 ${WriteEnvStr_RegKey} "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 $0 ; pos of our dir
-      IntCmp $0 -1 unRemoveFromPath_done
+    Push "$0;"
+    Call un.StrStr ; Find `$0;` in $1
+    Pop $2 ; pos of our dir
+    StrCmp $2 "" unRemoveFromPath_done
       ; else, it is in path
-         StrLen $5 $1 ; Get the length of the original path
-         StrLen $6 $0 ; get the length of path without the first path
-         IntOp $5 $5 - $6
-         IntOp $5 $5 - 1
-         IntCmp $5 -1 unRemoveFromPath_nothingBefore
-           StrCpy $3 $1 $5 ; $3 now has the part of the path before our dir
-           Goto unRemoveFromPath_AfterBefore
-         unRemoveFromPath_nothingBefore:
-           StrCpy $3 ""
-         unRemoveFromPath_AfterBefore:
-         StrCpy $7 $0 "" $2 ; $3 now has the part of the path after our dir
-         StrCpy $3 "$3$7"
-
-         ; $3 now holds path, but there may be some stray semicolon at
-         ; beginning. Let's remove it
-         StrCpy $7 $3 1
-         StrCmp $7 ";" 0 unRemoveFromPath_NoTrailingSemiColon
-           StrCpy $3 $3 "" 1
-         unRemoveFromPath_NoTrailingSemiColon:
+      # $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
  
-         StrCmp $4 "current" un_write_path_NT_current
-            WriteRegExpandStr ${NT_all_env} "PATH" $3
-            Goto un_write_path_NT_resume
-         un_write_path_NT_current:
-            WriteRegExpandStr ${NT_current_env} "PATH" $3
-         un_write_path_NT_resume:
+      StrCpy $5 $3 1 -1 # copy last char
+      StrCmp $5 ";" 0 +2 # if last char == ;
+        StrCpy $3 $3 -1 # remove last char
+ 
+      WriteRegExpandStr ${WriteEnvStr_RegKey} "PATH" $3
       SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
-         DetailPrint "Removed $8 from the path"
-         DetailPrint "New path is: $3"
+ 
   unRemoveFromPath_done:
+    Pop $6
+    Pop $5
     Pop $4
     Pop $3
     Pop $2
     Pop $1
     Pop $0
 FunctionEnd
+ 
+
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ; Uninstall sutff
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -385,6 +376,24 @@
 !insertmacro StrStr ""
 !insertmacro StrStr "un."
 
+Function Trim ; Added by Pelaca
+	Exch $R1
+	Push $R2
+Loop:
+	StrCpy $R2 "$R1" 1 -1
+	StrCmp "$R2" " " RTrim
+	StrCmp "$R2" "$\n" RTrim
+	StrCmp "$R2" "$\r" RTrim
+	StrCmp "$R2" ";" RTrim
+	GoTo Done
+RTrim:	
+	StrCpy $R1 "$R1" -1
+	Goto Loop
+Done:
+	Pop $R2
+	Exch $R1
+FunctionEnd
+
 Function ConditionalAddToRegisty
   Pop $0
   Pop $1



More information about the Cmake-commits mailing list