* support/scripts/sdcc.nsi:
[fw/sdcc] / support / scripts / sdcc.nsi
index 81acbe5e0eff7a514376cda87e8a0a97faed4304..fcad17a8b36d78e4f5f2540d492caa37f58afcd0 100644 (file)
@@ -1,6 +1,6 @@
 # sdcc.nsi - NSIS installer script for SDCC
 #
-# Copyright (c) 2003-2008 Borut Razem
+# Copyright (c) 2003-2009 Borut Razem
 #
 # This file is part of sdcc.
 #
@@ -31,8 +31,8 @@
 # - copy files sdcc/support/scripts/sdcc.ico and sdcc/support/scripts/sdcc.nsi
 #   (this file) from the sdcc Subversion snapshot to the PKGDIR directory
 # - copy file COPYING from the sdcc Subversion snapshot to the PKGDIR directory,
-#   rename it to COPYING.TXT and convert it to DOS format:
-#   unix2dos COPYING.TXT
+#   rename it to COPYING.txt and convert it to DOS format:
+#   unix2dos COPYING.txt
 # - copy readline5.dll to PKGDIR/bin/readline5.dll
 # - run NSIS installer from PKGDIR directory:
 #   "c:\Program Files\NSIS\makensis.exe" -DVER_MAJOR=<SDCC_VER_MAJOR> -DVER_MINOR=<SDCC_VER_MINOR> -DVER_REVISION=<SDCC_VER_DEVEL> -DVER_BUILD=<SDCC_REVISION> sdcc.nsi
 # - unpack WIN32 mingw daily snapshot sdcc-snapshot-i586-mingw32msvc-yyyymmdd-rrrr.zip
 #   to a clean directory (the option to create directories should be enabled).
 #   A sub directory sdcc is created (referenced as PKGDIR in continuation).
-# - remove the PKGDIR/doc/README.TXT file
+# - remove the PKGDIR/doc/ directory
 # - unpack sdcc-doc-yyyymmdd-rrrr.zip to the PKGDIR/doc directory
 # - copy files sdcc/support/scripts/sdcc.ico and sdcc/support/scripts/sdcc.nsi
 #   (this file) from the sdcc Subversion snapshot to the PKGDIR directory
 # - copy file COPYING from the sdcc Subversion snapshot to the PKGDIR directory,
-#   rename it to COPYING.TXT and it to DOS format:
-#   unix2dos COPYING.TXT
+#   rename it to COPYING.txt and convert it to DOS format:
+#   unix2dos COPYING.txt
 # - copy readline5.dll to PKGDIR/bin/readline5.dll
 # - run NSIS installer from PKGDIR directory:
 #   "c:\Program Files\NSIS\makensis.exe" -DFULL_DOC -DVER_MAJOR=<VER_MAJOR> -DVER_MINOR=<VER_MINOR> -DVER_REVISION=<VER_PATCH> -DVER_BUILD=<REVISION> sdcc.nsi
 # - cd /home/groups/s/sd/sdcc/htdocs/snapshots/i586-mingw32msvc-setup
 # - put sdcc_yyyymmdd_setup.exe
 # - quit
+#
+# For debugging define -DSDCC.DEBUG command line option
+
+;--------------------------------
+; Debugging Macros
+
+!ifdef SDCC.DEBUG
+  Var SDCC.FunctionName
+  Var SDCC.StrStack0
+  Var SDCC.StrStack1
+  Var SDCC.StrStack2
+  Var SDCC.StrStack3
+  Var SDCC.StrStack4
+
+!define SDCC.PushStr "!insertmacro MACRO_SDCC_PushStr"
+!macro MACRO_SDCC_PushStr NAME
+  StrCpy $SDCC.StrStack4 $SDCC.StrStack3
+  StrCpy $SDCC.StrStack3 $SDCC.StrStack2
+  StrCpy $SDCC.StrStack2 $SDCC.StrStack1
+  StrCpy $SDCC.StrStack1 $SDCC.StrStack0
+  StrCpy $SDCC.StrStack0 $SDCC.FunctionName
+  StrCpy $SDCC.FunctionName "${NAME}"
+!macroend
+
+!define SDCC.PopStr "!insertmacro MACRO_SDCC_PopStr"
+!macro MACRO_SDCC_PopStr
+  StrCpy $SDCC.FunctionName $SDCC.StrStack0
+  StrCpy $SDCC.StrStack0 $SDCC.StrStack1
+  StrCpy $SDCC.StrStack1 $SDCC.StrStack2
+  StrCpy $SDCC.StrStack2 $SDCC.StrStack3
+  StrCpy $SDCC.StrStack3 $SDCC.StrStack4
+!macroend
+!endif
+
+!define DebugMsg "!insertmacro MACRO_SDCC_DebugMsg"
+!macro MACRO_SDCC_DebugMsg MSG
+  !ifdef SDCC.DEBUG
+    MessageBox MB_OK "*** $SDCC.FunctionName: ${MSG} ***"
+  !endif
+!macroend
+
+!define Function "!insertmacro MACRO_SDCC_Function"
+!macro MACRO_SDCC_Function NAME
+  Function "${NAME}"
+  !ifdef SDCC.DEBUG
+    ${SDCC.PushStr} ${NAME}
+  !endif
+!macroend
+
+!define FunctionEnd "!insertmacro MACRO_SDCC_FunctionEnd"
+!macro MACRO_SDCC_FunctionEnd
+  !ifdef SDCC.DEBUG
+    ${SDCC.PopStr}
+  !endif
+  FunctionEnd
+!macroend
+
+!define Section "!insertmacro MACRO_SDCC_Section"
+!macro MACRO_SDCC_Section NAME ID
+  Section "${NAME}" "${ID}"
+  !ifdef SDCC.DEBUG
+    ${SDCC.PushStr} "${NAME}"
+  !endif
+!macroend
+
+!define UnselectedSection "!insertmacro MACRO_SDCC_UnselectedSection"
+!macro MACRO_SDCC_UnselectedSection NAME ID
+  Section /o ${NAME} ${ID}
+  !ifdef SDCC.DEBUG
+    ${SDCC.PushStr} "${NAME}"
+  !endif
+!macroend
+
+!define SectionEnd "!insertmacro MACRO_SDCC_SectionEnd"
+!macro MACRO_SDCC_SectionEnd
+  !ifdef SDCC.DEBUG
+    ${SDCC.PopStr}
+  !endif
+  SectionEnd
+!macroend
 
 
 !define PRODUCT_NAME "SDCC"
