tools/installer/nsis/includes/qtcommon.nsh
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 22 Jan 2010 10:32:13 +0200
changeset 1 ae9c8dab0e3e
parent 0 1918ee327afb
child 4 3b1da2848fc7
permissions -rw-r--r--
Revision: 201001 Kit: 201003

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
;; All rights reserved.
;; Contact: Nokia Corporation (qt-info@nokia.com)
;;
;; This file is part of the tools applications of the Qt Toolkit.
;;
;; $QT_BEGIN_LICENSE:LGPL$
;; No Commercial Usage
;; This file contains pre-release code and may not be distributed.
;; You may use this file in accordance with the terms and conditions
;; contained in the Technology Preview License Agreement accompanying
;; this package.
;;
;; GNU Lesser General Public License Usage
;; Alternatively, this file may be used under the terms of the GNU Lesser
;; General Public License version 2.1 as published by the Free Software
;; Foundation and appearing in the file LICENSE.LGPL included in the
;; packaging of this file.  Please review the following information to
;; ensure the GNU Lesser General Public License version 2.1 requirements
;; will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
;;
;; In addition, as a special exception, Nokia gives you certain additional
;; rights.  These rights are described in the Nokia Qt LGPL Exception
;; version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
;;
;; If you have questions regarding the use of this file, please contact
;; Nokia at qt-info@nokia.com.
;;
;;
;;
;;
;;
;;
;;
;;
;; $QT_END_LICENSE$
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
!ifndef QTCOMMON_INCLUDE
!define QTCOMMON_INCLUDE

!macro MakeQtDirectory UN
Function ${UN}MakeQtDirectory
  exch $0

  push $0
  push " "  #replace
  push "-" #with
  call ${UN}ReplaceString
  pop $0

  push $0
  push "("  #replace
  push "" #with
  call ${UN}ReplaceString
  pop $0

  push $0
  push ")"  #replace
  push "" #with
  call ${UN}ReplaceString
  pop $0

  exch $0
FunctionEnd
!macroend
!insertmacro MakeQtDirectory ""
!insertmacro MakeQtDirectory "un."

Function AddStartmenuApplication
  exch $0
  IfFileExists "$0\assistant.exe" 0 +2
    CreateShortCut "$SMPROGRAMS\$STARTMENU_STRING\Assistant.lnk" "$0\assistant.exe"
  IfFileExists "$0\designer.exe" 0 +2
    CreateShortCut "$SMPROGRAMS\$STARTMENU_STRING\Designer.lnk" "$0\designer.exe"
  IfFileExists "$0\linguist.exe" 0 +2
    CreateShortCut "$SMPROGRAMS\$STARTMENU_STRING\Linguist.lnk" "$0\linguist.exe"
  IfFileExists "$0\qtdemo.exe" 0 +2
    CreateShortCut "$SMPROGRAMS\$STARTMENU_STRING\Examples and Demos.lnk" "$0\qtdemo.exe"
  IfFileExists "$0\..\README" 0 ReadMeShortCutFinished
    IfFileExists "$WINDIR\notepad.exe" +3
      CreateShortCut "$SMPROGRAMS\$STARTMENU_STRING\Qt Readme.lnk" "$SYSDIR\notepad.exe" "$0\..\README"
    goto ReadMeShortCutFinished
      CreateShortCut "$SMPROGRAMS\$STARTMENU_STRING\Qt Readme.lnk" "$WINDIR\notepad.exe" "$0\..\README"
  ReadMeShortCutFinished:
  pop $0
FunctionEnd

Function un.RemoveStartmenuApplication
  Delete "$SMPROGRAMS\$STARTMENU_STRING\Assistant.lnk"
  Delete "$SMPROGRAMS\$STARTMENU_STRING\Designer.lnk"
  Delete "$SMPROGRAMS\$STARTMENU_STRING\Linguist.lnk"
  Delete "$SMPROGRAMS\$STARTMENU_STRING\Examples and Demos.lnk"
  Delete "$SMPROGRAMS\$STARTMENU_STRING\Qt Readme.lnk"
FunctionEnd

