You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@avalon.apache.org by fa...@apache.org on 2004/05/08 22:46:57 UTC

cvs commit: avalon/merlin/install PathMunge.nsh README.txt WriteEnvStr.nsh merlin.nsi

farra       2004/05/08 13:46:57

  Added:       merlin/install PathMunge.nsh README.txt WriteEnvStr.nsh
                        merlin.nsi
  Log:
  basic merlin windows installer using NSIS.  See README for details.
  
  Revision  Changes    Path
  1.1                  avalon/merlin/install/PathMunge.nsh
  
  Index: PathMunge.nsh
  ===================================================================
  !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 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
  
    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 HKCU "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 HKCU "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."
  
  
  1.1                  avalon/merlin/install/README.txt
  
  Index: README.txt
  ===================================================================
  MERLIN NSIS Installer Script
  
  You will need the Nullsoft Installation System to compile this script
  see: http://nsis.sourceforge.net/
  
  Features:
    - Installs the base Merlin platform
    - Optionally installs the docs, tutorials, plugins and service
    - Creates a MERLIN_HOME env variable for ALL USERS
    - Installs the Merlin NT service
    - Adds Merlin to the PATH
    - Installs the plugins into MAVEN_HOME/plugins or if maven is
      not installed into MERLIN_HOME/plugins
  
  To Do:
    - Check for JVM and version.  Install endorsed libs if needed
    - All install for one user or many
    - Install a default app that includes the merlin facilities
    - Add desktop and start menu shortcuts (to what?)
  
  To compile:
  
     1. check out the meta, util, repository, tutorials, and merlin CVS modules
     2. use maven to build the merlin 
     3. use maven to build merlin docs (maven site:generate)
     4. use maven to build the tutorials (maven avalon:build)
     5. compile the NSIS script
  
   
  
  
  
  1.1                  avalon/merlin/install/WriteEnvStr.nsh
  
  Index: WriteEnvStr.nsh
  ===================================================================
  !include WinMessages.nsh
  
  !ifdef ALL_USERS
    !define WriteEnvStr_RegKey \
       'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"'
  !else
    !define WriteEnvStr_RegKey 'HKCU "Environment"'
  !endif
  
  #
  # WriteEnvStr - Writes an environment variable
  # Note: Win9x systems requires reboot
  #
  # Example:
  #  Push "HOMEDIR"           # name
  #  Push "C:\New Home Dir\"  # value
  #  Call WriteEnvStr
  #
  Function WriteEnvStr
    Exch $1 ; $1 has environment variable value
    Exch
    Exch $0 ; $0 has environment variable name
    Push $2
    
    Call IsNT
    Pop $2
    StrCmp $2 1 WriteEnvStr_NT
      ; Not on NT
      StrCpy $2 $WINDIR 2 ; Copy drive of windows (c:)
      FileOpen $2 "$2\autoexec.bat" a
      FileSeek $2 0 END
      FileWrite $2 "$\r$\nSET $0=$1$\r$\n"
      FileClose $2
      SetRebootFlag true
      Goto WriteEnvStr_done
  
    WriteEnvStr_NT:
        WriteRegExpandStr ${WriteEnvStr_RegKey} $0 $1
        SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} \
          0 "STR:Environment" /TIMEOUT=5000
    
    WriteEnvStr_done:
      Pop $2
      Pop $1
      Pop $0
  FunctionEnd
  
  #
  # un.DeleteEnvStr - Removes an environment variable
  # Note: Win9x systems requires reboot
  #
  # Example:
  #  Push "HOMEDIR"           # name
  #  Call un.DeleteEnvStr
  #
  Function un.DeleteEnvStr
    Exch $0 ; $0 now has the name of the variable
    Push $1
    Push $2
    Push $3
    Push $4
    Push $5
    
    Call un.IsNT
    Pop $1
    StrCmp $1 1 DeleteEnvStr_NT
      ; Not on NT
      StrCpy $1 $WINDIR 2
      FileOpen $1 "$1\autoexec.bat" r
      GetTempFileName $4
      FileOpen $2 $4 w
      StrCpy $0 "SET $0="
      SetRebootFlag true
      
      DeleteEnvStr_dosLoop:
        FileRead $1 $3
        StrLen $5 $0
        StrCpy $5 $3 $5
        StrCmp $5 $0 DeleteEnvStr_dosLoop
        StrCmp $5 "" DeleteEnvStr_dosLoopEnd
        FileWrite $2 $3
        Goto DeleteEnvStr_dosLoop
      
      DeleteEnvStr_dosLoopEnd:
        FileClose $2
        FileClose $1
        StrCpy $1 $WINDIR 2
        Delete "$1\autoexec.bat"
        CopyFiles /SILENT $4 "$1\autoexec.bat"
        Delete $4
        Goto DeleteEnvStr_done
  
    DeleteEnvStr_NT:
      DeleteRegValue ${WriteEnvStr_RegKey} $0
      SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} \
        0 "STR:Environment" /TIMEOUT=5000
    
    DeleteEnvStr_done:
      Pop $5
      Pop $4
      Pop $3
      Pop $2
      Pop $1
      Pop $0
  FunctionEnd
  
  
  
  
  1.1                  avalon/merlin/install/merlin.nsi
  
  Index: merlin.nsi
  ===================================================================
  ; Merlin NSIS Installer
  ; Copyright 2004 The Apache Software Foundation
  ;
  ; Licensed under the Apache License, Version 2.0 (the "License");
  ; you may not use this file except in compliance with the License.
  ; You may obtain a copy of the License at
  ;
  ;    http://www.apache.org/licenses/LICENSE-2.0
  ;
  ; Unless required by applicable law or agreed to in writing, software
  ; distributed under the License is distributed on an "AS IS" BASIS,
  ; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  ; See the License for the specific language governing permissions and
  ; limitations under the License.
  
  !define ALL_USERS
  
  !define TEMP $R0
  
  !include "WriteEnvStr.nsh"
  !include "PathMunge.nsh"
  !include "MUI.nsh"
  
  ;--------------------------------
  ;Configuration
  
    ;General
    Name "Merlin Platform 3.3"
    OutFile "merlin-install.exe"
  
    ;Folder selection page
    InstallDir "C:\merlin"
    
    ;Remember install folder
    InstallDirRegKey HKCU "Software\Merlin Platform 3.3" ""
  
  ;--------------------------------
  ;Interface Settings
  
    !define MUI_HEADERIMAGE
    !define MUI_ABORTWARNING
  
  ;--------------------------------
  ;Pages
  
    !insertmacro MUI_PAGE_WELCOME
    !insertmacro MUI_PAGE_LICENSE "..\LICENSE.txt"
    !insertmacro MUI_PAGE_COMPONENTS
    !insertmacro MUI_PAGE_DIRECTORY
    !insertmacro MUI_PAGE_INSTFILES
    !insertmacro MUI_PAGE_FINISH
  
    !insertmacro MUI_UNPAGE_WELCOME
    !insertmacro MUI_UNPAGE_CONFIRM
    !insertmacro MUI_UNPAGE_INSTFILES
    !insertmacro MUI_UNPAGE_FINISH
    
  ;--------------------------------
  ;Languages
   
    !insertmacro MUI_LANGUAGE "English"
    
  ;--------------------------------
  ;Language Strings
  
    ;Description
    LangString DESC_SecMerlin   ${LANG_ENGLISH} "Installs Base Merlin Platform"
    LangString DESC_SecDoc      ${LANG_ENGLISH} "Installs Merlin Documentation"
    LangString DESC_SecTutorial ${LANG_ENGLISH} "Installs Merlin Tutorial"
    LangString DESC_SecPlugins  ${LANG_ENGLISH} "Installs Maven Plugins"
    LangString DESC_SecService  ${LANG_ENGLISH} "Installs Merlin NT Service"
  
  ; LangString DESC_SecFacilities  ${LANG_ENGLISH} "Installs Maven Facilities"  
  
  ;--------------------------------
  ;Installer Sections
  
  Section "merlin base" SecMerlin
  
    SetOutPath $INSTDIR\bin
    File /r ..\target\merlin\bin\*
    SetOutPath $INSTDIR\config
    File /r ..\target\merlin\config\*
    SetOutPath $INSTDIR\system
    File /r ..\target\merlin\system\*
    SetOutPath $INSTDIR
    File  ..\target\merlin\README.txt
    File  ..\target\merlin\LICENSE.txt
    File  ..\target\merlin\INSTALL.txt
  
    Push "MERLIN_HOME"
    Push $INSTDIR
    Call WriteEnvStr
    
    Push $INSTDIR\bin
    Call AddToPath
  
    ;Store install folder
    WriteRegStr HKCU "Software\Merlin Platform 3.3" "" $INSTDIR
    
    ;Create uninstaller
    WriteUninstaller "$INSTDIR\Uninstall.exe"
  
  SectionEnd
  
  Section "plugins" SecPlugins
  
    Push $R0
  
    ReadEnvStr $R0 "MAVEN_HOME"
    IfFileExists "$R0\bin\maven.bat" MavenFound  MavenNotFound
    
    MavenFound:
      SetOutPath $R0\plugins
      File /r ..\target\merlin\plugins\avalon-meta\plugins\*
      File /r ..\target\merlin\plugins\avalon-util\plugins\*
      File /r ..\target\merlin\plugins\merlin\plugins\*
      Goto Done
  
    MavenNotFound:
      SetOutPath $INSTDIR\plugins
      File /r ..\target\merlin\plugins\*
  
    Done:
      Pop $R0
  
  SectionEND
  
  Section "docs" SecDoc
    SetOutPath $INSTDIR\docs
    File /r ..\target\docs\*
  SectionEND
  
  Section "tutorial" SecTutorial
    SetOutPath $INSTDIR\tutorials
    File /r ..\..\tutorials\target\tutorials\*
  SectionEND
  
  Section "merlin service" SecService
    Exec "$INSTDIR\bin\nt\Wrapper.exe -i $INSTDIR\bin\nt\wrapper.conf"
  SectionEND
  
  ;--------------------------------
  ;Descriptions
  
  !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
    !insertmacro MUI_DESCRIPTION_TEXT ${SecMerlin} $(DESC_SecMerlin)
    !insertmacro MUI_DESCRIPTION_TEXT ${SecDoc} $(DESC_SecDoc)
    !insertmacro MUI_DESCRIPTION_TEXT ${SecTutorial} $(DESC_SecTutorial)
    !insertmacro MUI_DESCRIPTION_TEXT ${SecPlugins} $(DESC_SecPlugins)
    !insertmacro MUI_DESCRIPTION_TEXT ${SecService} $(DESC_SecService)
  !insertmacro MUI_FUNCTION_DESCRIPTION_END
   
  ;--------------------------------
  ;Uninstaller Section
  
  Section "Uninstall"
  
    Exec "$INSTDIR\bin\nt\Wrapper.exe -r $INSTDIR\bin\nt\wrapper.conf"
  
    Push "MERLIN_HOME"
    Call un.DeleteEnvStr
  
    Push $INSTDIR\bin
    Call un.RemoveFromPath
    
    RMDir /r $INSTDIR
    
  SectionEnd
  
  ; todo:
  ;    Check for JVM and Version.  Install endorsed jars if needed
  ;      see  http://nsis.sourceforge.net/archive/nsisweb.php?page=543&instances=0
  ;    Check for if we are installing for one user or many
  ;    Install a default app that includes the facilities
  ;    Add desktop and start menu shortcuts (to what?)
  
  
  ; eof
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: cvs-unsubscribe@avalon.apache.org
For additional commands, e-mail: cvs-help@avalon.apache.org