|
|
; NSIS Modern User Interface version 1.63
; Erlang OTP installation script based on "Start Menu Folder Selection
; Example Script"
; Original example written by Joost Verburg
; Modified for Erlang by Patrik
;
; %CopyrightBegin%
;
; Copyright Ericsson AB 2012. All Rights Reserved.
;
; The contents of this file are subject to the Erlang Public License,
; Version 1.1, (the "License"); you may not use this file except in
; compliance with the License. You should have received a copy of the
; Erlang Public License along with this software. If not, it can be
; retrieved online at http://www.erlang.org/.
;
; Software distributed under the License is distributed on an "AS IS"
; basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
; the License for the specific language governing rights and limitations
; under the License.
;
; %CopyrightEnd%
;
; Verbosity does not come naturally with MUI, have to set it back now and then.
!verbose 1
!define MUI_MANUALVERBOSE 1
!define OTP_PRODUCT "Erlang OTP"
!include "erlang.nsh" ; All release specific parameters come from this
Name "${OTP_PRODUCT} ${OTP_VERSION}"
!include "MUI.nsh"
!include "WordFunc.nsh"
!include "WinVer.nsh"
;--------------------------------
;Configuration
SetCompressor bzip2
Var MYTEMP
;Var MUI_TEMP
Var STARTMENU_FOLDER
!define MY_STARTMENUPAGE_REGISTRY_ROOT HKLM
!define MY_STARTMENUPAGE_REGISTRY_KEY "SOFTWARE\Ericsson\Erlang\${ERTS_VERSION}"
!define MY_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder"
;General
OutFile "${OUTFILEDIR}\otp_${WINTYPE}_${OTP_VERSION}.exe"
;Folder selection page
!if ${WINTYPE} == "win64"
InstallDir "$PROGRAMFILES64\erl${ERTS_VERSION}"
!else
InstallDir "$PROGRAMFILES\erl${ERTS_VERSION}"
!endif
;Remember install folder
InstallDirRegKey HKLM "SOFTWARE\Ericsson\Erlang\${ERTS_VERSION}" ""
; Set the default start menu folder
!if ${WINTYPE} == "win64"
!define MUI_STARTMENUPAGE_DEFAULTFOLDER "${OTP_PRODUCT} ${OTP_VERSION} (x64)"
!else
!define MUI_STARTMENUPAGE_DEFAULTFOLDER "${OTP_PRODUCT} ${OTP_VERSION}"
!endif
;--------------------------------
;Modern UI Configuration
!ifdef HAVE_CUSTOM_MODERN
!define MUI_UI "custom_modern.exe"
!endif
!define MUI_ICON "erlang_inst.ico"
!define MUI_UNICON "erlang_uninst.ico"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
; Registry keys where start menu folder is stored
!define MUI_STARTMENUPAGE_REGISTRY_ROOT ${MY_STARTMENUPAGE_REGISTRY_ROOT}
!define MUI_STARTMENUPAGE_REGISTRY_KEY "${MY_STARTMENUPAGE_REGISTRY_KEY}"
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "${MY_STARTMENUPAGE_REGISTRY_VALUENAME}"
!insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
;--------------------------------
;Languages
!insertmacro MUI_LANGUAGE "English"
;--------------------------------
;Language Strings
;Description
LangString DESC_SecErlang ${LANG_ENGLISH} "Erlang OTP."
LangString DESC_SecErlangDev ${LANG_ENGLISH} \
"Erlang OTP development environment (required)."
LangString DESC_SecErlangAssoc ${LANG_ENGLISH} \
"Erlang filetype associations (.erl, .hrl, .beam)."
!ifdef HAVE_DOCS
LangString DESC_SecErlangDoc ${LANG_ENGLISH} "Documentation."
!endif
!ifdef HAVE_REDIST_FILE
LangString DESC_SecMSRedist ${LANG_ENGLISH} "Microsoft redistributable C runtime libraries, these are mandatory for Erlang runtime and development. Always installed if not already present."
!endif
;--------------------------------
; WordFunc
!ifdef HAVE_REDIST_FILE
!insertmacro VersionCompare
!endif
;--------------------------------
;Installer Sections
!ifdef HAVE_REDIST_FILE
Section "Microsoft redistributable libraries." SecMSRedist
SetOutPath "$INSTDIR"
File "${TESTROOT}\${REDIST_EXECUTABLE}"
; Set back verbosity...
!verbose 1
; Run the setup program
IfSilent +3
ExecWait '"$INSTDIR\${REDIST_EXECUTABLE}"'
Goto +2
ExecWait '"$INSTDIR\${REDIST_EXECUTABLE}" /q'
!verbose 1
SectionEnd ; MSRedist
!endif
SubSection /e "Erlang" SecErlang
Section "Development" SecErlangDev
SectionIn 1 RO
SetOutPath "$INSTDIR"
File "${TESTROOT}\OTP_VERSION"
File "${TESTROOT}\Install.ini"
File "${TESTROOT}\Install.exe"
SetOutPath "$INSTDIR\releases"
File /r "${TESTROOT}\releases\"
SetOutPath "$INSTDIR\lib"
File /r "${TESTROOT}\lib\"
SetOutPath "$INSTDIR\erts-${ERTS_VERSION}"
File /r "${TESTROOT}\erts-${ERTS_VERSION}\"
SetOutPath "$INSTDIR\usr"
File /r "${TESTROOT}\usr\"
;Store install folder
WriteRegStr HKLM "SOFTWARE\Ericsson\Erlang\${ERTS_VERSION}" "" $INSTDIR
; Run the setup program
Exec '"$INSTDIR\Install.exe" -s'
; The startmenu stuff
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
; Set back verbosity...
!verbose 1
; Try to use the Common startmenu...
SetShellVarContext All
ClearErrors
CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER"
IfErrors 0 continue_create
;MessageBox MB_OK "Error creating file"
SetShellVarContext current
CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER"
continue_create:
CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Erlang.lnk" \
"$INSTDIR\bin\werl.exe"
!insertmacro MUI_STARTMENU_WRITE_END
; And once again, the verbosity...
!verbose 1
; Check that the registry could be written, we only check one key,
; but it should be sufficient...
ReadRegStr $MYTEMP ${MY_STARTMENUPAGE_REGISTRY_ROOT} "${MY_STARTMENUPAGE_REGISTRY_KEY}" "${MY_STARTMENUPAGE_REGISTRY_VALUENAME}"
StrCmp $MYTEMP "" 0 done_startmenu
; If startmenu was skipped, this might be unnecessary, but wont hurt...
WriteRegStr HKCU "Software\Ericsson\Erlang\${ERTS_VERSION}" \
"" $INSTDIR
WriteRegStr HKCU "${MY_STARTMENUPAGE_REGISTRY_KEY}" \
"${MY_STARTMENUPAGE_REGISTRY_VALUENAME}" \
"$STARTMENU_FOLDER"
done_startmenu:
;Create uninstaller
WriteUninstaller "$INSTDIR\Uninstall.exe"
WriteRegStr HKLM \
"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Erlang OTP ${OTP_VERSION} (${ERTS_VERSION})" \
"DisplayName" "Erlang OTP ${OTP_VERSION} (${ERTS_VERSION})"
WriteRegStr HKLM \
"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Erlang OTP ${OTP_VERSION} (${ERTS_VERSION})" \
"UninstallString" "$INSTDIR\Uninstall.exe"
WriteRegDWORD HKLM \
"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Erlang OTP ${OTP_VERSION} (${ERTS_VERSION})" \
"NoModify" 1
WriteRegDWORD HKLM \
"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Erlang OTP ${OTP_VERSION} (${ERTS_VERSION})" \
"NoRepair" 1
; Check that the registry could be written, we only check one key,
; but it should be sufficient...
ReadRegStr $MYTEMP HKLM \
"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Erlang OTP ${OTP_VERSION} (${ERTS_VERSION})" \
"NoRepair"
StrCmp $MYTEMP "" 0 done
; Now we're done if we are a superuser. If the registry stuff failed, we
; do the things below...
WriteRegStr HKCU \
"Software\Microsoft\Windows\CurrentVersion\Uninstall\Erlang OTP ${OTP_VERSION} (${ERTS_VERSION})" \
"DisplayName" "Erlang OTP ${OTP_VERSION} (${ERTS_VERSION})"
WriteRegStr HKCU \
"Software\Microsoft\Windows\CurrentVersion\Uninstall\Erlang OTP ${OTP_VERSION} (${ERTS_VERSION})" \
"UninstallString" "$INSTDIR\Uninstall.exe"
WriteRegDWORD HKCU \
"Software\Microsoft\Windows\CurrentVersion\Uninstall\Erlang OTP ${OTP_VERSION} (${ERTS_VERSION})" \
"NoModify" 1
WriteRegDWORD HKCU \
"Software\Microsoft\Windows\CurrentVersion\Uninstall\Erlang OTP ${OTP_VERSION} (${ERTS_VERSION})" \
"NoRepair" 1
done:
SectionEnd ; SecErlangDev
Section "Associations" SecErlangAssoc
;File /r "${TESTROOT}\usr\lib\icons"
; .erl
DeleteRegKey HKCR ".erl"
DeleteRegKey HKCR "ErlangSource"
WriteRegStr HKCR ".erl" "" "ErlangSource"
WriteRegStr HKCR "ErlangSource" "" "Erlang source file"
WriteRegStr HKCR "ErlangSource\shell\compile" "" "Compile"
WriteRegStr HKCR "ErlangSource\shell\compile\command" "" \
'"$INSTDIR\bin\erlc.exe" "%1"'
WriteRegStr HKCR "ErlangSource\DefaultIcon" "" \
$INSTDIR\usr\lib\icons\erl_icon.ico
; .hrl
DeleteRegKey HKCR ".hrl"
DeleteRegKey HKCR "ErlangHeader"
WriteRegStr HKCR ".hrl" "" "ErlangHeader"
WriteRegStr HKCR "ErlangHeader" "" "Erlang header file"
WriteRegStr HKCR "ErlangHeader\DefaultIcon" "" \
$INSTDIR\usr\lib\icons\hrl_icon.ico
; .beam
DeleteRegKey HKCR ".beam"
DeleteRegKey HKCR "ErlangBeam"
WriteRegStr HKCR ".beam" "" "ErlangBeam"
WriteRegStr HKCR "ErlangBeam" "" "Erlang beam code"
WriteRegStr HKCR "ErlangBeam\DefaultIcon" "" \
$INSTDIR\usr\lib\icons\beam_icon.ico
SearchPath $1 "write.exe"
StrCmp $1 "" writeNotFound
WriteRegStr HKCR "ErlangSource\shell" "" "Open"
WriteRegStr HKCR "ErlangSource\shell\open\command" "" \
'"$1" "%1"'
WriteRegStr HKCR "ErlangHeader\shell" "" "Open"
WriteRegStr HKCR "ErlangHeader\shell\open\command" "" \
'"$1" "%1"'
writeNotFound:
SectionEnd ; SecErlangAssoc
SubSectionEnd
!ifdef HAVE_DOCS
Section "Erlang Documentation" SecErlangDoc
SetOutPath "$INSTDIR"
File /r "${TESTROOT}\docs\*"
; The startmenu stuff
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
; Set back verbosity...
!verbose 1
; Try to use the Common startmenu...
SetShellVarContext All
ClearErrors
CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Erlang Documentation.lnk" \
"$INSTDIR\doc\index.html"
IfErrors 0 continue_create
;MessageBox MB_OK "Error creating file"
SetShellVarContext current
CreateShortCut \
"$SMPROGRAMS\$STARTMENU_FOLDER\Erlang Documentation.lnk" \
"$INSTDIR\doc\index.html"
continue_create:
!insertmacro MUI_STARTMENU_WRITE_END
; And once again, the verbosity...
!verbose 1
SectionEnd ; ErlangDoc
!endif
!ifdef HAVE_REDIST_FILE
Function DllVersionGoodEnough
IntCmp 0 $R0 normal0 normal0 negative0
normal0:
IntOp $R2 $R0 >> 16
Goto continue0
negative0:
IntOp $R2 $R0 & 0x7FFF0000
IntOp $R2 $R2 >> 16
IntOp $R2 $R2 | 0x8000
continue0:
IntOp $R3 $R0 & 0x0000FFFF
IntCmp 0 $R1 normal1 normal1 negative1
normal1:
IntOp $R4 $R1 >> 16
Goto continue1
negative1:
IntOp $R4 $R1 & 0x7FFF0000
IntOp $R4 $R4 >> 16
IntOp $R4 $R4 | 0x8000
continue1:
IntOp $R5 $R1 & 0x0000FFFF
StrCpy $2 "$R2.$R3.$R4.$R5"
${VersionCompare} $2 ${REDIST_DLL_VERSION} $R0
Return
FunctionEnd
Function .onInit
Var /GLOBAL archprefix
Var /GLOBAL sysnativedir
Var /GLOBAL winvermajor
Var /GLOBAL winverminor
SectionGetFlags 0 $MYTEMP
StrCmpS ${WINTYPE} "win64" +1 +4
StrCpy $archprefix "amd64"
StrCpy $sysnativedir "$WINDIR\sysnative"
Goto +3
StrCpy $archprefix "x86"
StrCpy $sysnativedir $SYSDIR
${WinVerGetMajor} $0
${WinVerGetMinor} $1
StrCpy $winvermajor $0
StrCpy $winverminor $1
IfFileExists $sysnativedir\${REDIST_DLL_NAME} MaybeFoundInSystemLbl
SearchSxSLbl:
IntCmp $winvermajor 6 WVCheckMinorLbl WVCheckDoneLbl NotFoundLbl
WVCheckMinorLbl:
IntCmp $winverminor 1 WVCheckDoneLbl WVCheckDoneLbl NotFoundLbl
WVCheckDoneLbl:
FindFirst $0 $1 $WINDIR\WinSxS\$archprefix*
LoopLbl:
StrCmp $1 "" NotFoundLbl
IfFileExists $WINDIR\WinSxS\$1\${REDIST_DLL_NAME} MaybeFoundInSxSLbl
FindNext $0 $1
Goto LoopLbl
MaybeFoundInSxSLbl:
GetDllVersion $WINDIR\WinSxS\$1\${REDIST_DLL_NAME} $R0 $R1
Call DllVersionGoodEnough
FindNext $0 $1
IntCmp 2 $R0 LoopLbl
Goto FoundLbl
MaybeFoundInSystemLbl:
GetDllVersion $sysnativedir\${REDIST_DLL_NAME} $R0 $R1
Call DllVersionGoodEnough
IntCmp 2 $R0 SearchSxSLbl
FoundLbl:
IntOp $MYTEMP $MYTEMP & 4294967294
SectionSetFlags 0 $MYTEMP
SectionSetText 0 "Microsoft DLL's (present)"
Return
NotFoundLbl:
IntOp $MYTEMP $MYTEMP | 16
SectionSetFlags 0 $MYTEMP
SectionSetText 0 "Microsoft DLL's (needed)"
Return
FunctionEnd
!endif
;Display the Finish header
;Insert this macro after the sections if you are not using a finish page
; !insertmacro MUI_SECTIONS_FINISHHEADER
;--------------------------------
;Descriptions
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${SecErlang} $(DESC_SecErlang)
!insertmacro MUI_DESCRIPTION_TEXT ${SecErlangDev} $(DESC_SecErlangDev)
!insertmacro MUI_DESCRIPTION_TEXT ${SecErlangAssoc} \
$(DESC_SecErlangAssoc)
!ifdef HAVE_DOCS
!insertmacro MUI_DESCRIPTION_TEXT ${SecErlangDoc} $(DESC_SecErlangDoc)
!endif
!ifdef HAVE_REDIST_FILE
!insertmacro MUI_DESCRIPTION_TEXT ${SecMSRedist} $(DESC_SecMSRedist)
!endif
!insertmacro MUI_FUNCTION_DESCRIPTION_END
;--------------------------------
;Uninstaller Section
Section "Uninstall"
RMDir /r "$INSTDIR"
;Remove shortcut
ReadRegStr $MYTEMP "${MY_STARTMENUPAGE_REGISTRY_ROOT}" \
"${MY_STARTMENUPAGE_REGISTRY_KEY}" \
"${MY_STARTMENUPAGE_REGISTRY_VALUENAME}"
StrCmp $MYTEMP "" 0 end_try
; Try HKCU instead...
ReadRegStr $MYTEMP "${MY_STARTMENUPAGE_REGISTRY_ROOT}" \
"${MY_STARTMENUPAGE_REGISTRY_KEY}" \
"${MY_STARTMENUPAGE_REGISTRY_VALUENAME}"
; If this failed to, we have no shortcuts (eh?)
StrCmp $MYTEMP "" noshortcuts
end_try:
SetShellVarContext All
ClearErrors
; If we cannot find the shortcut, switch to current user context
GetFileTime "$SMPROGRAMS\$MYTEMP\Erlang.lnk" $R1 $R2
IfErrors 0 continue_delete
;MessageBox MB_OK "Error removing file"
SetShellVarContext current
continue_delete:
Delete "$SMPROGRAMS\$MYTEMP\Erlang.lnk"
Delete "$SMPROGRAMS\$MYTEMP\Uninstall.lnk"
Delete "$SMPROGRAMS\$MYTEMP\Erlang Documentation.lnk"
RMDir "$SMPROGRAMS\$MYTEMP" ;Only if empty
noshortcuts:
; We delete both in HKCU and HKLM, we don't really know were they might be...
DeleteRegKey /ifempty HKLM "SOFTWARE\Ericsson\Erlang\${ERTS_VERSION}"
DeleteRegKey /ifempty HKCU "SOFTWARE\Ericsson\Erlang\${ERTS_VERSION}"
DeleteRegKey HKLM \
"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Erlang OTP ${OTP_VERSION} (${ERTS_VERSION})"
DeleteRegKey HKCU \
"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Erlang OTP ${OTP_VERSION} (${ERTS_VERSION})"
; Now remove shell/file associations we'we made...
; .erl
ReadRegStr $1 HKCR ".erl" ""
StrCmp $1 "ErlangSource" 0 NoOwnSource
ReadRegStr $1 HKCR "ErlangSource\DefaultIcon" ""
StrCmp $1 "$INSTDIR\usr\lib\icons\erl_icon.ico" 0 NoOwnSource
DeleteRegKey HKCR ".erl"
DeleteRegKey HKCR "ErlangSource"
NoOwnSource:
; .hrl
ReadRegStr $1 HKCR ".hrl" ""
StrCmp $1 "ErlangHeader" 0 NoOwnHeader
ReadRegStr $1 HKCR "ErlangHeader\DefaultIcon" ""
StrCmp $1 "$INSTDIR\usr\lib\icons\hrl_icon.ico" 0 NoOwnHeader
DeleteRegKey HKCR ".hrl"
DeleteRegKey HKCR "ErlangHeader"
NoOwnHeader:
; .beam
ReadRegStr $1 HKCR ".beam" ""
StrCmp $1 "ErlangBeam" 0 NoOwnBeam
ReadRegStr $1 HKCR "ErlangBeam\DefaultIcon" ""
StrCmp $1 "$INSTDIR\usr\lib\icons\beam_icon.ico" 0 NoOwnBeam
DeleteRegKey HKCR ".beam"
DeleteRegKey HKCR "ErlangBeam"
NoOwnBeam:
;Display the Finish header
; !insertmacro MUI_UNFINISHHEADER
SectionEnd
!verbose 3
|