#patch the licence information
Function PatchLicenseInformation
  exch $0
  push $1
  push $2
  
  DetailPrint "Patching license information..."

  IfFileExists "$0\src\corelib\global\qconfig.h" 0 +3
  strcpy $2 "$0\src\corelib\global\qconfig.h"
  goto PatchLicensee

  IfFileExists "$0\include\Qt\qconfig.h" 0 PatchConfigPriFile
  strcpy $2 "$0\include\Qt\qconfig.h"

  PatchLicensee:
  push $2
  push '#define QT_PRODUCT_LICENSEE "'
  push '#define QT_PRODUCT_LICENSEE "$LICENSEE"$\r$\n'
  call PatchLine

  push $2
  push '#define QT_PRODUCT_LICENSE "'
  push '#define QT_PRODUCT_LICENSE "$LICENSE_PRODUCT"$\r$\n'
  call PatchLine

  push $2
  ${StrCase} $1 "$LICENSE_PRODUCT" "U"
  push '#  define QT_EDITION QT_EDITION_'
  push '#  define QT_EDITION QT_EDITION_$1$\r$\n'
  call PatchLine
  
  PatchConfigPriFile:
  IfFileExists "$0\mkspecs\qconfig.pri" 0 PatchLicenseProductDone
  push "$0\mkspecs\qconfig.pri"
  push "QT_EDITION = "
  push "QT_EDITION = $LICENSE_PRODUCT$\r$\n"
  call PatchLine

  PatchLicenseProductDone:
  pop $2
  pop $1
  pop $0
FunctionEnd

Function PatchCommonBinaryFiles
  exch $2
  push $0
  push $1

  IfFileExists "$2\bin\qmake.exe" 0 +5
  DetailPrint "Patching paths in qmake..."
  push $2
  push "$2\bin\qmake.exe"
  call PatchBinaryPaths

  DetailPrint "Patching paths in core..."
  FindFirst $0 $1 "$2\bin\QtCore*.dll"
  StrCmp $1 "" ErrorPatching
  push $2
  push "$2\bin\$1"
  call PatchBinaryPaths

  FindNext $0 $1
  StrCmp $1 "" ErrorPatching
  push $2
  push "$2\bin\$1"
  call PatchBinaryPaths

  ErrorPatching:

  pop $1
  pop $0
  pop $2
FunctionEnd

Function PatchBinaryPaths
  exch $0
  exch
  exch $2
  push $1

!ifndef OPENSOURCE_BUILD
  qtnsisext::PatchBinary /NOUNLOAD $0 "qt_prfxpath=" "qt_prfxpath=$2"
  qtnsisext::PatchBinary /NOUNLOAD $0 "qt_docspath=" "qt_docspath=$2\doc"
  qtnsisext::PatchBinary /NOUNLOAD $0 "qt_hdrspath=" "qt_hdrspath=$2\include"
  qtnsisext::PatchBinary /NOUNLOAD $0 "qt_libspath=" "qt_libspath=$2\lib"
  qtnsisext::PatchBinary /NOUNLOAD $0 "qt_binspath=" "qt_binspath=$2\bin"
  qtnsisext::PatchBinary /NOUNLOAD $0 "qt_plugpath=" "qt_plugpath=$2\plugins"
  qtnsisext::PatchBinary /NOUNLOAD $0 "qt_datapath=" "qt_datapath=$2"
  qtnsisext::PatchBinary /NOUNLOAD $0 "qt_trnspath=" "qt_trnspath=$2\translations"
  qtnsisext::PatchBinary /NOUNLOAD $0 "qt_xmplpath=" "qt_xmplpath=$2\examples"
!ifdef MODULE_LICENSECHECK
  qtnsisext::PatchBinary /NOUNLOAD $0 "qt_lcnsuser=" "qt_lcnsuser=$LICENSEE"
  qtnsisext::PatchBinary /NOUNLOAD $0 "qt_lcnsprod=" "qt_lcnsprod=$LICENSE_PRODUCT"
!endif
  qtnsisext::PatchBinary $0 "qt_demopath=" "qt_demopath=$2\demos"