@@ -89,22 +169,32 @@ SetCompressor /SOLID lzma
 
 !define DEV_ROOT "${SDCC_ROOT}"
 
+!ifdef FULL_DOC
+!system "unix2dos ${SDCC_ROOT}\doc\ChangeLog.txt" = 0
+!else
 !system "unix2dos ${SDCC_ROOT}\doc\ChangeLog_head.txt" = 0
+!endif
 !system "unix2dos ${SDCC_ROOT}\doc\README.TXT" = 0
 
 InstType "Full (Bin, ucSim, SDCDB, Doc, Lib, Src)"
 InstType "Medium (Bin, ucSim, SDCDB, Doc, Lib)"
 InstType "Compact (Bin, ucSim, SDCDB, Doc)"
 
+;--------------------------------
+; Configuration
+
+!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
+!define UNINST_ROOT_KEY HKLM
+!define SDCC_ROOT_KEY HKLM
+
 ;--------------------------------
 ; Header Files
 
-!define MULTIUSER_EXECUTIONLEVEL Highest
-!define MULTIUSER_MUI
-!define MULTIUSER_INSTALLMODE_COMMANDLINE
-!include MultiUser.nsh
 !include MUI2.nsh
 !include WordFunc.nsh
+!include StrFunc.nsh
+${StrStr}
+${UnStrStr}
 
 ;--------------------------------
 ; Functions
@@ -114,34 +204,32 @@ InstType "Compact (Bin, ucSim, SDCDB, Doc)"
 !endif
 
 ;--------------------------------
-; Configuration
+; Variables
 
-!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
+Var SDCC.PathToRemove
 
 ;--------------------------------
 ; Configuration
 
 ; MUI Settings
 !define MUI_ABORTWARNING
+!define MUI_ICON ".\sdcc.ico"
 
 ; Welcome page
 !insertmacro MUI_PAGE_WELCOME
 
 ; License page
-!insertmacro MUI_PAGE_LICENSE "${SDCC_ROOT}\COPYING.TXT"
+!insertmacro MUI_PAGE_LICENSE "${SDCC_ROOT}\COPYING.txt"
 
 ; Uninstall/reinstall page
 !ifdef VER_MAJOR & VER_MINOR & VER_REVISION & VER_BUILD
-Page custom PageReinstall PageLeaveReinstall
+Page custom SDCC.PageReinstall SDCC.PageLeaveReinstall
 !endif
 
-; MultiUser page
-!insertmacro MULTIUSER_PAGE_INSTALLMODE
-
 ; StartMenu page
 !define MUI_STARTMENUPAGE_DEFAULTFOLDER ${PRODUCT_NAME}
-!define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKLM"
-!define MUI_STARTMENUPAGE_REGISTRY_KEY ${PRODUCT_UNINST_KEY}
+!define MUI_STARTMENUPAGE_REGISTRY_ROOT ${UNINST_ROOT_KEY}
+!define MUI_STARTMENUPAGE_REGISTRY_KEY "${PRODUCT_UNINST_KEY}"
 !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "NSIS:StartMenuDir"
 !define MUI_STARTMENUPAGE_NODISABLE
 Var MUI_STARTMENUPAGE_VARIABLE
@@ -155,17 +243,40 @@ Var MUI_STARTMENUPAGE_VARIABLE
 !insertmacro MUI_PAGE_DIRECTORY
 
 ; Instfiles page
+!define MUI_PAGE_CUSTOMFUNCTION_LEAVE "SDCC.InstFilesLeave"
 !insertmacro MUI_PAGE_INSTFILES
 
-; Finish page
+${Function} SDCC.InstFilesLeave
+  ; Remove old path if reinstallation
+  ${If} $SDCC.PathToRemove != ""
+    ${DebugMsg} "removing path $SDCC.PathToRemove"
+    Push $SDCC.PathToRemove
+    Call SDCC.RemoveFromPath
+  ${EndIf}
+${FunctionEnd}
+
+; Finish page - add to path
+!define MUI_FINISHPAGE_TEXT "Confirm the checkbox if you want to add SDCC binary directory to the PATH environment variable"
 !define MUI_FINISHPAGE_SHOWREADME_TEXT "Add $INSTDIR\bin to the PATH"
-!define MUI_FINISHPAGE_SHOWREADME_FUNCTION AddBinToPath
+!define MUI_FINISHPAGE_SHOWREADME_FUNCTION SDCC.AddBinToPath
 !define MUI_FINISHPAGE_SHOWREADME
+!define MUI_FINISHPAGE_BUTTON "Next"
 !insertmacro MUI_PAGE_FINISH
 
+; Finish page - reboot
+!insertmacro MUI_PAGE_FINISH
+
+${Function} SDCC.AddBinToPath
+  ; Add new path
+  ${DebugMsg} "adding path $INSTDIR\bin"
+  Push "$INSTDIR\bin"
+  Call SDCC.AddToPath
+${FunctionEnd}
+
 ; Uninstaller pages
 !insertmacro MUI_UNPAGE_CONFIRM
 !insertmacro MUI_UNPAGE_INSTFILES
+!insertmacro MUI_UNPAGE_FINISH
 
 ; Language files
 !insertmacro MUI_LANGUAGE "English"
@@ -177,13 +288,14 @@ InstallDir "$PROGRAMFILES\SDCC"
 ;;;;ShowInstDetails show
 ;;;;ShowUnInstDetails show
 
-Function .onInit
+
+${Function} .onInit
+  ${DebugMsg} "Pre INSTDIR = $INSTDIR"
+
 !ifndef VER_MAJOR & VER_MINOR & VER_REVISION & VER_BUILD
   ; Old unistallation method
