lyx_mirror/development/Win32/packaging/installer/include/LaTeX.nsh
Uwe Stöhr 62cbf893d2 Windows installer: add 3 new features/bugfixes
As discussed with Vincent I added 3 new features:

* LyX can now also be installed over an existing installation of the same LyX version if the users really wants this.
(A message box appears recommending not to do so for test releases and when there are problems with an existing installation of the same release.)
* LyX can now also be installed if the uninstaller executable of a former LyX was accidentally deleted.
(That this case was not handled was more a bug. Thanks Vicent for the pointer.)
* If a user set MiKTeX's automatic package installation to "No" the installer will.
(As discussed with Vincent, if a user has disabled this MiKTeX feature he most probably know the consequences. So respect his decision.)
  respect that and not re-enable it.

I would be happy if anybody can spend a translation of the changed installer message.
2014-04-19 18:58:22 +02:00

396 lines
13 KiB
Plaintext

/*
LaTeX.nsh
Handling of LaTeX distributions
*/
# This script contains the following functions:
#
# - LaTeXActions (checks if MiKTeX or TeXLive is installed)
#
# - InstallMiKTeX (installs MiKTeX if not already installed),
# only for bunlde installer, uses:
# LaTeXCheck # function from LyXUtils.nsh
#
# - ConfigureMiKTeX
# (installs the LaTeX class files that are delivered with LyX,
# a Perl interpreter for splitindex and pdfcrop
# and enable MiKTeX's automatic package installation)
#
# - ConfigureTeXLive
# (installs the LaTeX class files that are delivered with LyX)
#
# - UpdateMiKTeX (asks to update MiKTeX)
# ---------------------------------------
Function LaTeXActions
# checks if MiKTeX or TeXLive is installed
StrCpy $Is64bit "false"
${if} ${RunningX64}
SetRegView 64 # the PATH is in the 64bit registry section
${endif}
# test if MiKTeX is installed
# reads the PATH variable via the registry because NSIS' "$%Path%" variable is not updated when the PATH changes
ReadRegStr $String HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path"
StrCpy $Search "miktex"
Call LaTeXCheck # sets the path to the latex.exe to $PathLaTeX # Function from LyXUtils.nsh
StrCpy $String $PathLaTeX
StrCpy $Search "x64" # search if it is 64bit MiKTeX
Call StrPoint # Function from LyXUtils.nsh
${if} $Pointer != "-1" # if something was found
StrCpy $Is64bit "true"
${endif}
# check for 32bit MiKTeX
${if} $PathLaTeX != ""
${andif} $Is64bit != "true"
${if} ${RunningX64}
SetRegView 32
${endif}
# check if MiKTeX 2.8 or newer is installed
StrCpy $0 0
loop32:
EnumRegKey $1 HKLM "SOFTWARE\MiKTeX.org\MiKTeX" $0 # check the last subkey
StrCmp $1 "" done32
StrCpy $String $1
IntOp $0 $0 + 1
Goto loop32
done32:
${if} $String == "2.8"
StrCpy $MiKTeXVersion "2.8"
StrCpy $LaTeXName "MiKTeX 2.8"
${endif}
${if} $String == "2.9"
StrCpy $MiKTeXVersion "2.9"
StrCpy $LaTeXName "MiKTeX 2.9"
${endif}
${endif}
# check for 64bit MiKTeX
${if} $LaTeXName == ""
${if} ${RunningX64}
SetRegView 64
${endif}
# check if MiKTeX 2.8 or newer is installed
StrCpy $0 0
loop64:
EnumRegKey $1 HKLM "SOFTWARE\MiKTeX.org\MiKTeX" $0 # check the last subkey
StrCmp $1 "" done64
StrCpy $String $1
IntOp $0 $0 + 1
Goto loop64
done64:
${if} $String == "2.8"
StrCpy $MiKTeXVersion "2.8"
StrCpy $LaTeXName "MiKTeX 2.8"
${endif}
${if} $String == "2.9"
StrCpy $MiKTeXVersion "2.9"
StrCpy $LaTeXName "MiKTeX 2.9"
${endif}
${endif}
${if} $PathLaTeX != ""
StrCpy $MiKTeXUser "HKLM" # needed later to configure MiKTeX
${else} # check if MiKTeX is installed only for the current user
${if} ${RunningX64}
SetRegView 64 # the PATH is in the 64bit registry section
${endif}
ReadRegStr $String HKCU "Environment" "Path"
StrCpy $Search "miktex"
Call LaTeXCheck # function from LyXUtils.nsh
${if} $PathLaTeX != ""
StrCpy $MiKTeXUser "HKCU"
${endif}
${endif}
${if} $LaTeXName == "" # check for the MiKTeX version
StrCpy $0 0
loopB:
EnumRegKey $1 HKCU "SOFTWARE\MiKTeX.org\MiKTeX" $0 # check the last subkey
StrCmp $1 "" doneB
StrCpy $String $1
IntOp $0 $0 + 1
Goto loopB
doneB:
${if} $String == "2.8"
StrCpy $MiKTeXVersion "2.8"
StrCpy $LaTeXName "MiKTeX 2.8"
${endif}
${if} $String == "2.9"
StrCpy $MiKTeXVersion "2.9"
StrCpy $LaTeXName "MiKTeX 2.9"
${endif}
${endif}
${if} $PathLaTeX != ""
StrCpy $String $PathLaTeX
StrCpy $Search "x64" # search if it is 64bit MiKTeX
Call StrPoint # Function from LyXUtils.nsh
${if} $Pointer != "-1" # if something was found
StrCpy $Is64bit "true"
${endif}
StrCpy $LaTeXInstalled "MiKTeX"
# on some installations the path ends with a "\" on some not
# therefore assure that we remove it if it exists
StrCpy $0 $PathLaTeX "" -1
${if} $0 == "\"
StrCpy $PathLaTeX "$PathLaTeX" -1 # delete "\"
${endif}
${endif}
# test if TeXLive is installed
# TeXLive can be installed so that it appears in the PATH variable and/or only as current user.
# The safest method is to first check for the PATH because this is independent of the TeXLive version.
${if} ${RunningX64}
SetRegView 64 # the PATH is in the 64bit registry section
${endif}
${if} $PathLaTeX == ""
ReadRegStr $String HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path"
StrCpy $Search "TeXLive"
Call LaTeXCheck # function from LyXUtils.nsh
${endif}
# check for the current user Path variable
${if} $PathLaTeX == ""
ReadRegStr $String HKCU "Environment" "Path"
StrCpy $Search "texlive"
StrCpy $2 "TeXLive"
Call LaTeXCheck # function from LyXUtils.nsh
${endif}
# check if it was installed to the system
${if} ${RunningX64}
SetRegView 32 # TeXLive is a 32bit application
${endif}
${if} $PathLaTeX == ""
ReadRegStr $String HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\TeXLive2012" "UninstallString"
${if} $String == ""
ReadRegStr $String HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\TeXLive2012" "UninstallString"
${endif}
${if} $String != ""
StrCpy $String $String -28 # remove '\tlpkg\installer\uninst.bat"'
StrCpy $String $String "" 1 # remove the leading quote
${endif}
StrCpy $PathLaTeX "$String\bin\win32"
# check if the latex.exe exists in the $PathLaTeX folder
!insertmacro FileCheck $5 "latex.exe" "$PathLaTeX" # macro from LyXUtils.nsh
${if} $5 == "False"
StrCpy $PathLaTeX ""
${endif}
${endif}
# finally set the name
${if} $PathLaTeX != ""
${andif} $LaTeXName != "MiKTeX 2.8"
${andif} $LaTeXName != "MiKTeX 2.9"
StrCpy $LaTeXInstalled "TeXLive"
ReadRegStr $String HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\TeXLive2012" "DisplayVersion"
${if} $String == ""
ReadRegStr $String HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\TeXLive2012" "DisplayVersion"
${endif}
${if} $String != ""
StrCpy $LaTeXName "TeXLive $String"
${else}
StrCpy $LaTeXName "TeXLive"
${endif}
${endif}
FunctionEnd
# -------------------------------------------
!if ${SETUPTYPE} == BUNDLE
Function InstallMiKTeX
# installs MiKTeX if not already installed
${if} $PathLaTeX == ""
# launch MiKTeX's installer
MessageBox MB_OK|MB_ICONINFORMATION "$(LatexInfo)" /SD IDOK
ExecWait ${MiKTeXInstall}
# test if MiKTeX is installed
Call LaTeXActions
${if} ${RunningX64}
SetRegView 32 # we install the 32bit version of MiKTeX
${endif}
${if} $PathLaTeX != ""
# special entry that it was installed together with LyX
# so that we can later uninstall it together with LyX
${if} $MiKTeXUser == "HKCU"
WriteRegStr HKCU "SOFTWARE\MiKTeX.org\MiKTeX" "OnlyWithLyX" "Yes${APP_SERIES_KEY}"
${else}
WriteRegStr HKLM "SOFTWARE\MiKTeX.org\MiKTeX" "OnlyWithLyX" "Yes${APP_SERIES_KEY}"
${endif}
StrCpy $LaTeXInstalled "MiKTeX"
StrCpy $MiKTeXVersion ${MiKTeXDeliveredVersion}
${else}
MessageBox MB_OK|MB_ICONSTOP "$(LatexError1)" /SD IDOK
SetOutPath $TEMP # to be able to delete the $INSTDIR
RMDir /r $INSTDIR
Abort
${endif} # endif $PathLaTeX != ""
${endif}
FunctionEnd
!endif # endif ${SETUPTYPE} == BUNDLE
# ------------------------------
Function ConfigureMiKTeX
# installs the LaTeX class files that are delivered with LyX,
# a Perl interpreter for splitindex and pdfcrop
# and enable MiKTeX's automatic package installation
# install LyX's LaTeX class and style files and a Perl interpreter
${if} $PathLaTeX != ""
${if} $MultiUser.Privileges == "Admin"
${orif} $MultiUser.Privileges == "Power"
${if} $Is64bit == "true"
StrCpy $PathLaTeXLocal "$PathLaTeX" -15 # delete "\miktex\bin\x64"
${else}
StrCpy $PathLaTeXLocal "$PathLaTeX" -11 # delete "\miktex\bin"
${endif}
${else}
StrCpy $PathLaTeXLocal "$APPDATA\MiKTeX\$MiKTeXVersion"
${endif}
# only install the LyX packages if they are not already installed
${ifnot} ${FileExists} "$PathLaTeXLocal\tex\latex\lyx\broadway.cls"
# dvipost
SetOutPath "$PathLaTeXLocal\tex\latex\dvipost"
File "${FILES_DVIPOST_PKG}\dvipost.sty"
# files in Resources\tex
SetOutPath "$PathLaTeXLocal\tex\latex\lyx"
CopyFiles /SILENT "$INSTDIR\Resources\tex\*.*" "$PathLaTeXLocal\tex\latex\lyx"
${endif}
# Belarusian support
${ifnot} ${FileExists} "$PathLaTeXLocal\tex\generic\babel\belarusian.ldf"
SetOutPath "$PathLaTeXLocal\tex\generic\babel"
File "${FILES_DVIPOST_PKG}\belarusian.ldf"
File "${FILES_DVIPOST_PKG}\belarusian.sty"
${endif}
# Hungarian support
# this is a replacement therefore do this in every case
SetOutPath "$PathLaTeXLocal\tex\generic\babel"
File "${FILES_DVIPOST_PKG}\magyar.ldf"
# install a Perl interpreter for splitindex and pdfcrop
SetOutPath "$INSTDIR"
# recursively copy all files under Perl
File /r "${FILES_PERL}"
# refresh MiKTeX's file name database (do this always to assure everything is in place)
${if} $MultiUser.Privileges != "Admin"
${andif} $MultiUser.Privileges != "Power"
# call the non-admin version
nsExec::ExecToLog "$PathLaTeX\initexmf --update-fndb"
${else}
${if} $MiKTeXUser != "HKCU" # call the admin version
nsExec::ExecToLog "$PathLaTeX\initexmf --admin --update-fndb"
${else}
nsExec::ExecToLog "$PathLaTeX\initexmf --update-fndb"
${endif}
${endif}
Pop $UpdateFNDBReturn # Return value
${endif} # end if $PathLaTeX != ""
# enable package installation without asking (1 = Yes, 0 = No, 2 = Ask me first) and
# if there is not package repository (MiKTeX's primary package repository) then set it
${if} ${RunningX64}
${andif} $Is64bit == "true"
SetRegView 64
${else}
SetRegView 32
${endif}
${if} $MiKTeXUser == "HKCU" # if only for current user
# if AutoInstall is set to "0" we can assume that this was set purposly since the default is "1"
ReadRegStr $2 HKCU "SOFTWARE\MiKTeX.org\MiKTeX\$MiKTeXVersion\MPM" "AutoInstall"
${if} $2 == "0"
Goto NoAutoInstall
${endif}
WriteRegStr HKCU "SOFTWARE\MiKTeX.org\MiKTeX\$MiKTeXVersion\MPM" "AutoInstall" "1"
ReadRegStr $1 HKCU "SOFTWARE\MiKTeX.org\MiKTeX\$MiKTeXVersion\MPM" "RemoteRepository"
${if} $1 == ""
WriteRegStr HKCU "SOFTWARE\MiKTeX.org\MiKTeX\$MiKTeXVersion\MPM" "RemoteRepository" "${MiKTeXRepo}"
WriteRegStr HKCU "SOFTWARE\MiKTeX.org\MiKTeX\$MiKTeXVersion\MPM" "RepositoryType" "remote"
${endif}
${else}
# if AutoInstall is set to "0" we can assume that this was set purposly since the default is "1"
ReadRegStr $2 HKLM "SOFTWARE\MiKTeX.org\MiKTeX\$MiKTeXVersion\MPM" "AutoInstall"
${if} $2 == "0"
Goto NoAutoInstall
${endif}
WriteRegStr HKLM "SOFTWARE\MiKTeX.org\MiKTeX\$MiKTeXVersion\MPM" "AutoInstall" "1"
ReadRegStr $1 HKLM "SOFTWARE\MiKTeX.org\MiKTeX\$MiKTeXVersion\MPM" "RemoteRepository"
${if} $1 == ""
WriteRegStr HKLM "SOFTWARE\MiKTeX.org\MiKTeX\$MiKTeXVersion\MPM" "RemoteRepository" "${MiKTeXRepo}"
WriteRegStr HKLM "SOFTWARE\MiKTeX.org\MiKTeX\$MiKTeXVersion\MPM" "RepositoryType" "remote"
${endif}
# we need to state that missing packages should be installed for all users too
WriteRegStr HKCU "SOFTWARE\MiKTeX.org\MiKTeX\$MiKTeXVersion\MPM" "AutoAdmin" "t"
${endif}
NoAutoInstall:
# update MiKTeX's package file list
ExecWait '$PathLaTeX\mpm.exe --update-fndb'
# we must return to 32bit because LyX is a 32bit application
SetRegView 32
FunctionEnd
# ------------------------------
Function ConfigureTeXLive
# installs the LaTeX class files that are delivered with LyX
# (TeXLive comes already with a Perl interpreter.)
${if} $PathLaTeX != ""
StrCpy $PathLaTeXLocal "$PathLaTeX" -10 # delete "\bin\win32"
# only install the LyX packages if they are not already installed
${ifnot} ${FileExists} "$PathLaTeXLocal\texmf-dist\tex\latex\lyx\broadway.cls"
# dvipost
SetOutPath "$PathLaTeXLocal\texmf-dist\tex\latex\dvipost"
File "${FILES_DVIPOST_PKG}\dvipost.sty"
# files in Resources\tex
SetOutPath "$PathLaTeXLocal\texmf-dist\tex\latex\lyx"
CopyFiles /SILENT "$INSTDIR\Resources\tex\*.*" "$PathLaTeXLocal\texmf-dist\tex\latex\lyx"
${endif}
${endif}
# update TeXLive's package file list
ExecWait '$PathLaTeX\texhash'
# update TeXLive
ExecWait '$PathLaTeX\tlmgr update --all'
FunctionEnd
# ------------------------------
Function UpdateMiKTeX
# asks to update MiKTeX
MessageBox MB_YESNO|MB_ICONINFORMATION "$(MiKTeXInfo)" /SD IDNO IDYES UpdateNow IDNO UpdateLater
UpdateNow:
# the update wizard is started by the miktex-update.exe
${if} $MultiUser.Privileges != "Admin"
${andif} $MultiUser.Privileges != "Power"
# call the non-admin version
ExecWait '"$PathLaTeX\internal\miktex-update.exe"'
${else}
${if} $MiKTeXUser != "HKCU" # call the admin version
ExecWait '"$PathLaTeX\internal\miktex-update_admin.exe"'
${else}
ExecWait '"$PathLaTeX\internal\miktex-update.exe"'
${endif}
${endif}
UpdateLater:
FunctionEnd