!endif

  pop $1
  pop $2
  pop $0
FunctionEnd

#patching the prl files
Function PatchPrlFiles
  exch $2
  exch
  exch $3 ;buildDir
  push $0
  push $1

  FindFirst $0 $1 "$2\lib\*.prl"
  loop:
    StrCmp $1 "" done
    DetailPrint "Patching $1..."

    push "$2\lib\$1"
    push $3
    push $2
    call PatchPath

    FindNext $0 $1
    Goto loop
  done:
  pop $1
  pop $0
  pop $3
  pop $2
FunctionEnd

#
# patch line in text files
# push "qtcore4.prl"  #Filename
# push "#define ..." #START WITH
# push "c:\qt"  #REPLACE WITH
# call PatchLine
#
Function PatchLine
  exch $2 ;replacement line
  exch 2
  exch $1 ;Filename
  exch
  exch $0 ;start with
  push $3 ; tmp filename
  push $4 ; handle (tmp)
  push $5 ; handle (org)
  push $6 ; string

  ClearErrors
  GetTempFileName $3
  IfErrors done
  FileOpen $4 $3 w
  IfErrors done
  FileOpen $5 $1 r
  IfErrors done

nextline:
  FileRead $5 $6
  IfErrors renameFile
  push $6
  push $0
  push $2
  call ReplaceLine
  pop $6
  FileWrite $4 $6
  goto nextline

renameFile:
  FileClose $4
  FileClose $5
  SetDetailsPrint none
  Delete $1
  Rename $3 $1
  SetDetailsPrint both

  done:
  pop $6
  pop $5
  pop $4
  pop $3
  pop $0
  pop $1
  pop $2
FunctionEnd

#
# replaces a string that starts with something, with another string
# push string
# push "#define ..." #START WITH
# push "c:\qt"  #REPLACE WITH
# call ReplaceLine
# pop $0 #new string
#
Function ReplaceLine
  exch $2 ;new line
  exch 2
  exch $1 ;string
  exch
  exch $0 ;start with

  push $3 ; tmp string
  push $4 ; counter
  push $5 ; strlen

  StrCpy $4 "-1"
  StrLen $5 $1

  loop:
  IntOp $4 $4 + 1 ;increase counter
  StrCpy $3 $1 $4 ;get substring
  IntCmp $4 $5 copystring ; check for end
  StrCmp $3 $0 done ;start with found
  goto loop

  copystring:
  StrCpy $2 $1
  goto done

  done:
  pop $5
  pop $4
  pop $3
  pop $0
  pop $1
  exch $2
FunctionEnd

#
# patch paths in text files
# push "qtcore4.prl"  #Filename
# push "c:\compile" #OLD_QTDIR
# push "c:\qt"  #QTDIR
# call PatchPath
#
Function PatchPath
  exch $2 ;NEW
  exch 2
  exch $1 ;Filename
  exch
  exch $0 ;OLD
  push $3 ;readline
  push $4 ;file 1
  push $5 ;file 2
  push $6 ;tmpfilename

  push $7 ;forward slash NEW
  push $8 ;forward slash OLD

  push $2
  push "\"
  push "/"
  call ReplaceString
  pop $7

  push $0
  push "\"
  push "/"
  call ReplaceString
  pop $8

  ClearErrors
  GetTempFileName $6
  IfErrors done
  FileOpen $5 $6 w
  IfErrors done
  FileOpen $4 $1 r
  IfErrors done

nextline:
  FileRead $4 $3
  IfErrors renameFile
  push $3
  push $0
  push $2
  call ReplaceString ;replace backward slash path
  push $8
  push $7
  call ReplaceString ;replace forward slash path
  pop $3
  FileWrite $5 $3
  goto nextline

renameFile:
  FileClose $5
  FileClose $4
  SetDetailsPrint none
  Delete $1
  Rename $6 $1
  SetDetailsPrint both

done:
  pop $8
  pop $7
  pop $6
  pop $5
  pop $4
  pop $3
  pop $0
  pop $1
  pop $2
FunctionEnd