-  ;Uninstall the old version, if present
-  ReadRegStr $R0 HKLM \
-  "Software\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" \
-  "UninstallString"
+  ; Uninstall the old version, if present
+  ReadRegStr $R0 ${UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString"
   StrCmp $R0 "" inst
 
   MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION \
@@ -195,7 +307,7 @@ Function .onInit
 uninst:
   ; Run the uninstaller
   ClearErrors
-  ExecWait '$R0 _?=$INSTDIR' ;Do not copy the uninstaller to a temp file
+  ExecWait '$R0'
 
   Goto done
 inst:
@@ -205,21 +317,44 @@ inst:
   Abort
 
 done:
+!else
+  ; If the registry key exists it is an uninstallation or reinstallation:
+  ;  take the old installation directory
+  Push $R0
+
+  ReadRegStr $R0 ${UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "InstallLocation"
+  ${IfNot} ${Errors}
+    StrCpy $INSTDIR $R0
+    StrCpy $SDCC.PathToRemove "$INSTDIR\bin"
+  ${EndIf}
+
+  Pop $R0
 !endif
-  !insertmacro MULTIUSER_INIT
-FunctionEnd
+  ${DebugMsg} "Post INSTDIR = $INSTDIR"
+${FunctionEnd}
+
+${Function} un.onInit
+
+  ${DebugMsg} "Pre INSTDIR = $INSTDIR"
 
-Function un.onInit
-  !insertmacro MULTIUSER_UNINIT
-FunctionEnd
+  Push $R0
+  ReadRegStr $R0 ${UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "InstallLocation"
+  ${IfNot} ${Errors}
+    StrCpy $INSTDIR $R0
+  ${EndIf}
+  Pop $R0
+
+  ${DebugMsg} "Post INSTDIR = $INSTDIR"
 
-Section -Common
+${FunctionEnd}
+
+${Section} -Common SECCOMMON
   SetOutPath "$INSTDIR"
   File ".\sdcc.ico"
-  File "${SDCC_ROOT}\COPYING.TXT"
-SectionEnd
+  File "${SDCC_ROOT}\COPYING.txt"
+${SectionEnd}
 
-Section "SDCC application files" SEC01
+${Section} "SDCC application files" SEC01
   SectionIn 1 2 3 RO
   SetOutPath "$INSTDIR\bin"
   File "${SDCC_ROOT}\bin\as-gbz80.exe"
@@ -227,6 +362,7 @@ Section "SDCC application files" SEC01
   File "${SDCC_ROOT}\bin\as-z80.exe"
   File "${SDCC_ROOT}\bin\asx8051.exe"
   File "${SDCC_ROOT}\bin\aslink.exe"
+  File "${SDCC_ROOT}\bin\asranlib.exe"
   File "${SDCC_ROOT}\bin\link-gbz80.exe"
   File "${SDCC_ROOT}\bin\link-hc08.exe"
   File "${SDCC_ROOT}\bin\link-z80.exe"
@@ -236,25 +372,25 @@ Section "SDCC application files" SEC01
   File "${SDCC_ROOT}\bin\sdcclib.exe"
   File "${SDCC_ROOT}\bin\sdcpp.exe"
   File "${SDCC_ROOT}\bin\readline5.dll"
-SectionEnd
+${SectionEnd}
 
-Section "ucSim application files" SEC02
+${Section} "ucSim application files" SEC02
   SectionIn 1 2 3
   SetOutPath "$INSTDIR\bin"
   File "${SDCC_ROOT}\bin\s51.exe"
   File "${SDCC_ROOT}\bin\savr.exe"
   File "${SDCC_ROOT}\bin\shc08.exe"
   File "${SDCC_ROOT}\bin\sz80.exe"
-SectionEnd
+${SectionEnd}
 
-Section "SDCDB files" SEC03
+${Section} "SDCDB files" SEC03
   SectionIn 1 2 3
   File "${SDCC_ROOT}\bin\sdcdb.exe"
   File "${SDCC_ROOT}\bin\sdcdb.el"
   File "${SDCC_ROOT}\bin\sdcdbsrc.el"
-SectionEnd
+${SectionEnd}
 
-Section "SDCC documentation" SEC04
+${Section} "SDCC documentation" SEC04
   SectionIn 1 2 3
   SetOutPath "$INSTDIR\doc"
 !ifdef FULL_DOC
@@ -263,9 +399,9 @@ Section "SDCC documentation" SEC04
   File "${SDCC_ROOT}\doc\ChangeLog_head.txt"
   File "${SDCC_ROOT}\doc\README.TXT"
 !endif
-SectionEnd
+${SectionEnd}
 
-Section "SDCC include files" SEC05
+${Section} "SDCC include files" SEC05
   SectionIn 1 2
   SetOutPath "$INSTDIR\include\asm\default"
   File "${DEV_ROOT}\include\asm\default\features.h"
@@ -291,89 +427,81 @@ Section "SDCC include files" SEC05
   File "${DEV_ROOT}\include\pic\*.inc"
   SetOutPath "$INSTDIR\include\pic16"
   File "${DEV_ROOT}\include\pic16\*.h"
+  File "${DEV_ROOT}\include\pic16\*.txt"
   SetOutPath "$INSTDIR\include\z80"
   File "${DEV_ROOT}\include\z80\*.h"
   SetOutPath "$INSTDIR\include"
   File "${DEV_ROOT}\include\*.h"
-SectionEnd
+${SectionEnd}
 
-Section "SDCC DS390 library" SEC06
+${Section} "SDCC DS390 library" SEC06
   SectionIn 1 2
   SetOutPath "$INSTDIR\lib\ds390"
-  File "${DEV_ROOT}\lib\ds390\*.rel"
-  File "${DEV_ROOT}\lib\ds390\*.lib"
-SectionEnd
+  File "${DEV_ROOT}\lib\ds390\*.*"
+${SectionEnd}
 
-Section "SDCC DS400 library" SEC07
+${Section} "SDCC DS400 library" SEC07
   SectionIn 1 2
   SetOutPath "$INSTDIR\lib\ds400"
-  File "${DEV_ROOT}\lib\ds400\*.rel"
-  File "${DEV_ROOT}\lib\ds400\*.lib"
-SectionEnd
+  File "${DEV_ROOT}\lib\ds400\*.*"
+${SectionEnd}
 
-Section "SDCC GBZ80 library" SEC08
+${Section} "SDCC GBZ80 library" SEC08
   SectionIn 1 2
   SetOutPath "$INSTDIR\lib\gbz80"
-  File "${DEV_ROOT}\lib\gbz80\*.o"
-  File "${DEV_ROOT}\lib\gbz80\*.lib"
-SectionEnd
+  File "${DEV_ROOT}\lib\gbz80\*.*"
+${SectionEnd}
 
-Section "SDCC Z80 library" SEC09
+${Section} "SDCC Z80 library" SEC09
   SectionIn 1 2
   SetOutPath "$INSTDIR\lib\z80"
-  File "${DEV_ROOT}\lib\z80\*.o"
-  File "${DEV_ROOT}\lib\z80\*.lib"
-SectionEnd
+  File "${DEV_ROOT}\lib\z80\*.*"
+${SectionEnd}
 
-Section "SDCC small model library" SEC10
+${Section} "SDCC small model library" SEC10
   SectionIn 1 2
   SetOutPath "$INSTDIR\lib\small"
-  File "${DEV_ROOT}\lib\small\*.rel"
-  File "${DEV_ROOT}\lib\small\*.lib"
-SectionEnd
+  File "${DEV_ROOT}\lib\small\*.*"
+${SectionEnd}
 
-Section "SDCC medium model library" SEC11
+${Section} "SDCC medium model library" SEC11
   SectionIn 1 2
   SetOutPath "$INSTDIR\lib\medium"
-  File "${DEV_ROOT}\lib\medium\*.rel"
-  File "${DEV_ROOT}\lib\medium\*.lib"
-SectionEnd
+  File "${DEV_ROOT}\lib\medium\*.*"
+${SectionEnd}
 
-Section "SDCC large model library" SEC12
+${Section} "SDCC large model library" SEC12
   SectionIn 1 2
   SetOutPath "$INSTDIR\lib\large"
-  File "${DEV_ROOT}\lib\large\*.rel"
-  File "${DEV_ROOT}\lib\large\*.lib"
-SectionEnd
+  File "${DEV_ROOT}\lib\large\*.*"
+${SectionEnd}
 
-Section "SDCC small-stack-auto model library" SEC13
+${Section} "SDCC small-stack-auto model library" SEC13
   SectionIn 1 2
   SetOutPath "$INSTDIR\lib\small-stack-auto"
-  File "${DEV_ROOT}\lib\small-stack-auto\*.rel"
-  File "${DEV_ROOT}\lib\small-stack-auto\*.lib"
-SectionEnd
+  File "${DEV_ROOT}\lib\small-stack-auto\*.*"
+${SectionEnd}
 
-Section "SDCC HC08 library" SEC14
+${Section} "SDCC HC08 library" SEC14
   SectionIn 1 2
   SetOutPath "$INSTDIR\lib\hc08"
-  File "${DEV_ROOT}\lib\hc08\*.rel"
-  File "${DEV_ROOT}\lib\hc08\*.lib"
-SectionEnd
+  File "${DEV_ROOT}\lib\hc08\*.*"
+${SectionEnd}
 
-Section "SDCC PIC16 library" SEC15
+${Section} "SDCC PIC16 library" SEC15
   SectionIn 1 2
   SetOutPath "$INSTDIR\lib\pic16"
   File "${DEV_ROOT}\lib\pic16\*.o"
   File "${DEV_ROOT}\lib\pic16\*.lib"
-SectionEnd
+${SectionEnd}
 
-Section "SDCC PIC library" SEC16
+${Section} "SDCC PIC library" SEC16
   SectionIn 1 2
   SetOutPath "$INSTDIR\lib\pic"
   File "${DEV_ROOT}\lib\pic\*.lib"
-SectionEnd
+${SectionEnd}
 
-Section "SDCC library sources" SEC17
+${Section} "SDCC library sources" SEC17
   SectionIn 1
   SetOutPath "$INSTDIR\lib\src\ds390\examples"
   File "${DEV_ROOT}\lib\src\ds390\examples\MOVED"
@@ -392,7 +520,6 @@ Section "SDCC library sources" SEC17
 #  File "${DEV_ROOT}\lib\src\gbz80\Makefile"
 
   SetOutPath "$INSTDIR\lib\src\z80"
-  File "${DEV_ROOT}\lib\src\z80\*.c"
   File "${DEV_ROOT}\lib\src\z80\*.s"
 #  File "${DEV_ROOT}\lib\src\z80\Makefile"
 
@@ -555,7 +682,7 @@ Section "SDCC library sources" SEC17
 
   SetOutPath "$INSTDIR\lib\src"
   File "${DEV_ROOT}\lib\src\*.c"
-SectionEnd
+${SectionEnd}
 
 ;--------------------------------
 ;Descriptions
@@ -601,51 +728,72 @@ LangString DESC_SEC17 ${LANG_ENGLISH} "SDCC library sources"
 !insertmacro MUI_FUNCTION_DESCRIPTION_END
 ;--------------------------------
 
-Section -Icons
+${Section} -Icons SECICONS
 !insertmacro MUI_STARTMENU_WRITE_BEGIN Application
   CreateDirectory "$SMPROGRAMS\$MUI_STARTMENUPAGE_VARIABLE"
-  CreateShortCut "$SMPROGRAMS\$MUI_STARTMENUPAGE_VARIABLE\SDCC on the Web.lnk" "$INSTDIR\sdcc.url" 
   CreateShortCut "$SMPROGRAMS\$MUI_STARTMENUPAGE_VARIABLE\Uninstall SDCC.lnk" "$INSTDIR\uninstall.exe" 
+!ifdef FULL_DOC
+  CreateShortCut "$SMPROGRAMS\$MUI_STARTMENUPAGE_VARIABLE\Documentation.lnk" "$INSTDIR\doc\sdccman.pdf" "" "$INSTDIR\sdcc.ico" "" "" "" ""
+  CreateShortCut "$SMPROGRAMS\$MUI_STARTMENUPAGE_VARIABLE\README.lnk" "$INSTDIR\doc\README.TXT" "" "$INSTDIR\sdcc.ico" "" "" "" ""
+  CreateShortCut "$SMPROGRAMS\$MUI_STARTMENUPAGE_VARIABLE\Change Log.lnk" "$INSTDIR\doc\ChangeLog.txt" "" "$INSTDIR\sdcc.ico" "" "" "" ""
+!else
   CreateShortCut "$SMPROGRAMS\$MUI_STARTMENUPAGE_VARIABLE\Documentation.lnk" "$INSTDIR\doc\README.TXT" "" "$INSTDIR\sdcc.ico" "" "" "" ""
   CreateShortCut "$SMPROGRAMS\$MUI_STARTMENUPAGE_VARIABLE\Change Log.lnk" "$INSTDIR\doc\ChangeLog_head.txt" "" "$INSTDIR\sdcc.ico" "" "" "" ""
-  CreateShortCut "$SMPROGRAMS\$MUI_STARTMENUPAGE_VARIABLE\GPL 2 License.lnk" "$INSTDIR\COPYING.TXT" 
+!endif
+  CreateShortCut "$SMPROGRAMS\$MUI_STARTMENUPAGE_VARIABLE\GPL 2 License.lnk" "$INSTDIR\COPYING.txt"
 !insertmacro MUI_STARTMENU_WRITE_END
-SectionEnd
+${SectionEnd}
 
-Section -INI
-  WriteIniStr "$INSTDIR\sdcc.url" "InternetShortcut" "URL" "http://sdcc.sourceforge.net/"
-SectionEnd
+${Section} -INI SECINI
+  WriteIniStr "$SMPROGRAMS\$MUI_STARTMENUPAGE_VARIABLE\SDCC on the Web.url" "InternetShortcut" "URL" "http://sdcc.sourceforge.net/"
+!ifdef FULL_DOC
+  WriteIniStr "$SMPROGRAMS\$MUI_STARTMENUPAGE_VARIABLE\Latest Changes.url" "InternetShortcut" "URL" "http://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc/ChangeLog"
+!endif
+${SectionEnd}
 
-Section -PostInstall
-  WriteRegStr HKLM "Software\${PRODUCT_NAME}" "" $INSTDIR
+${Section} -PostInstall SECPOSTINSTALL
+  WriteRegStr ${SDCC_ROOT_KEY} "Software\${PRODUCT_NAME}" "" $INSTDIR
 !ifdef VER_MAJOR & VER_MINOR & VER_REVISION & VER_BUILD
-  WriteRegDword HKLM "Software\${PRODUCT_NAME}" "VersionMajor" "${VER_MAJOR}"
-  WriteRegDword HKLM "Software\${PRODUCT_NAME}" "VersionMinor" "${VER_MINOR}"
-  WriteRegDword HKLM "Software\${PRODUCT_NAME}" "VersionRevision" "${VER_REVISION}"
-  WriteRegDword HKLM "Software\${PRODUCT_NAME}" "VersionBuild" "${VER_BUILD}"
+  WriteRegDword ${SDCC_ROOT_KEY} "Software\${PRODUCT_NAME}" "VersionMajor" "${VER_MAJOR}"
+  WriteRegDword ${SDCC_ROOT_KEY} "Software\${PRODUCT_NAME}" "VersionMinor" "${VER_MINOR}"
+  WriteRegDword ${SDCC_ROOT_KEY} "Software\${PRODUCT_NAME}" "VersionRevision" "${VER_REVISION}"
+  WriteRegDword ${SDCC_ROOT_KEY} "Software\${PRODUCT_NAME}" "VersionBuild" "${VER_BUILD}"
 !endif
 
-  WriteRegStr HKLM ${PRODUCT_UNINST_KEY} "DisplayName" "${PRODUCT_NAME}"
-  WriteRegStr HKLM ${PRODUCT_UNINST_KEY} "UninstallString" "$INSTDIR\uninstall.exe"
-  WriteRegStr HKLM ${PRODUCT_UNINST_KEY} "Publisher" "sdcc.sourceforge.net"
-  WriteRegStr HKLM ${PRODUCT_UNINST_KEY} "URLInfoAbout" "http://sdcc.sourceforge.net/"
-  WriteRegStr HKLM ${PRODUCT_UNINST_KEY} "HelpLink" "http://sdcc.sourceforge.net/"
-  WriteRegStr HKLM ${PRODUCT_UNINST_KEY} "URLUpdateInfo" "http://sdcc.sourceforge.net/"
+  WriteRegExpandStr ${UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninstall.exe"
+  WriteRegExpandStr ${UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "InstallLocation" "$INSTDIR"
+  WriteRegStr ${UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "${PRODUCT_NAME}"
+  WriteRegStr ${UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "sdcc.sourceforge.net"
+  WriteRegStr ${UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "http://sdcc.sourceforge.net/"
+  WriteRegStr ${UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "HelpLink" "http://sdcc.sourceforge.net/"
+  WriteRegStr ${UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLUpdateInfo" "http://sdcc.sourceforge.net/"
 
   WriteUninstaller "$INSTDIR\uninstall.exe"
-SectionEnd
+${SectionEnd}
 
 
 ;;;; Uninstaller code ;;;;
 
-Section Uninstall
+${Section} Uninstall SECUNINSTALL
   !insertmacro MUI_STARTMENU_GETFOLDER Application $MUI_STARTMENUPAGE_VARIABLE
 
+  ${DebugMsg} "removing path $INSTDIR\bin"
+  Push "$INSTDIR\bin"
+  Call un.SDCC.RemoveFromPath
+
+; Clean the registry
+  DeleteRegKey ${UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
+  DeleteRegKey ${SDCC_ROOT_KEY} "Software\${PRODUCT_NAME}"
+
   Delete "$SMPROGRAMS\$MUI_STARTMENUPAGE_VARIABLE\GPL 2 License.lnk"
   Delete "$SMPROGRAMS\$MUI_STARTMENUPAGE_VARIABLE\Change Log.lnk"
+!ifdef FULL_DOC
+  Delete "$SMPROGRAMS\$MUI_STARTMENUPAGE_VARIABLE\Latest Changes.url"
+  Delete "$SMPROGRAMS\$MUI_STARTMENUPAGE_VARIABLE\README.lnk"
+!endif
   Delete "$SMPROGRAMS\$MUI_STARTMENUPAGE_VARIABLE\Documentation.lnk"
   Delete "$SMPROGRAMS\$MUI_STARTMENUPAGE_VARIABLE\Uninstall SDCC.lnk"
-  Delete "$SMPROGRAMS\$MUI_STARTMENUPAGE_VARIABLE\SDCC on the Web.lnk"
+  Delete "$SMPROGRAMS\$MUI_STARTMENUPAGE_VARIABLE\SDCC on the Web.url"
 
   RMDir "$SMPROGRAMS\$MUI_STARTMENUPAGE_VARIABLE"
 
@@ -663,7 +811,6 @@ Section Uninstall
   Delete "$INSTDIR\lib\src\hc08\hc08.lib"
   Delete "$INSTDIR\lib\src\hc08\Makefile"
 
-  Delete "$INSTDIR\lib\src\z80\*.c"
   Delete "$INSTDIR\lib\src\z80\*.s"
   Delete "$INSTDIR\lib\src\z80\z80.lib"
   Delete "$INSTDIR\lib\src\z80\README"
@@ -688,37 +835,28 @@ Section Uninstall
 
   Delete "$INSTDIR\lib\src\*.c"
 
-  Delete "$INSTDIR\lib\pic\*.o"
   Delete "$INSTDIR\lib\pic\*.lib"
 
   Delete "$INSTDIR\lib\pic16\*.o"
   Delete "$INSTDIR\lib\pic16\*.lib"
 
-  Delete "$INSTDIR\lib\hc08\*.rel"
   Delete "$INSTDIR\lib\hc08\*.lib"
 
   Delete "$INSTDIR\lib\z80\*.o"
   Delete "$INSTDIR\lib\z80\*.lib"
 
-  Delete "$INSTDIR\lib\small\*.rel"
   Delete "$INSTDIR\lib\small\*.lib"
 
-  Delete "$INSTDIR\lib\medium\*.rel"
   Delete "$INSTDIR\lib\medium\*.lib"
 
-  Delete "$INSTDIR\lib\large\*.rel"
   Delete "$INSTDIR\lib\large\*.lib"
 
-  Delete "$INSTDIR\lib\small-stack-auto\*.rel"
   Delete "$INSTDIR\lib\small-stack-auto\*.lib"
 
-  Delete "$INSTDIR\lib\gbz80\*.o"
   Delete "$INSTDIR\lib\gbz80\*.lib"
 
-  Delete "$INSTDIR\lib\ds390\*.rel"
   Delete "$INSTDIR\lib\ds390\*.lib"
 
-  Delete "$INSTDIR\lib\ds400\*.rel"
   Delete "$INSTDIR\lib\ds400\*.lib"
 
   Delete "$INSTDIR\include\asm\z80\*.h"
@@ -733,6 +871,7 @@ Section Uninstall
   Delete "$INSTDIR\include\pic\*.txt"
   Delete "$INSTDIR\include\pic\*.inc"
   Delete "$INSTDIR\include\pic16\*.h"
+  Delete "$INSTDIR\include\pic16\*.txt"
   Delete "$INSTDIR\include\mcs51\*.h"
   Delete "$INSTDIR\include\hc08\*.h"
   Delete "$INSTDIR\include\*.h"
@@ -747,6 +886,7 @@ Section Uninstall
   Delete "$INSTDIR\bin\as-z80.exe"
   Delete "$INSTDIR\bin\asx8051.exe"
   Delete "$INSTDIR\bin\aslink.exe"
+  Delete "$INSTDIR\bin\asranlib.exe"
   Delete "$INSTDIR\bin\link-gbz80.exe"
   Delete "$INSTDIR\bin\link-hc08.exe"
   Delete "$INSTDIR\bin\link-z80.exe"
@@ -767,9 +907,8 @@ Section Uninstall
   Delete "$INSTDIR\bin\sdcdb.el"
   Delete "$INSTDIR\bin\sdcdbsrc.el"
 
-  Delete "$INSTDIR\COPYING.TXT"
+  Delete "$INSTDIR\COPYING.txt"
   Delete "$INSTDIR\sdcc.ico"
-  Delete "$INSTDIR\sdcc.url"
   Delete "$INSTDIR\uninstall.exe"
 
   RMDir /r "$INSTDIR\lib\src\pic"
@@ -823,16 +962,8 @@ Section Uninstall
   RMDir "$INSTDIR\bin"
 
   RMDir "$INSTDIR"
-
-  Push "$INSTDIR\bin"
-  Call un.RemoveFromPath
-
-; Clean the registry
-  DeleteRegValue HKLM ${PRODUCT_UNINST_KEY} "NSIS:StartMenuDir"
-  DeleteRegKey HKLM "${PRODUCT_UNINST_KEY}"
-  DeleteRegKey HKLM "Software\${PRODUCT_NAME}"
 ;;;;  SetAutoClose true
-SectionEnd
+${SectionEnd}
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ; Path Manipulation functions                                                 ;
@@ -842,16 +973,11 @@ SectionEnd
 !include "WinMessages.nsh"
 !verbose 4
 
-Function AddBinToPath
-    Push "$INSTDIR\bin"
-    Call AddToPath
-FunctionEnd
-
 ; AddToPath - Adds the given dir to the search path.
 ;        Input - head of the stack
 ;        Note - Win9x systems requires reboot
 
-Function AddToPath
+${Function} SDCC.AddToPath
   Exch $0
   Push $1
   Push $2
@@ -859,67 +985,72 @@ Function AddToPath
   Push $4
 
   ; don't add if the path doesn't exist
-  IfFileExists $0 "" AddToPath_done
-
-  Call IsNT
-  Pop $4
-  StrCmp $4 1 +3
-    ; Not on NT: read PATH from environment variable
-    ReadEnvStr $1 PATH
-    Goto +2
-    ; On NT: read PATH from registry
-    ReadRegStr $1 HKCU "Environment" "PATH"
-  ${StrStr} $2 "$1;" "$0;"
-  StrCmp $2 "" "" AddToPath_done
-
-  ${StrStr} $2 "$1;" "$0\;"
-  StrCmp $2 "" "" AddToPath_done
-
-  GetFullPathName /SHORT $3 $0
-  ${StrStr} $2 "$1;" "$3;"
-  StrCmp $2 "" "" AddToPath_done
-
-  ${StrStr} $2 "$1;" "$03\;"
-  StrCmp $2 "" "" AddToPath_done
-
-  StrCmp $4 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
+  ${If} ${FileExists} $0
+    Call SDCC.IsNT
+    Pop $4
+    ${If} $4 != 1
+      ; Not on NT: read PATH from environment variable
+      ReadEnvStr $1 PATH
+    ${Else}
+      ; On NT: read PATH from registry
+      ReadRegStr $1 HKCU "Environment" "PATH"
+    ${EndIf}
 
-  AddToPath_NT:
-    ;System PATH variable is at:
-    ;HKLM "/SYSTEM/CurrentControlSet/Control/Session Manager/Environment" "Path"
-    ReadRegStr $1 HKCU "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 HKCU "Environment" "PATH" $0
-      SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
+    ${StrStr} $2 "$1;" "$0;"
+    ${If} $2 == ""
+      ${StrStr} $2 "$1;" "$0\;"
+      ${If} $2 == ""
+        GetFullPathName /SHORT $3 $0
+        ${StrStr} $2 "$1;" "$3;"
+        ${If} $2 == ""
+          ${StrStr} $2 "$1;" "$03\;"
+          ${If} $2 == ""
+            ${If} $4 != 1
+              ; Not on NT
+              StrCpy $1 $WINDIR 2
+              FileOpen $1 "$1\autoexec.bat" a
+              FileSeek $1 -1 END
+              FileReadByte $1 $2
+              ${If} $2 = 26        ; DOS EOF
+                FileSeek $1 -1 END ; write over EOF
+              ${Endif}
+              ${DebugMsg} "adding line $\r$\nSET PATH=%PATH%;$3$\r$\n"
+              FileWrite $1 "$\r$\nSET PATH=%PATH%;$3$\r$\n"
+              FileClose $1
+              ${DebugMsg} "SetRebootFlag true"
+              SetRebootFlag true
+            ${Else}
+              ;System PATH variable is at:
+              ;HKLM "/SYSTEM/CurrentControlSet/Control/Session Manager/Environment" "Path"
+              ReadRegStr $1 HKCU "Environment" "PATH"
+              StrCpy $2 $1 1 -1  ; copy last char
+              ${If} $2 == ";"    ; if last char == ;
+                StrCpy $1 $1 -1  ; remove last char
+              ${Endif}
+              ${If} $1 != ""
+                StrCpy $0 "$1;$0"
+              ${Endif}
+              WriteRegExpandStr HKCU "Environment" "PATH" $0
+              SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
+            ${Endif}
+          ${Endif}
+        ${Endif}
+      ${Endif}
+    ${Endif}
+  ${EndIf}
 
-  AddToPath_done:
-    Pop $4
-    Pop $3
-    Pop $2
-    Pop $1
-    Pop $0
-FunctionEnd
+  Pop $4
+  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
+!macro SDCC.RemoveFromPath un
+${Function} ${un}SDCC.RemoveFromPath
   Exch $0
   Push $1
   Push $2
@@ -930,9 +1061,9 @@ Function un.RemoveFromPath
 
   IntFmt $6 "%c" 26 ; DOS EOF
 
-  Call un.IsNT
+  Call ${un}SDCC.IsNT
   Pop $1
-  StrCmp $1 1 unRemoveFromPath_NT
+  ${If} $1 != 1
     ; Not on NT
     StrCpy $1 $WINDIR 2
     FileOpen $1 "$1\autoexec.bat" r
@@ -940,42 +1071,52 @@ Function un.RemoveFromPath
     FileOpen $2 $4 w
     GetFullPathName /SHORT $0 $0
     StrCpy $0 "SET PATH=%PATH%;$0"
-    Goto unRemoveFromPath_dosLoop
 
-    unRemoveFromPath_dosLoop:
-      FileRead $1 $3
+  nextLine:
+    ; copy all lines except the line containing "SET PATH=%PATH%;$0"
+    ; from autoexec.bat to the temporary file
+    ClearErrors
+    FileRead $1 $3
+    ${IfNot} ${Errors}
       StrCpy $5 $3 1 -1 ; read last char
-      StrCmp $5 $6 0 +2 ; if DOS EOF
+      ${If} $5 == $6    ; 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:
+      ${EndIf}
+      ${If} $3 != "$0$\r$\n"
+        ${AndIf} $3 != "$0$\n"
+        ${AndIf} $3 != "$0"
+        FileWrite $2 $3
+        Goto nextLine
+      ${Else}
+        ; This is the line I'm looking for:
+        ; don't copy it
+        ${DebugMsg} "removing line $0"
+        ${DebugMsg} "SetRebootFlag true"
         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:
+        Goto nextLine
+      ${EndIf}
+    ${EndIf}
+
+    FileClose $2
+    FileClose $1
+    StrCpy $1 $WINDIR 2
+    Delete "$1\autoexec.bat"
+    CopyFiles /SILENT $4 "$1\autoexec.bat"
+    Delete $4
+  ${Else}
     ;System PATH variable is at:
     ;HKLM "/SYSTEM/CurrentControlSet/Control/Session Manager/Environment" "Path"
     ReadRegStr $1 HKCU "Environment" "PATH"
     StrCpy $5 $1 1 -1 ; copy last char
-    StrCmp $5 ";" +2  ; if last char != ;
+    ${If} $5 != ";"   ; if last char != ;
       StrCpy $1 "$1;" ; append ;
-    ${UnStrStr} $2 $1 "$0;"    ; Find `$0;` in $1
-    StrCmp $2 "" unRemoveFromPath_done
-      ; else, it is in path
+    ${EndIf}
+    Push $1
+    Push "$0;"
+    Call ${un}StrStr  ; Find `$0;` in $1
+    Pop $2            ; pos of our dir
+    ${If} $2 != ""
+      ; it is in path:
       ; $0 - path to add
       ; $1 - path var
       StrLen $3 "$0;"
@@ -985,26 +1126,31 @@ Function un.RemoveFromPath
       StrCpy $3 $5$6
 
       StrCpy $5 $3 1 -1  ; copy last char
-      StrCmp $5 ";" 0 +2 ; if last char == ;
+      ${If} $5 == ";"    ; if last char == ;
         StrCpy $3 $3 -1  ; remove last char
-
-      StrCmp $3 "" +3
+      ${EndIf}
+      ${If} $3 != ""
         ; New PATH not empty: update the registry
         WriteRegExpandStr HKCU "Environment" "PATH" $3
-        Goto +2
+      ${Else}
         ; New PATH empty: remove from the registry
         DeleteRegValue HKCU "Environment" "PATH"
+      ${EndIf}
       SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
+    ${Endif}
+  ${Endif}
 
-  unRemoveFromPath_done:
-    Pop $6
-    Pop $5
-    Pop $4
-    Pop $3
-    Pop $2
-    Pop $1
-    Pop $0
-FunctionEnd
+  Pop $6
+  Pop $5
+  Pop $4
+  Pop $3
+  Pop $2
+  Pop $1
+  Pop $0
+${FunctionEnd}
+!macroend
+!insertmacro SDCC.RemoveFromPath ""
+!insertmacro SDCC.RemoveFromPath "un."
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ; Utility Functions                                                           ;
@@ -1019,24 +1165,23 @@ FunctionEnd
 ;   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:
+!macro SDCC.IsNT un
+${Function} ${un}SDCC.IsNT
+  Push $R0
+  ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion
+  ${If} $R0 == ""
+    ; we are not NT.
+    Pop $R0
+    Push 0
+  ${Else}
     ; NT!!!
-    Pop $0
+    Pop $R0
     Push 1
-FunctionEnd
+  ${EndIf}
+${FunctionEnd}
 !macroend
-!insertmacro IsNT ""
-!insertmacro IsNT "un."
+!insertmacro SDCC.IsNT ""
+!insertmacro SDCC.IsNT "un."
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;  Uninstall/Reinstall page functions                                         ;
@@ -1046,21 +1191,21 @@ FunctionEnd
 
 Var ReinstallPageCheck
 
-Function PageReinstall
+${Function} SDCC.PageReinstall
 
-  ReadRegStr $R0 HKLM "Software\${PRODUCT_NAME}" ""
+  ReadRegStr $R0 ${SDCC_ROOT_KEY} "Software\${PRODUCT_NAME}" ""
 
   ${If} $R0 == ""
-    ReadRegStr $R0 HKLM "${PRODUCT_UNINST_KEY}" "UninstallString"
+    ReadRegStr $R0 ${UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString"
     ${If} $R0 == ""
       Abort
     ${EndIf}
   ${EndIf}
 
-  ReadRegDWORD $R0 HKLM "Software\${PRODUCT_NAME}" "VersionMajor"
-  ReadRegDWORD $R1 HKLM "Software\${PRODUCT_NAME}" "VersionMinor"
-  ReadRegDWORD $R2 HKLM "Software\${PRODUCT_NAME}" "VersionRevision"
-  ReadRegDWORD $R3 HKLM "Software\${PRODUCT_NAME}" "VersionBuild"
+  ReadRegDWORD $R0 ${SDCC_ROOT_KEY} "Software\${PRODUCT_NAME}" "VersionMajor"
+  ReadRegDWORD $R1 ${SDCC_ROOT_KEY} "Software\${PRODUCT_NAME}" "VersionMinor"
+  ReadRegDWORD $R2 ${SDCC_ROOT_KEY} "Software\${PRODUCT_NAME}" "VersionRevision"
+  ReadRegDWORD $R3 ${SDCC_ROOT_KEY} "Software\${PRODUCT_NAME}" "VersionBuild"
   StrCpy $R0 $R0.$R1.$R2.$R3
 
   ${VersionCompare} ${VER_MAJOR}.${VER_MINOR}.${VER_REVISION}.${VER_BUILD} $R0 $R0
@@ -1093,11 +1238,11 @@ Function PageReinstall
 
   ${NSD_CreateRadioButton} 30u 50u -30u 8u $R2
   Pop $R2
-  ${NSD_OnClick} $R2 PageReinstallUpdateSelection
+  ${NSD_OnClick} $R2 SDCC.PageReinstallUpdateSelection
 
   ${NSD_CreateRadioButton} 30u 70u -30u 8u $R3
   Pop $R3
-  ${NSD_OnClick} $R3 PageReinstallUpdateSelection
+  ${NSD_OnClick} $R3 SDCC.PageReinstallUpdateSelection
 
   ${If} $ReinstallPageCheck != 2
     SendMessage $R2 ${BM_SETCHECK} ${BST_CHECKED} 0
@@ -1107,9 +1252,9 @@ Function PageReinstall
 
   nsDialogs::Show
 
-FunctionEnd
+${FunctionEnd}
 
-Function PageReinstallUpdateSelection
+${Function} SDCC.PageReinstallUpdateSelection
 
   Pop $R1
 
@@ -1121,42 +1266,46 @@ Function PageReinstallUpdateSelection
     StrCpy $ReinstallPageCheck 2
   ${EndIf}
 
-FunctionEnd
+${FunctionEnd}
 
-Function PageLeaveReinstall
+${Function} SDCC.PageLeaveReinstall
 
   ${NSD_GetState} $R2 $R1
 
-  StrCmp $R0 "1" 0 +2
-    StrCmp $R1 "1" reinst_uninstall reinst_done
+  ${DebugMsg} "R0 = $R0, R1 = $R1, R2 = $R2"
 
-  StrCmp $R0 "2" 0 +3
-    StrCmp $R1 "1" reinst_done reinst_uninstall
+  ${If} $R0 == "1"
+    ${AndIf} $R1 != "1"
+    Goto reinst_done
+  ${EndIf}
 
-  reinst_uninstall:
-  ReadRegStr $R1 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" "UninstallString"
+  ${If} $R0 == "2"
+    ${AndIf} $R1 == 1
+    Goto reinst_done
+  ${EndIf}
+
+  ReadRegStr $R1 ${UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString"
 
   ;Run uninstaller
   HideWindow
 
+  ${If} $R0 == "2"
+    ; Uninstall only: uninstaller should be removed
     ClearErrors
-    ExecWait '$R1 _?=$INSTDIR'
-
-    IfErrors no_remove_uninstaller
-    IfFileExists "$INSTDIR\bin\${PRODUCT_NAME}.exe" no_remove_uninstaller
-
-      Delete $R1
-      RMDir $INSTDIR
-
-    no_remove_uninstaller:
-
-  StrCmp $R0 "2" 0 +2
+    ; ExecWait doesn't wait if _?=$INSTDIR is not defined!
+    ExecWait '$R1'
     Quit
+  ${Else}
+    ; Uninstal & Reinstall: uninstaller will be rewritten
+    ClearErrors
+    ; ExecWait doesn't wait if _?=$INSTDIR is not defined!
+    ExecWait '$R1 _?=$INSTDIR'
+  ${EndIf}
 
   BringToFront
 
-  reinst_done:
+reinst_done:
 
-FunctionEnd
+${FunctionEnd}
 
 !endif # VER_MAJOR & VER_MINOR & VER_REVISION & VER_BUILD