diff options
Diffstat (limited to 'util/scripts/win-binary/nsis/includes/qtcommon.nsh')
-rw-r--r-- | util/scripts/win-binary/nsis/includes/qtcommon.nsh | 547 |
1 files changed, 547 insertions, 0 deletions
diff --git a/util/scripts/win-binary/nsis/includes/qtcommon.nsh b/util/scripts/win-binary/nsis/includes/qtcommon.nsh new file mode 100644 index 0000000..8ef8207 --- /dev/null +++ b/util/scripts/win-binary/nsis/includes/qtcommon.nsh @@ -0,0 +1,547 @@ +!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 DeleteFloatingLicenseProgram + exch $1 + push $0 + + StrCmp $LICENSE_KEY "" end + + ClearErrors + qtnsisext::IsFloatingLicense $LICENSE_KEY + IfErrors end + pop $0 + + StrCmp $0 "1" end + IfFileExists "$1\bin\qtusagereporter.exe" 0 end + Delete "$1\bin\qtusagereporter.exe" + + end: + pop $0 + pop $1 +FunctionEnd + +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 $0 ; Qt installation directory + Exch + Exch $1 ; Dll dir name: "bin", "lib"... + Push $2 ; FindFirst/FindNext handle + Push $3 ; Found QtCore*.dll file + + ${If} ${FileExists} "$0\bin\qmake.exe" + DetailPrint "Patching $0\bin\qmake.exe..." + Push $0 + Push "$0\bin\qmake.exe" + Call PatchBinaryPaths + ${EndIf} + + FindFirst $2 $3 "$0\$1\QtCore*.dll" + ${DoWhile} $3 != "" + Push $0 + Push "$0\$1\$3" + DetailPrint "Patching $0\$1\$3..." + Call PatchBinaryPaths + FindNext $2 $3 + ${Loop} + + Pop $3 + Pop $2 + Pop $1 + Pop $0 +FunctionEnd + +Function PatchBinaryPaths + exch $0 + exch + exch $2 + push $1 + + 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" + + pop $1 + pop $2 + pop $0 +FunctionEnd + +# Patching the prl files +Function PatchPrlFiles + Exch $0 ; Absolute path to where Qt is (being) installed + Exch + Exch $1 ; Absolute path to where Qt was built + Push $2 ; FindFirst/FindNext handle + Push $3 ; Found *.prl file name + + FindFirst $2 $3 "$0\lib\*.prl" + ${DoWhile} $3 != "" + Push "$0\lib\$3" + Push $1 + Push $0 + Call PatchPath + FindNext $2 $3 + ${Loop} + + Pop $3 + Pop $2 + Pop $1 + Pop $0 +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 + DetailPrint "Patching $1 ($2)..." + +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 + +# Sets $0 to 0, $1 to 1. Good for checking register breakages in function calls via dumpstate::debug +# Do not leave this in a release installer!!! +Function MarkAllRegisters + StrCpy $0 "0" + StrCpy $1 "1" + StrCpy $2 "2" + StrCpy $3 "3" + StrCpy $4 "4" + StrCpy $5 "5" + StrCpy $6 "6" + StrCpy $7 "7" + StrCpy $8 "8" + StrCpy $9 "9" + StrCpy $R0 "R0" + StrCpy $R1 "R1" + StrCpy $R2 "R2" + StrCpy $R3 "R3" + StrCpy $R4 "R4" + StrCpy $R5 "R5" + StrCpy $R6 "R6" + StrCpy $R7 "R7" + StrCpy $R8 "R8" + StrCpy $R9 "R9" +FunctionEnd + +!endif ;QTCOMMON_INCLUDE
\ No newline at end of file |