#
# replaces a string with another string
# push string
# push "c:\qt"  #replace
# push "c:\compile" #with
# call ReplaceString
# pop $0 #new string
#
!macro ReplaceString UN
Function ${UN}ReplaceString
  exch $2 ;NEW
  exch 2
  exch $1 ;string
  exch
  exch $0 ;OLD

  push $3 ; tmp string
  push $4 ; counter
  push $5 ; result

  push $6 ; old strlen

  StrCpy $4 "-1"
  StrCpy $5 ""

  StrLen $6 $0

  loop:
  IntOp $4 $4 + 1 ;increase counter
  StrCpy $3 $1 $6 $4 ;get substring
  StrCmp $3 "" done ; check for end
  StrCmp $3 $0 replace ;replace if old
  StrCpy $3 $1 "1" $4
  StrCpy $5 $5$3 ;append character to result
  goto loop

  replace:
  StrCpy $5 $5$2 ;insert new qtdir
  IntOp $4 $4 + $6 ;increase offset
  IntOp $4 $4 - 1 ;decrease offset one more
  goto loop

  done:
  StrCpy $2 $5
  pop $6
  pop $5
  pop $4
  pop $3
  pop $0
  pop $1
  exch $2
FunctionEnd
!macroend
!insertmacro ReplaceString ""
!insertmacro ReplaceString "un."

Function CommonCheckDirectory
  exch $4
  exch
  exch $5
  push $0
  push $1
  push $2
  push $3

  ; check if qt is already installed
  IfFileExists "$4\bin\qmake.exe" 0 +2
  IfFileExists "$4\uninst.exe" qtExistsError
  
  ; check if directory is empty
  FindFirst $0 $1 "$4\*"
  CommonCheckDirectory_FileSearchLoop:
    StrCmp $1 "" CommonCheckDirectory_DirDoesNotExist
    StrCmp $1 "." CommonCheckDirectory_ContinueSearchLoop
    StrCmp $1 ".." CommonCheckDirectory_ContinueSearchLoop
    goto CommonCheckDirectory_FoundFile
    CommonCheckDirectory_ContinueSearchLoop:
    FindNext $0 $1
    goto CommonCheckDirectory_FileSearchLoop

CommonCheckDirectory_FoundFile:
  FindClose $0
  MessageBox MB_YESNO|MB_ICONEXCLAMATION "This directory already has contents. Are you sure you want to use this directory?" IDYES CommonCheckDirectory_DirDoesNotExist
  Goto errorInDirectory
CommonCheckDirectory_DirDoesNotExist:
  FindClose $0

  GetInstDirError $0
  IntCmp 0 $0 0 instDirError

  StrLen $0 $4

!ifdef USE_NODIRLENGTHCHECK
  StrCpy $1 "400"
!else
  StrLen $1 $5
!endif

  IntCmp $1 $0 0 directoryToLong

  ;check for spaces
  StrCpy $2 "-1"
  StrCpy $3 ""

  loop:
  IntOp $2 $2 + 1 ;increase counter
  StrCpy $3 $4 "1" $2 ;get char
  StrCmp $3 "" directoryOk ; check for end
  StrCmp $3 " " spaceInDirectory ;check for space
  goto loop

qtExistsError:
  MessageBox MB_OK|MB_ICONEXCLAMATION "Qt is already installed in this directory. Please uninstall the previous version and try again."
  Goto errorInDirectory

instDirError:
  MessageBox MB_OK|MB_ICONEXCLAMATION "This is not a valid installation directory."
  Goto errorInDirectory

spaceInDirectory:
  MessageBox MB_OK|MB_ICONEXCLAMATION "The installation path can't contain spaces."
  Goto errorInDirectory

directoryToLong:
  MessageBox MB_OK|MB_ICONEXCLAMATION "The installation directory is to long."
  Goto errorInDirectory

errorInDirectory:
  pop $3
  pop $2
  pop $1
  pop $0
  pop $5
  pop $4
  Abort
  goto done

directoryOk:
  pop $3
  pop $2
  pop $1
  pop $0
  pop $5
  pop $4
done:
FunctionEnd

!endif ;QTCOMMON_INCLUDE