From 12abea9bc72cdc17d9f9f8ffc27f35a9cbc7d465 Mon Sep 17 00:00:00 2001 From: alfredoport Date: Thu, 27 Sep 2007 04:55:57 +0000 Subject: Add openaxiom.nsis script for Windows installer. --- contrib/ChangeLog | 6 + contrib/openaxiom.nsi | 543 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 549 insertions(+) create mode 100644 contrib/openaxiom.nsi (limited to 'contrib') diff --git a/contrib/ChangeLog b/contrib/ChangeLog index e69de29b..3ff07945 100644 --- a/contrib/ChangeLog +++ b/contrib/ChangeLog @@ -0,0 +1,6 @@ +2007-09-27 Alfredo Portes + Dan Martens + Bill Page + + * Add openaxiom.nsis script to create the + Windows installer for OpenAxiom. \ No newline at end of file diff --git a/contrib/openaxiom.nsi b/contrib/openaxiom.nsi new file mode 100644 index 00000000..e204fc60 --- /dev/null +++ b/contrib/openaxiom.nsi @@ -0,0 +1,543 @@ +#Axiom NSIS Install Script +#Written By: Dan Martens dan_martens@lycos.com +#Updated By: Bill Page bill.page1@sympatico.ca +#Updated By: Alfredo Portes alfredo.portes@gmail.com + +;-------------------------------- +;Include Modern UI +;-------------------------------- + !include "MUI.nsh" + !include "StrFunc.nsh" + !include "WinMessages.nsh" + +;-------------------------------- +;Axiom Variables +;-------------------------------- + Var AXIOM_TEMP + Var STARTMENU_FOLDER + Var AXIOMVAR + ${StrRep} + +;-------------------------------- +; Declare used functions +;-------------------------------- + + !verbose 3 + !ifdef ALL_USERS + !define WriteEnvStr_RegKey \ + 'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"' + !else + !define WriteEnvStr_RegKey 'HKCU "Environment"' + !endif + !verbose 4 + + ; Define your application name + !define APPNAME "OpenAxiom" + !define BUILD_VERSION "1.0.1" + !define APPNAMEANDVERSION "${APPNAME}-${BUILD_VERSION}" + + 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=$3;%PATH%$\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 "$0;$1" + 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 + 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 + 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 + +########################################### +# 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." + +;-------------------------------- +;General +;-------------------------------- + + InstType "Typical" + + Name "${APPNAMEANDVERSION}" + OutFile "OpenAxiom-${BUILD_VERSION}.exe" + + ;Default installation folder + InstallDir "$PROGRAMFILES\${APPNAME}" + + ;Get installation folder from registry if available + InstallDirRegKey HKLM "Software\${APPNAME}" "" + + ;Vista redirects $SMPROGRAMS to all users without this + RequestExecutionLevel admin + +;-------------------------------- +;Interface Settings +;-------------------------------- + + ;!define AXIOM_ABORTWARNING + +;-------------------------------- +;Pages +;-------------------------------- + + !define MUI_ABORTWARNING + !define MUI_FINISHPAGE_RUN "$INSTDIR\bin\AXIOMsys.exe" +; !define MUI_FINISHPAGE_LINK "Please donate to the Axiom Foundation" +; !define MUI_FINISHPAGE_LINK_LOCATION "http://axiom-developer.org/public/donate.html" + !insertmacro MUI_PAGE_WELCOME + !insertmacro MUI_PAGE_LICENSE "OpenAxiom\License.txt" + !insertmacro MUI_PAGE_COMPONENTS + !insertmacro MUI_PAGE_DIRECTORY + + ;Start Menu Folder Page Configuration + !define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU" + !define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\${APPNAME}" + !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder" + + !insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER + + !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 +;Set languages (first is default language) +;-------------------------------- + + !insertmacro MUI_LANGUAGE "English" + !insertmacro MUI_LANGUAGE "French" + !insertmacro MUI_LANGUAGE "German" + !insertmacro MUI_LANGUAGE "Russian" + !insertmacro MUI_LANGUAGE "Spanish" + !insertmacro MUI_LANGUAGE "TradChinese" + !insertmacro MUI_RESERVEFILE_LANGDLL + +;-------------------------------- +;Installer Section +;-------------------------------- + + Section "!OpenAxiom Core" Section1 + + SectionIn 1 2 RO + + ; Set Section properties + SetOverwrite on + + SetOutPath "$INSTDIR" + + File /r openaxiom\* + + ReadEnvStr $0 "USERPROFILE" ; + + ;Store installation folder + WriteRegStr HKCU "Software\OpenAxiom" "" $INSTDIR + + ;Create uninstaller + WriteUninstaller "$INSTDIR\Uninstall.exe" + + !insertmacro MUI_STARTMENU_WRITE_BEGIN Application + + CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER" + + CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\${APPNAME}.lnk" "$INSTDIR\bin\AXIOMsys.exe" "" "$INSTDIR\axiom.ico" + CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Uninstall.lnk" "$INSTDIR\Uninstall.exe" + CreateShortCut "$DESKTOP\OpenAxiom.lnk" "$INSTDIR\bin\AXIOMsys.exe" "" "$INSTDIR\axiom.ico" + + !insertmacro MUI_STARTMENU_WRITE_END + +SectionEnd + +Section /o "Documentation" Section2 + + SetOverwrite on + SetOutPath "$INSTDIR" + + File /r doc + + ;Shortcuts + CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Axiom Tutorial.lnk" "$INSTDIR\doc\tutorial.pdf" + CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Axiom Book.lnk" "$INSTDIR\doc\axiom-book2.pdf" + +SectionEnd +; Section /o "Source Code" Section3 + + ; Set Section properties +; SetOverwrite on + + ; Set Section Files and Shortcuts +; SetOutPath "$INSTDIR" + + ;File /r src + +;SectionEnd + Section -FinishSection + + ${StrRep} $AXIOMVAR "$INSTDIR" "\" "/" + Push "AXIOM" + Push "$AXIOMVAR" + Call WriteEnvStr + + ; in case of Start AXIOM from installer set AXIOM variable now + System::Call 'Kernel32::SetEnvironmentVariableA(t, t) i("AXIOM", "$AXIOMVAR").r0' + ReadEnvStr $0 "USERPROFILE" ; + SetOutPath "$0\My Documents" # sets the 'START IN' parameter + WriteRegStr HKLM "Software\${APPNAME}" "" "$INSTDIR" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "DisplayName" "${APPNAME}" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "UninstallString" "$INSTDIR\uninstall.exe" + WriteUninstaller "$INSTDIR\uninstall.exe" + +SectionEnd + +!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN + !insertmacro MUI_DESCRIPTION_TEXT ${Section1} "The main program files." + !insertmacro MUI_DESCRIPTION_TEXT ${Section2} "Program Documentation" +; !insertmacro MUI_DESCRIPTION_TEXT ${Section3} "Source code" +!insertmacro MUI_FUNCTION_DESCRIPTION_END + +Section -AddtoPath + Push "$INSTDIR\bin" + Call AddToPath +SectionEnd + +;-------------------------------- +;Uninstaller Section +;-------------------------------- + + Section "Uninstall" + + Delete "$INSTDIR\Uninstall.exe" + RMDir /r $INSTDIR + !insertmacro MUI_STARTMENU_GETFOLDER Application $AXIOM_TEMP + + Delete "$SMPROGRAMS\$AXIOM_TEMP\Uninstall.lnk" + Delete "$SMPROGRAMS\$AXIOM_TEMP\${APPNAME}.lnk" + Delete "$DESKTOP\${APPNAME}.lnk" + Delete "$SMPROGRAMS\$AXIOM_TEMP\Axiom Tutorial.lnk" + Delete "$SMPROGRAMS\$AXIOM_TEMP\Axiom Book.lnk" + + ;Delete empty start menu parent diretories + StrCpy $AXIOM_TEMP "$SMPROGRAMS\$AXIOM_TEMP" + + startMenuDeleteLoop: + ClearErrors + RMDir $AXIOM_TEMP + GetFullPathName $AXIOM_TEMP "$AXIOM_TEMP\.." + + IfErrors startMenuDeleteLoopDone + + StrCmp $AXIOM_TEMP $SMPROGRAMS startMenuDeleteLoopDone startMenuDeleteLoop + startMenuDeleteLoopDone: + + DeleteRegKey /ifempty HKCU "Software\${APPNAME}" + Push "$INSTDIR\bin" + + Call un.RemoveFromPath + # remove the variable + Push "AXIOM" + Call un.DeleteEnvStr + +SectionEnd + \ No newline at end of file -- cgit v1.2.3