From 1e2378efc303a35f8f3e281d7d78a3cc6a1f207a Mon Sep 17 00:00:00 2001 From: Daniel Masato Date: Fri, 8 May 2020 11:29:30 +0100 Subject: [PATCH 1/4] Port Windows deployment script from batch to Powershell The Powershell script provides the following improvements: - Automatic download of Jamulus dependencies (ASIOSDK, NSIS installer) - Automatic detection of Visual Studio/Build Tools installation (version 2017 and above) - Application packaging using Qt deployment tooling (windeployqt) - Easy execution from a standard Command Prompt as: powershell windows\deploy_windows.ps1 "" --- windows/deploy_windows.bat | 72 ------------- windows/deploy_windows.ps1 | 209 +++++++++++++++++++++++++++++++++++++ 2 files changed, 209 insertions(+), 72 deletions(-) delete mode 100755 windows/deploy_windows.bat create mode 100644 windows/deploy_windows.ps1 diff --git a/windows/deploy_windows.bat b/windows/deploy_windows.bat deleted file mode 100755 index 16c315622f..0000000000 --- a/windows/deploy_windows.bat +++ /dev/null @@ -1,72 +0,0 @@ -@echo off - -rem To set up a new Qt and Visual Studio version -rem - set environment path variable to the correct Qt bin directories: -rem - QTDIR32: points to the Qt 32 bit binaries, e.g., C:\Qt\5.10.1\msvc2015 -rem - QTDIR64: points to the Qt 64 bin binaries, e.g., C:\Qt\5.10.1\msvc2015_64 -rem - if using Visual Studio Express version, download the redistributable (it is not automatically there) -rem - change the Qt distribute dll names in the installer.nsi file (some contain version numbers) - -rem settings and check --------------------------------------------------------- -set NSIS_PATH=%PROGRAMFILES(x86)%\NSIS -set VS_REDIST32_EXE=vc_redist.x86.exe -set VS_REDIST64_EXE=VC_redist.x64.exe - -if "%VSINSTALLDIR%" == "" goto vsenvproblem -if "%QTDIR32%" == "" goto qtdirproblem -if "%QTDIR64%" == "" goto qtdirproblem -cd .. - - -rem ########################## 32 bit build #################################### -set QTDIR=%QTDIR32% -set Path=%QTDIR32%\bin;%Path% -rem create visual studio project file ------------------------------------------ -qmake -tp vc -spec win32-msvc - -rem TODO qmake seems to use the incorrect VS version to create the project file. -rem As a quick hack I simply replace the toolset version which seems to work. -powershell -Command "(gc jamulus.vcxproj) -replace 'v141', 'v140' | Out-File -encoding ASCII jamulus.vcxproj" -powershell -Command "(gc jamulus.vcxproj) -replace 'x64', 'Win32' | Out-File -encoding ASCII jamulus.vcxproj" -powershell -Command "(gc jamulus.vcxproj) -replace ';WIN64', '' | Out-File -encoding ASCII jamulus.vcxproj" -powershell -Command "(gc jamulus.vcxproj) -replace '-DWIN64 ', '' | Out-File -encoding ASCII jamulus.vcxproj" - -rem clean and compile solution ------------------------------------------------- -devenv Jamulus.vcxproj /Clean "Release|x86" -devenv Jamulus.vcxproj /Build "Release|x86" -mkdir release\x86 -copy release\Jamulus.exe release\x86\ - - -rem ########################## 64 bit build #################################### -set QTDIR=%QTDIR64% -set Path=%QTDIR64%\bin;%Path% - -rem create visual studio project file ------------------------------------------ -qmake -tp vc - -rem TODO qmake seems to use the incorrect VS version to create the project file. -rem As a quick hack I simply replace the toolset version which seems to work. -powershell -Command "(gc jamulus.vcxproj) -replace 'v141', 'v140' | Out-File -encoding ASCII jamulus.vcxproj" - -rem clean and compile solution ------------------------------------------------- -devenv Jamulus.vcxproj /Clean "Release|x64" -devenv Jamulus.vcxproj /Build "Release|x64" - - -rem ########################## create installer ################################ -cd windows -"%NSIS_PATH%\makensis.exe" installer.nsi -move Jamulusinstaller.exe ../deploy/Jamulus-version-installer.exe -goto endofskript - - -:vsenvproblem -echo Use the Visual Studio x86 x64 Cross Tools Command Prompt to call this skript -goto endofskript - -:qtdirproblem -echo The QTDIR32 and QTDIR64 is not set, please set these environment variables correclty before calling this script -goto endofskript - -:endofskript diff --git a/windows/deploy_windows.ps1 b/windows/deploy_windows.ps1 new file mode 100644 index 0000000000..7b7bbdefa7 --- /dev/null +++ b/windows/deploy_windows.ps1 @@ -0,0 +1,209 @@ +param( + # Replace default path with system Qt installation folder if necessary + [string] $QtInstallPath = "C:\Qt\5.12.3" +) + +# Global constants +$RootPath = "$PWD" +$BuildPath = "$RootPath\build" +$DeployPath = "$RootPath\deploy" +$WindowsPath ="$RootPath\windows" +$AppName = "Jamulus" + +# Stop at all errors +$ErrorActionPreference = "Stop" + +# Execute native command with errorlevel handling +Function Execute-Native-Command { + Param( + [string] $Command, + [string[]] $Arguments + ) + + & "$Command" @Arguments + + if ($LastExitCode -Ne 0) + { + Throw "Native command $Command returned with exit code $LastExitCode" + } +} + +# Cleanup existing build folders +Function Clean-Build-Environment +{ + if (Test-Path -Path $BuildPath) { Remove-Item -Path $BuildPath -Recurse -Force } + if (Test-Path -Path $DeployPath) { Remove-Item -Path $DeployPath -Recurse -Force } + + New-Item -Path $BuildPath -ItemType Directory + New-Item -Path $DeployPath -ItemType Directory +} + +# Download and uncompress dependency in ZIP format +Function Install-Dependency +{ + param( + [Parameter(Mandatory=$true)] + [string] $Uri, + [Parameter(Mandatory=$true)] + [string] $Name, + [Parameter(Mandatory=$true)] + [string] $Destination + ) + + if (Test-Path -Path "$WindowsPath\$Destination") { return } + + $TempFileName = [System.IO.Path]::GetTempFileName() + ".zip" + Invoke-WebRequest -Uri $Uri -OutFile $TempFileName + Expand-Archive -Path $TempFileName -DestinationPath $Env:TEMP -Force + Move-Item -Path "$Env:TEMP\$Name" -Destination "$WindowsPath\$Destination" -Force + Remove-Item -Path $TempFileName -Force +} + +# Install VSSetup (Visual Studio detection), ASIO SDK and NSIS Installer +Function Install-Dependencies +{ + Install-PackageProvider -Name "Nuget" -Scope CurrentUser -Force + Install-Module -Name "VSSetup" -Scope CurrentUser -Force + Install-Dependency -Uri "http://www.steinberg.net/sdk_downloads/ASIOSDK2.3.2.zip" ` + -Name "ASIOSDK2.3.2" -Destination "ASIOSDK2" + Install-Dependency -Uri "https://netix.dl.sourceforge.net/project/nsis/NSIS%203/3.05/nsis-3.05.zip" ` + -Name "nsis-3.05" -Destination "NSIS" +} + +# Setup environment variables and build tool paths +Function Setup-Build-Environment +{ + param( + [Parameter(Mandatory=$true)] + [string] $QtInstallPath, + [Parameter(Mandatory=$true)] + [string] $BuildArch + ) + + # Look for Visual Studio/Build Tools 2017 or later (version 15.0 or above) + $VsInstallPath = Get-VSSetupInstance | ` + Select-VSSetupInstance -Product "*" -Version "15.0" -Latest | ` + Select-Object -ExpandProperty "InstallationPath" + + if ($VsInstallPath -Eq "") { $VsInstallPath = "" } + + if ($BuildArch -Eq "x86_64") + { + $VcVarsBin = "$VsInstallPath\VC\Auxiliary\build\vcvars64.bat" + $QtMsvcSpecPath = "$QtInstallPath\msvc2017_64\bin" + } + else + { + $VcVarsBin = "$VsInstallPath\VC\Auxiliary\build\vcvars32.bat" + $QtMsvcSpecPath = "$QtInstallPath\msvc2017\bin" + } + + # Setup Qt executables paths for later calls + Set-Item Env:QtQmakePath "$QtMsvcSpecPath\qmake.exe" + Set-Item Env:QtWinDeployPath "$QtMsvcSpecPath\windeployqt.exe" + + "" + "**********************************************************************" + "Using Visual Studio/Build Tools environment settings located at" + $VcVarsBin + "**********************************************************************" + "" + "**********************************************************************" + "Using Qt binaries for Visual C++ located at" + $QtMsvcSpecPath + "**********************************************************************" + "" + + if (-Not (Test-Path -Path $VcVarsBin)) + { + Throw "Microsoft Visual Studio ($BuildArch variant) is not installed. " + ` + "Please install Visual Studio 2017 or above it before running this script." + } + + if (-Not (Test-Path -Path $Env:QtQmakePath)) + { + Throw "The Qt binaries for Microsoft Visual C++ 2017 (msvc2017) could not be located. " + ` + "Please install Qt with support for MSVC 2017 before running this script," + ` + "then call this script with the Qt install location, for example C:\Qt\5.12.3" + } + + # Import environment variables set by vcvarsXX.bat into current scope + $EnvDump = [System.IO.Path]::GetTempFileName() + Execute-Native-Command -Command "cmd" ` + -Arguments ("/c", "`"$VcVarsBin`" && set > `"$EnvDump`"") + + foreach ($_ in Get-Content -Path $EnvDump) + { + if ($_ -Match "^([^=]+)=(.*)$") + { + Set-Item "Env:$($Matches[1])" $Matches[2] + } + } + + Remove-Item -Path $EnvDump -Force +} + +# Build Jamulus x86_64 and x86 +Function Build-App +{ + param( + [Parameter(Mandatory=$true)] + [string] $BuildConfig, + [Parameter(Mandatory=$true)] + [string] $BuildArch + ) + + Execute-Native-Command -Command "$Env:QtQmakePath" ` + -Arguments ("$RootPath\$AppName.pro", "CONFIG+=$BuildConfig $BuildArch", ` + "-o", "$BuildPath\Makefile") + + Set-Location -Path $BuildPath + Execute-Native-Command -Command "nmake" -Arguments ("$BuildConfig") + Execute-Native-Command -Command "$Env:QtWinDeployPath" ` + -Arguments ("--$BuildConfig", "--compiler-runtime", "--dir=$DeployPath\$BuildArch", + "$BuildPath\$BuildConfig\$AppName.exe") + + Move-Item -Path "$BuildPath\$BuildConfig\$AppName.exe" -Destination "$DeployPath\$BuildArch" -Force + Execute-Native-Command -Command "nmake" -Arguments ("clean") + Set-Location -Path $RootPath +} + +# Build and deploy Jamulus 64bit and 32bit variants +function Build-App-Variants +{ + param( + [Parameter(Mandatory=$true)] + [string] $QtInstallPath + ) + + foreach ($_ in ("x86_64", "x86")) + { + $OriginalEnv = Get-ChildItem Env: + Setup-Build-Environment -QtInstallPath $QtInstallPath -BuildArch $_ + Build-App -BuildConfig "release" -BuildArch $_ + $OriginalEnv | % { Set-Item "Env:$($_.Name)" $_.Value } + } +} + +# Build Windows installer +Function Build-Installer +{ + foreach ($_ in Get-Content -Path "$RootPath\$AppName.pro") + { + if ($_ -Match "^VERSION *= *(.*)$") + { + $AppVersion = $Matches[1] + break + } + } + + Execute-Native-Command -Command "$WindowsPath\NSIS\makensis" ` + -Arguments ("/v4", "/DAPP_NAME=$AppName", "/DAPP_VERSION=$AppVersion", ` + "/DROOT_PATH=$RootPath", "/DWINDOWS_PATH=$WindowsPath", "/DDEPLOY_PATH=$DeployPath", ` + "$WindowsPath\installer.nsi") +} + +Clean-Build-Environment +Install-Dependencies +Build-App-Variants -QtInstallPath $QtInstallPath +Build-Installer From e0131c9c195b4211d99bae545002d5ff05115541 Mon Sep 17 00:00:00 2001 From: Daniel Masato Date: Fri, 8 May 2020 11:35:57 +0100 Subject: [PATCH 2/4] Overhaul Windows installer generation script The rework provides the following improvements: - Correct handling of 64bit and 32bit installations (registry keys, installation paths, disk space requirements) - Safer handling of installation path (only install into a new folder) - Update to Modern UI 2 installer experience - Support for internationalization (installer language selection and translations) - Fix broken detection of Jamulus already running (see https://sourceforge.net/p/llcon/discussion/software/thread/f3174d7f6f/) - Automatic detection of target files and folders to install --- windows/FindProcDLL.dll | Bin 31744 -> 0 bytes windows/installer-banner.bmp | Bin 0 -> 25818 bytes windows/installer-banner.xcf | Bin 0 -> 29277 bytes windows/installer-welcome.bmp | Bin 0 -> 206038 bytes windows/installer.nsi | 410 +++++++++++++++++++++----------- windows/nsProcess.dll | Bin 0 -> 4608 bytes windows/uninstaller-welcome.bmp | Bin 0 -> 206038 bytes 7 files changed, 277 insertions(+), 133 deletions(-) delete mode 100644 windows/FindProcDLL.dll create mode 100644 windows/installer-banner.bmp create mode 100644 windows/installer-banner.xcf create mode 100644 windows/installer-welcome.bmp create mode 100644 windows/nsProcess.dll create mode 100644 windows/uninstaller-welcome.bmp diff --git a/windows/FindProcDLL.dll b/windows/FindProcDLL.dll deleted file mode 100644 index 790c22796985f3116dab58d6aeb2de751a8eb113..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31744 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 Cw8TIF literal 0 HcmV?d00001 diff --git a/windows/installer-banner.xcf b/windows/installer-banner.xcf new file mode 100644 index 0000000000000000000000000000000000000000..9964e17d303fee93988d6e890e0051dd49ec705b GIT binary patch literal 29277 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�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 literal 0 HcmV?d00001 diff --git a/windows/installer-welcome.bmp b/windows/installer-welcome.bmp new file mode 100644 index 0000000000000000000000000000000000000000..53024738c05e228a95d745e22f895a7c43f2fc9c GIT binary patch literal 206038 zcmeI*33L_J{Ri+L5E0qeiU?&<3o2-Z0*cYL2>uoRDrnKVfpBbHu-dBsQxK6TMG2IO z0-_?T_EZEn;1noTkpz@Yl**ET5I}*1-2hoga{s^IdmXsB3Byfhl6k!O=A3)peRF4d zbMNQgO5A7hO6cXyd zvjNkX?fY%xJ5WJ(rswU$F}}yT0b75?<{Mg-^7f^}BI2R%28ubee761eNnL#Z9QtW+>Pm;#&ZrQJa$GEr$6Yge zQ(?|wq%zjQ&gnOotG>(AMisft=4TQp|KRotY5$7++*mipuweiOU;qYSAU+JFk8DC& zi-*yV>))g74Id$eybgl=UT>e!i3*PGudu!v#xW~z?7*+O4$9-^VbvpjG{5!(>pA=E zmDXlKdEEI{55z@`sh2Pil*iq39w_lyO8dTGT71Mk+jfMx24S*lv7`YnQbh-TE`|7)}#qHRR{~@Cb8$dh)t1c!Wo< zhWuO}9^uhXPhQsrkMQW#ke|!LBRu-)$?Lk{5gxr7@^g83ghxL;d0iJg!lPG1el8D> z@aU%}uj_(Gc=T$>&*k9}9{u#>bzSfXk6sP=xja0=qo1CB;N5;1M3Z z8uD{_c!WnkJ$YRhJi?<_Lw+s~kMQWHC$H;*M|kvV$j{~B5gz^YpYfr{S$D;EZF*&&#j@?7fT-We;<~ll^L1+4o zDcz|k|G4Y_$(3@M&sheqrPn(=mR>KmUTiEnaS|raT-We;<~ll^&9Yd8NxOQ6N4t75 zO_s+ZOrE)};qlCMq`g1tgz89>>VT=<%$!s8sYj#NVZOG#NIJabYozO@_&1Tv?1$lVS3hHli-2 zC)F=kI`rk_3O(19^_TavrH!Z)H|LUJ^62IK|6uC)3iT-K_wxDTWm$MUb-mE7P2th5 zp4{rtrVJkK>KPvG>dD5O+dS}SSI_WhS5I!%Y|7x#uAbr1uAXenxy=KQcJ&O8cJ<_D z&87?$2i^$d@8_2g#FrVJkK>KPvG z>dD5O+dS}SSI_WhS5I!%Y|7x#uAbr1uAXenxy|F|F=y8*%AEhl&?fmkqEmO3=~1>D zbiF(KUD>a09#1}>!}+am$X>T5w+h6gY&Yn-uWX0T_Tcfq&mSq}y9SSybBuN@$}2p= zV`;HiH&U7TjMozbKQ@$BAF(hE@v-vbl3J_ZmU`5aPwZhp1~?Vf!<9auJ&WNZUzJf*+TFp&PWY&YooH)9sw2lw49 zt?nyx{IRs{V_Ix^2)aGs5gvjzsBa%0;ZgSxbRHhzF=&JO_Tdp8bq_)3;SnB#HmGkO z9^p~<5Of|M;W21~`u5=w9(4~v=iw0^gEpvdA0FXR_Yia*9^o-)gZlR25gv69LFeHS z9)mWhZyz4vQTGsZ9ve-)E(iR{xk*@_V`WqerReM2@d6i%#TH=7K-LA}p56Kw45g+VRHq^!=

wwOLl)_eDjDoK)U*lyy119?fO- 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 literal 0 HcmV?d00001 diff --git a/windows/installer.nsi b/windows/installer.nsi index 8f04714eea..e5646f6db3 100755 --- a/windows/installer.nsi +++ b/windows/installer.nsi @@ -1,146 +1,290 @@ -; Jamulus NSIS installer script -!include LogicLib.nsh -!include x64.nsh +; Jamulus NSIS Installer with Modern User Interface -!define APP_NAME "Jamulus" -!define APP_EXE "Jamulus.exe" -!define AUTORUN_NAME "Jamulus server" -!define UNINSTALL_EXE "Uninstall.exe" -!define INSTALLER_NAME "Jamulusinstaller.exe" -!define BINARY_PATH "..\release\" -!define VS_REDIST_EXE "vc_redist.x86.exe" -!define UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" +; Includes +!include "x64.nsh" ; 64bit architecture support +!include "MUI2.nsh" ; Modern UI +!include "LogicLib.nsh" ; Logical operators +!include "Sections.nsh" ; Support for section selection + +; Compile-time definitions +!define VC_REDIST32_EXE "vc_redist.x86.exe" +!define VC_REDIST64_EXE "vc_redist.x64.exe" +!define APP_INSTALL_KEY "Software\${APP_NAME}" +!define APP_INSTALL_VALUE "InstallFolder" +!define AUTORUN_NAME "${APP_NAME} Server" !define AUTORUN_KEY "Software\Microsoft\Windows\CurrentVersion\Run" +!define APP_EXE "${APP_NAME}.exe" +!define UNINSTALL_EXE "Uninstall.exe" +!define APP_UNINSTALL_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" +; General +SetCompressor bzip2 ; Compression mode +Unicode true ; Support all languages via Unicode +RequestExecutionLevel admin ; Administrator privileges are required for installation -SetCompressor lzma -Name "${APP_NAME}" -Caption "${APP_NAME}" -OutFile "${INSTALLER_NAME}" -InstallDir "$PROGRAMFILES\${APP_NAME}" - -LicenseText "License" -LicenseData "..\COPYING" - -Page license -Page directory -Page instfiles - - -Section - - ; check if software is currently running - !addplugindir ..\windows - FindProcDLL::FindProc "${APP_EXE}" - IntCmp $R0 1 0 notRunning - MessageBox MB_OK|MB_ICONEXCLAMATION "${APP_NAME} is running. Please close it and run the setup again." /SD IDOK - Abort - notRunning: - - ; add reg keys so that software appears in Windows "Add/Remove Software" - WriteRegStr HKLM "${UNINST_KEY}" "DisplayName" "${APP_NAME} (remove only)" - WriteRegStr HKLM "${UNINST_KEY}" "UninstallString" '"$INSTDIR\${UNINSTALL_EXE}"' - - SetOutPath $INSTDIR - - ; main application - ${If} ${RunningX64} - File "${BINARY_PATH}${APP_EXE}" - ${Else} - File "${BINARY_PATH}x86\${APP_EXE}" - ${EndIf} - - ; QT dlls - ${If} ${RunningX64} - File "$%QTDIR64%\bin\Qt5Core.dll" - File "$%QTDIR64%\bin\Qt5Gui.dll" - File "$%QTDIR64%\bin\Qt5Widgets.dll" - File "$%QTDIR64%\bin\Qt5Network.dll" - File "$%QTDIR64%\bin\Qt5Xml.dll" - File "$%QTDIR64%\bin\D3DCompiler_47.dll" - File "$%QTDIR64%\bin\libEGL.dll" - File "$%QTDIR64%\bin\libGLESv2.dll" - ${Else} - File "$%QTDIR32%\bin\Qt5Core.dll" - File "$%QTDIR32%\bin\Qt5Gui.dll" - File "$%QTDIR32%\bin\Qt5Widgets.dll" - File "$%QTDIR32%\bin\Qt5Network.dll" - File "$%QTDIR32%\bin\Qt5Xml.dll" - File "$%QTDIR32%\bin\D3DCompiler_47.dll" - File "$%QTDIR32%\bin\libEGL.dll" - File "$%QTDIR32%\bin\libGLESv2.dll" - ${EndIf} - - ; other files - File "..\COPYING" - - ; temporarily create Microsoft Visual Studio redistributable - ${If} ${RunningX64} - File "$%VS_REDIST64_EXE%" - ExecWait '"$INSTDIR\$%VS_REDIST64_EXE%" /q /norestart' - ${Else} - File "$%VS_REDIST32_EXE%" - ExecWait '"$INSTDIR\$%VS_REDIST32_EXE%" /q /norestart' - ${EndIf} - - ; uninstaller - WriteUninstaller $INSTDIR\${UNINSTALL_EXE} - - ; shortcuts - CreateShortCut "$DESKTOP\${APP_NAME}.lnk" "$OUTDIR\${APP_EXE}" - - CreateDirectory "$SMPROGRAMS\${APP_NAME}" - CreateShortCut "$SMPROGRAMS\${APP_NAME}\${APP_NAME}.lnk" "$INSTDIR\${APP_EXE}" - CreateShortCut "$SMPROGRAMS\${APP_NAME}\${APP_NAME} Server.lnk" "$INSTDIR\${APP_EXE}" "-s" - CreateShortCut "$SMPROGRAMS\${APP_NAME}\${UNINSTALL_EXE}.lnk" "$INSTDIR\${UNINSTALL_EXE}" - - ; cleanup: remove temporary Microsoft Visual Studio redistributable executable - ${If} ${RunningX64} - Delete $INSTDIR\$%VS_REDIST64_EXE% - ${Else} - Delete $INSTDIR\$%VS_REDIST32_EXE% - ${EndIf} - - ; additional platform dlls - SetOutPath $INSTDIR\platforms - ${If} ${RunningX64} - File "$%QTDIR64%\plugins\platforms\qwindows.dll" - File "$%QTDIR64%\plugins\platforms\qminimal.dll" - ${Else} - File "$%QTDIR32%\plugins\platforms\qwindows.dll" - File "$%QTDIR32%\plugins\platforms\qminimal.dll" - ${EndIf} +; Installer name and file +Name "${APP_NAME}" +OutFile "${DEPLOY_PATH}\${APP_NAME}-${APP_VERSION}-installer-win.exe" +Caption "${APP_NAME} ${APP_VERSION} Installer" +BrandingText "${APP_NAME} powers your online jam session" -SectionEnd + ; Additional plugin location (for nsProcess) +!addplugindir "${WINDOWS_PATH}" + +; Installer graphical element configuration +!define MUI_ICON "${WINDOWS_PATH}\mainicon.ico" +!define MUI_HEADERIMAGE +!define MUI_HEADERIMAGE_BITMAP "${WINDOWS_PATH}\installer-banner.bmp" +!define MUI_WELCOMEFINISHPAGE_BITMAP "${WINDOWS_PATH}\installer-welcome.bmp" +!define MUI_UNWELCOMEFINISHPAGE_BITMAP "${WINDOWS_PATH}\uninstaller-welcome.bmp" + +; Store the installer language - must be placed before the installer page configuration +!define MUI_LANGDLL_REGISTRY_ROOT HKLM +!define MUI_LANGDLL_REGISTRY_KEY "${APP_INSTALL_KEY}" +!define MUI_LANGDLL_REGISTRY_VALUENAME "InstallLanguage" + +; Installer page configuration +!define MUI_PAGE_CUSTOMFUNCTION_PRE AbortOnRunningApp +!insertmacro MUI_PAGE_WELCOME +!insertmacro MUI_PAGE_LICENSE "${ROOT_PATH}\COPYING" +!define MUI_PAGE_CUSTOMFUNCTION_LEAVE ValidateDestinationFolder +!insertmacro MUI_PAGE_DIRECTORY +!insertmacro MUI_PAGE_INSTFILES +!define MUI_FINISHPAGE_RUN "$INSTDIR\${APP_EXE}" +!insertmacro MUI_PAGE_FINISH + +; Uninstaller page configuration +!define MUI_PAGE_CUSTOMFUNCTION_PRE un.AbortOnRunningApp +!insertmacro MUI_UNPAGE_WELCOME +!insertmacro MUI_UNPAGE_CONFIRM +!insertmacro MUI_UNPAGE_INSTFILES +!insertmacro MUI_UNPAGE_FINISH + +; Supported languages configuration - languages other than English are disabled for now +; Additional languages can be added below, see https://nsis.sourceforge.io/Examples/Modern%20UI/MultiLanguage.nsi +!insertmacro MUI_LANGUAGE "English" ; The first language is the default +; !insertmacro MUI_LANGUAGE "Italian" + +LangString INVALID_FOLDER_MSG ${LANG_ENGLISH} \ + "The destination folder already exists. Please enter a new destination folder." +; LangString INVALID_FOLDER_MSG ${LANG_ITALIAN} \ +; "La cartella di destinazione esiste già. Selezionare una nuova cartella di destinazione." + +LangString RUNNING_APP_MSG ${LANG_ENGLISH} \ + "${APP_NAME} is running. Please close it and run the setup again." +; LangString RUNNING_APP_MSG ${LANG_ITALIAN} \ +; "${APP_NAME} è in esecuzione. Chiudere l'applicazione prima di eseguire l'installazione." + +; Abort the installer/uninstaller if Jamulus is running +!macro _AbortOnRunningApp + + nsProcess::_FindProcess "${APP_EXE}" + Pop $R0 + + ${If} $R0 = 0 + MessageBox MB_OK|MB_ICONEXCLAMATION "$(RUNNING_APP_MSG)" /sd IDOK + Quit + ${EndIf} + +!macroend + + +; Installer +!macro InstallApplication buildArch + + !define prefix "${DEPLOY_PATH}\${buildArch}" + !tempfile files + + ; Find target folders + !system 'cmd.exe /v /c "for /f "usebackq" %d in (`dir /b /s /ad "${prefix}"`) do \ + @(set "_d=%d" && echo CreateDirectory "$INSTDIR\!_d:${prefix}\=!" >> "${files}")"' + + ; Find target files + !system 'cmd.exe /v /c "for /r "${prefix}" %f in (*.*) do \ + @(set "_f=%f" && echo File "/oname=$INSTDIR\!_f:${prefix}\=!" "!_f!" >> "${files}")"' + + ; Install folders and files + CreateDirectory "$INSTDIR" + !include "${files}" + + ; Add the redistribution license + File "/oname=$INSTDIR\COPYING" "${ROOT_PATH}\COPYING" + + ; Cleanup + !delfile "${files}" + !undef files + !undef prefix + +!macroend + +!macro SetupShortcuts + + ; Add the registry key to store the installation folder + WriteRegStr HKLM "${APP_INSTALL_KEY}" "${APP_INSTALL_VALUE}" "$INSTDIR" + + ; Add the registry keys so that software appears in Windows "Add/Remove Software" + WriteRegStr HKLM "${APP_UNINSTALL_KEY}" "DisplayName" "${APP_NAME}" + WriteRegStr HKLM "${APP_UNINSTALL_KEY}" "DisplayIcon" "$INSTDIR\${APP_EXE},0" + WriteRegStr HKLM "${APP_UNINSTALL_KEY}" "UninstallString" '"$INSTDIR\${UNINSTALL_EXE}"' + + ; Add the uninstaller + WriteUninstaller "$INSTDIR\${UNINSTALL_EXE}" + + ; Add the Start Menu and desktop shortcuts + CreateShortCut "$DESKTOP\${APP_NAME}.lnk" "$OUTDIR\${APP_EXE}" + CreateDirectory "$SMPROGRAMS\${APP_NAME}" + CreateShortCut "$SMPROGRAMS\${APP_NAME}\${APP_NAME}.lnk" "$INSTDIR\${APP_EXE}" + CreateShortCut "$SMPROGRAMS\${APP_NAME}\${APP_NAME} Server.lnk" "$INSTDIR\${APP_EXE}" "-s" + CreateShortCut "$SMPROGRAMS\${APP_NAME}\${UNINSTALL_EXE}.lnk" "$INSTDIR\${UNINSTALL_EXE}" + +!macroend + +SectionGroup "InstallGroup" + + Section "Install" Install_x86_64 + + ; Install the main application + !insertmacro InstallApplication x86_64 + !insertmacro SetupShortcuts + + ; Install Microsoft Visual Studio redistributables and remove the installer afterwards + ExecWait "$\"$INSTDIR\${VC_REDIST64_EXE}$\" /q /norestart" + Delete "$INSTDIR\${VC_REDIST64_EXE}" + SectionEnd -Section "Uninstall" + Section "Install" Install_x86 -DeleteRegKey HKLM "${UNINST_KEY}" + ; Install the main application + !insertmacro InstallApplication x86 + !insertmacro SetupShortcuts -; the software may have written an auto run entry in the registry, remove it -DeleteRegValue HKCU "${AUTORUN_KEY}" "${AUTORUN_NAME}" + ; Install Microsoft Visual Studio redistributables and remove the installer afterwards + ExecWait "$\"$INSTDIR\${VC_REDIST32_EXE}$\" /q /norestart" + Delete "$INSTDIR\${VC_REDIST32_EXE}" -Delete "$DESKTOP\${APP_NAME}.lnk" -Delete "$SMPROGRAMS\${APP_NAME}\${APP_NAME}.lnk" -Delete "$SMPROGRAMS\${APP_NAME}\${APP_NAME} server.lnk" -Delete "$SMPROGRAMS\${APP_NAME}\${UNINSTALL_EXE}.lnk" -RMDIR "$SMPROGRAMS\${APP_NAME}" + SectionEnd -Delete $INSTDIR\${UNINSTALL_EXE} -Delete $INSTDIR\${APP_EXE} -Delete $INSTDIR\Qt5Core.dll -Delete $INSTDIR\Qt5Gui.dll -Delete $INSTDIR\Qt5Widgets.dll -Delete $INSTDIR\Qt5Network.dll -Delete $INSTDIR\Qt5Xml.dll -Delete $INSTDIR\D3DCompiler_47.dll -Delete $INSTDIR\libEGL.dll -Delete $INSTDIR\libGLESv2.dll -Delete $INSTDIR\COPYING -Delete $INSTDIR\platforms\qwindows.dll -Delete $INSTDIR\platforms\qminimal.dll -RMDir $INSTDIR\platforms -RMDir $INSTDIR +SectionGroupEnd + +Function .onInit + + ; Set up registry access, installation folder and installer section for current architecture + ${If} ${RunningX64} + SetRegView 64 + SectionSetFlags ${Install_x86_64} ${SF_SELECTED} + SectionSetFlags ${Install_x86} ${SECTION_OFF} + + ; Set default installation folder, retrieve from registry if available + ReadRegStr $INSTDIR HKLM "${APP_INSTALL_KEY}" "${APP_INSTALL_VALUE}" + IfErrors 0 +2 + StrCpy $INSTDIR "$PROGRAMFILES64\${APP_NAME}" + + ${Else} + SetRegView 32 + SectionSetFlags ${Install_x86} ${SF_SELECTED} + SectionSetFlags ${Install_x86_64} ${SECTION_OFF} + + ; Set default installation folder, retrieve from registry if available + ReadRegStr $INSTDIR HKLM "${APP_INSTALL_KEY}" "${APP_INSTALL_VALUE}" + IfErrors 0 +2 + StrCpy $INSTDIR "$PROGRAMFILES32\${APP_NAME}" + + ${EndIf} + + ; Install for all users + SetShellVarContext all + + ; Select installer language + !insertmacro MUI_LANGDLL_DISPLAY + +FunctionEnd + +; Ensure Jamulus is installed into a new folder only, unless Jamulus is already installed there +Function ValidateDestinationFolder + + ${If} ${FileExists} "$INSTDIR\*" + ${AndIfNot} ${FileExists} "$INSTDIR\${APP_EXE}" + StrCpy $INSTDIR "$INSTDIR\${APP_NAME}" + MessageBox MB_OK|MB_ICONEXCLAMATION "$(INVALID_FOLDER_MSG)" /sd IDOK + Abort + ${endIf} + +FunctionEnd + +Function AbortOnRunningApp + !insertmacro _AbortOnRunningApp +FunctionEnd + + +; Uninstaller +!macro un.InstallFiles buildArch + + !define prefix "${DEPLOY_PATH}\${buildArch}" + !tempfile files + + ; Find target files + !system 'cmd.exe /v /c "for /r "${prefix}" %f in (*.*) do \ + @(set "_f=%f" && echo Delete "$INSTDIR\!_f:${prefix}\=!" >> "${files}")"' + + ; Find target folders in reverse order to ensure they can be deleted when empty + !system 'cmd.exe /v /c "for /f "usebackq" %d in \ + (`dir /b /s /ad "${prefix}" ^| C:\Windows\System32\sort.exe /r`) do \ + @(set "_d=%d" && echo RMDir "$INSTDIR\!_d:${prefix}\=!" >> "${files}")"' + + ; Remove files and folders + !include "${files}" + + Delete "$INSTDIR\COPYING" + Delete "$INSTDIR\${UNINSTALL_EXE}" + RMDir "$INSTDIR" + + ; Cleanup + !delfile "${files}" + !undef files + !undef prefix + +!macroend + +Section "un.Install" + + ; Delete the main application + ${If} ${RunningX64} + !insertmacro un.InstallFiles x86_64 + ${Else} + !insertmacro un.InstallFiles x86 + ${EndIf} + + ; Remove the Start Menu and desktop shortcuts + Delete "$DESKTOP\${APP_NAME}.lnk" + RMDir /r "$SMPROGRAMS\${APP_NAME}" + + ; There may be an auto run entry in the registry for the server, remove it + DeleteRegValue HKCU "${AUTORUN_KEY}" "${AUTORUN_NAME}" + + ; Remove the remaining registry keys + DeleteRegKey HKLM "${APP_UNINSTALL_KEY}" + DeleteRegKey HKLM "${APP_INSTALL_KEY}" SectionEnd + +Function un.onInit + + ; Set up registry access for current architecture + ${If} ${RunningX64} + SetRegView 64 + ${Else} + SetRegView 32 + ${EndIf} + + ; Uninstall for all users + SetShellVarContext all + + ; Retrieve installer language + !insertmacro MUI_UNGETLANGUAGE + +FunctionEnd + +Function un.AbortOnRunningApp + !insertmacro _AbortOnRunningApp +FunctionEnd diff --git a/windows/nsProcess.dll b/windows/nsProcess.dll new file mode 100644 index 0000000000000000000000000000000000000000..2478624ee0bcceb6e2c0eee3a563e7cea272ba9a GIT binary patch literal 4608 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 Date: Fri, 8 May 2020 11:46:25 +0100 Subject: [PATCH 3/4] Fix Travis deployment for Windows Update the Qt installer automation script to account for the latest changes in the installation process. The Qt online installer now requires a valid Qt user account. Also use the updated Windows deployment script. --- .gitignore | 3 +- .travis.yml | 54 ++++++--------- windows/qt-installer-windows.qs | 112 +++++++++++++++++++++----------- 3 files changed, 95 insertions(+), 74 deletions(-) diff --git a/.gitignore b/.gitignore index 1b84bcee17..77c9c744e2 100644 --- a/.gitignore +++ b/.gitignore @@ -16,8 +16,7 @@ ui_*.h moc_predefs.h src/res/qrc_resources.cpp windows/ASIOSDK2 -windows/VC_redist.x64.exe -windows/vc_redist.x86.exe +windows/NSIS debug/ release/ build/ diff --git a/.travis.yml b/.travis.yml index b403dd389c..d60f7c082e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -44,37 +44,25 @@ matrix: # on: # repo: corrados/jamulus # tags: true - # - os: windows - # before_install: - # - dir C:/Program\ Files\ \(x86\)/Windows\ Kits/10/bin/10.0.17134.0/x64 - # - cmd.exe /C 'cd && "C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" - # x86 && cd && cd "C:/Users/travis/build/corrados/jamulus/windows" && dir' - # - curl -vLO http://download.qt.io/official_releases/online_installers/qt-unified-windows-x86-online.exe - # - curl -vLO http://www.steinberg.net/sdk_downloads/ASIOSDK2.3.2.zip - # - unzip ASIOSDK2.3.2.zip - # - mkdir ASIOSDK2 - # - cp -rvu ASIOSDK2.3.2/* ASIOSDK2 - # - pwd - # - mv qt-unified-windows-x86-online.exe windows - # - mv ASIOSDK2 windows - # - cd windows - # - "./qt-unified-windows-x86-online.exe --verbose --script qt-installer-windows.qs" - # - ls -la C:/Qt/5.12.3/msvc2017/bin/qtenv2.bat - # script: - # - cmd.exe /C 'cd && "C:\Qt\5.12.3\msvc2017\bin\qtenv2.bat" && cd && "C:\Program - # Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" - # x86 && cd "C:\Users\travis\build\corrados\jamulus" && cd && qmake Jamulus.pro - # && nmake' - # #deploy function is only available in travis-ci.com (not free) but not in travis-ci.org (free) - # #deploy: - # # provider: releases - # # api_key: - # # secure: aQ93/8XU3HEGTif0/rSiF+gcm4uRhyWFdr3Va50BprwQOrZkNg8zIMwIKKODwjLDqxaH4msgNYutcr/VLdLjo4YP43It0UIfv3LGa2VFAkFhuQurMXZlVyx8RhIGLjIaWVWN1GCbNdAQwWNNo2mAkEdRaBrj/26geZotGcYZiztGwTAdy0t/vyYjO1sLZdBKcf7dJ06Pm2ktZO/rDyE4UtCTQiRfqLCKsQ/SILbewOMG/auaSUdU0utsbvXxr+dCzqBPwdSSptWqhIORXORL5oPn6242URzIJkmw5XPwhSabhdbzUjCIN9E24z1vp+cffAohuGXyXXZy9/bGeKa0mXfAaXV+TnJkpMd+i3fN5dY+vhFrlLOpRojRK6NqvaMID6tcNNtZMmFSgaZGyCUJQn4/0X+LdPwvK3/dXY+qElJW62QiJmQAt9OBGcq8EFqQDmEtRivRlbpbERsd/IJoOxP7nI2T00g04uV543ZmhU4fmGw6MVPAlIGRsBECjB0AMTp+3xW3OaUp7jy3WZpZXRrXNI41nZogrxhevPME1BRNk3V+MWQo8R3C+bIaCa5Um/3DZxnMxZgXjI9yzzR7Z8f4RWaQCKjXx41/pk7jxm1TcEyBfRVsb313l/fRLg+fjCmaEnnxu43333XGIv4eIyAGDR8ydF2VpmyP2ejzh8I= - # # file: - # # - Jamulus.exe - # # skip_cleanup: true - # # on: - # # repo: corrados/jamulus - # # tags: true - + - os: windows + env: + # QT_ACCOUNT_USERNAME and QT_ACCOUNT_PASSWORD variables for Qt registration at install time + - secure: WlWyUMU53vGPwZ340bZZy3PVJJfuFZ8gegyLHGYXo1Hp++BCtHJ5FH2kVYxW0pUNqKobkrlGdNMLrhfDD5qATj6TqbRTQr/XKqK5Qhe8sf7Ag/Z+AUjguED7QL0th2Ll6eBlSc9ayrQfvCjvzmyFXGB85iXvuJlbqUCya6xRyiflq37KimLGjxFOhUkCGsIgraUxUxGm/dLj07x2gH1XeozzSOhX/4uDwlP+y642zWyWf/pOrUTSuid97TJseD9tAmLqFpVo43BqDuCe1/7OmBnZkJQb4obU43KeRAHLUCSnbI+kVVNfW8j0/1ynObngIZoC+KQnvc+4NTU13yRez8HoFcEXa9l9oTRBu+nFu+TM+c8+EBNKDZxrdF2NYLRuNdYIzVqZsbSIT+8aoAwMS+bO9AgW2KCelz7zCSoPRokfM2vH7JPEq7Ofib8neK4MEzAKYL1K0/vDlZktsxX8xIhrzgJQCF8IloMLPR3sKIOckYjBzsQG9Q6QJqC6BKJJSpeN6I6LF6cksSMcUalhsqgCghrLFHalJj0mhkSQGTvXtDr3OOfPSicj1fC3efqjiZ9uT6b5yR2gC9e4NaC0qLcqLuHJL10CUjn2eizKBqr0Onu/ybkkClfBUFzu3uOf8YMq3I1hp4xzkfEPAb1A2Iem6rYA9ndyGUnXrYNoLRs= + - secure: ldDKzVJFDbA1+tJg4jicBTUAzm83mjybEY2hvPxMofE2gBNwAFRj2+XJD5H1tQ/BBE3LADOVRiwiCxZZLSotIChmmrtQJ68tshYTwcpjf+VQ3m59NsHl0xbjP3/B9DYu1zBOhUc43gGsDnRulvzDi8HwbxrM4ACNCepy+zq+a8M7BytddrhZSgIT0rsTBU0t/StH7B/Pu6E6KByelgdmbnZbuAqaT2HMi+IiGrAJiw70Hmq4BgegsEv4kLyNLe2ofZsdvmFw20Gumfg9B4PFM2S0QESj2pPwFgz+uYUgS/0ncpGdFTshnDKPFj7ePgrHT8eM9bMC8BM8RedpoR0vSUyioCxx0YJzSsw8JE8DEe3qNt3HmhPcH678wrYxs3cXLoTC8kBGDPD6drzqBIvILVfPJcaXRJlD7I+GOIkXFojLrxDZRy9I73KbWHGRONLguGBVyqJxGVrPH6hjEAxhgLLMUAnoh61wPFtvnayT+SbWl2NbAewnsjfCNnLgBZOxdmlKMjC5yUH3wnnyBn5jEAHcjrtbSfQ+lD+ZlYmeuimgsvjomHOHKw3N2+tfKW9lAH45ShiiMIMOk9HP9zKnDnyG6hI0q9wPFxWrkc3RZpRmQO1S9QjB2gD3cWiVMNTBYI+XNOqZEUicTc4XwOByf8bm5SyH4H1+8o1RytgbEZY= + before_install: + - curl -vL -o "${TEMP}/qt-installer.exe" http://download.qt.io/official_releases/online_installers/qt-unified-windows-x86-online.exe + - "${TEMP}/qt-installer.exe --verbose --script ./windows/qt-installer-windows.qs" + script: + - powershell -ExecutionPolicy ByPass -Command "./windows/deploy_windows.ps1" + #deploy function is only available in travis-ci.com (not free) but not in travis-ci.org (free) + #deploy: + # provider: releases + # api_key: + # secure: aQ93/8XU3HEGTif0/rSiF+gcm4uRhyWFdr3Va50BprwQOrZkNg8zIMwIKKODwjLDqxaH4msgNYutcr/VLdLjo4YP43It0UIfv3LGa2VFAkFhuQurMXZlVyx8RhIGLjIaWVWN1GCbNdAQwWNNo2mAkEdRaBrj/26geZotGcYZiztGwTAdy0t/vyYjO1sLZdBKcf7dJ06Pm2ktZO/rDyE4UtCTQiRfqLCKsQ/SILbewOMG/auaSUdU0utsbvXxr+dCzqBPwdSSptWqhIORXORL5oPn6242URzIJkmw5XPwhSabhdbzUjCIN9E24z1vp+cffAohuGXyXXZy9/bGeKa0mXfAaXV+TnJkpMd+i3fN5dY+vhFrlLOpRojRK6NqvaMID6tcNNtZMmFSgaZGyCUJQn4/0X+LdPwvK3/dXY+qElJW62QiJmQAt9OBGcq8EFqQDmEtRivRlbpbERsd/IJoOxP7nI2T00g04uV543ZmhU4fmGw6MVPAlIGRsBECjB0AMTp+3xW3OaUp7jy3WZpZXRrXNI41nZogrxhevPME1BRNk3V+MWQo8R3C+bIaCa5Um/3DZxnMxZgXjI9yzzR7Z8f4RWaQCKjXx41/pk7jxm1TcEyBfRVsb313l/fRLg+fjCmaEnnxu43333XGIv4eIyAGDR8ydF2VpmyP2ejzh8I= + # file: + # - Jamulus.exe + # skip_cleanup: true + # on: + # repo: corrados/jamulus + # tags: true diff --git a/windows/qt-installer-windows.qs b/windows/qt-installer-windows.qs index 8164790b74..e3c95ded8e 100644 --- a/windows/qt-installer-windows.qs +++ b/windows/qt-installer-windows.qs @@ -1,92 +1,126 @@ /* * Qt Installer script for a non-interactive installation of Qt5 on Windows. - * Installs the 64-bit package if environment variable PLATFORM="x64". + * + * Run with: + * qt-unified-windows-x86-online.exe --verbose --script qt_installer_windows.qs + * + * globals QInstaller, QMessageBox, buttons, gui, installer, console */ -// jshint strict:false -/* globals QInstaller, QMessageBox, buttons, gui, installer, console */ - -// Run with: -// .\qt-unified-windows-x86-3.0.4-online.exe --verbose --script tools\qt-installer-windows.qs - -// Look for Name elements in -// https://download.qt.io/online/qtsdkrepository/windows_x86/desktop/qt5_5123/Updates.xml -// Unfortunately it is not possible to disable deps like qt.tools.qtcreator -var INSTALL_COMPONENTS = [ - installer.environmentVariable("PLATFORM") == "x64" ? - "qt.qt5.5123.win64_msvc2017_64" : - "qt.qt5.5123.win32_msvc2017", -]; - function Controller() { - // Continue on installing to an existing (possibly empty) directory. + installer.setMessageBoxAutomaticAnswer("installationError", QMessageBox.Retry); + installer.setMessageBoxAutomaticAnswer("installationErrorWithRetry", QMessageBox.Retry); + installer.setMessageBoxAutomaticAnswer("DownloadError", QMessageBox.Retry); + installer.setMessageBoxAutomaticAnswer("archiveDownloadError", QMessageBox.Retry); + + // Continue on installation to an existing (possibly empty) directory. installer.setMessageBoxAutomaticAnswer("OverwriteTargetDirectory", QMessageBox.Yes); - // Continue at "SHOW FINISHED PAGE" + + // Continue at the end of the installation installer.installationFinished.connect(function() { - console.log("installationFinished"); + console.log("Step: InstallationFinished"); gui.clickButton(buttons.NextButton); }); } -Controller.prototype.WelcomePageCallback = function() { + +Controller.prototype.WelcomePageCallback = function() +{ console.log("Step: " + gui.currentPageWidget()); // At least for 3.0.4 immediately clicking Next fails, so wait a bit. // https://github.com/benlau/qtci/commit/85cb986b66af4807a928c70e13d82d00dc26ebf0 gui.clickButton(buttons.NextButton, 1000); }; -Controller.prototype.CredentialsPageCallback = function() { +Controller.prototype.CredentialsPageCallback = function() +{ console.log("Step: " + gui.currentPageWidget()); + + var page = gui.pageWidgetByObjectName("CredentialsPage"); + var username = installer.environmentVariable("QT_ACCOUNT_USERNAME"); + var password = installer.environmentVariable("QT_ACCOUNT_PASSWORD"); + page.loginWidget.EmailLineEdit.setText(username); + page.loginWidget.PasswordLineEdit.setText(password); + gui.clickButton(buttons.NextButton); }; -Controller.prototype.IntroductionPageCallback = function() { +Controller.prototype.IntroductionPageCallback = function() +{ console.log("Step: " + gui.currentPageWidget()); gui.clickButton(buttons.NextButton); }; -Controller.prototype.TargetDirectoryPageCallback = function() { +Controller.prototype.ObligationsPageCallback = function() +{ + console.log("Step: " + gui.currentPageWidget()); + + var page = gui.pageWidgetByObjectName("ObligationsPage"); + page.obligationsAgreement.setChecked(true); + page.completeChanged(); + gui.clickButton(buttons.NextButton); +} + +Controller.prototype.DynamicTelemetryPluginFormCallback = function() +{ + console.log("Step: " + gui.currentPageWidget()); + + var page = gui.pageWidgetByObjectName("DynamicTelemetryPluginForm"); + page.statisticGroupBox.disableStatisticRadioButton.setChecked(true); + gui.clickButton(buttons.NextButton); +} + +Controller.prototype.TargetDirectoryPageCallback = function() +{ console.log("Step: " + gui.currentPageWidget()); - // Keep default at "C:\Qt". - //gui.currentPageWidget().TargetDirectoryLineEdit.setText("E:\\Qt"); gui.clickButton(buttons.NextButton); }; Controller.prototype.ComponentSelectionPageCallback = function() { console.log("Step: " + gui.currentPageWidget()); - var page = gui.currentPageWidget(); - page.deselectAll(); - for (var i = 0; i < INSTALL_COMPONENTS.length; i++) { - page.selectComponent(INSTALL_COMPONENTS[i]); - } + + var selection = gui.pageWidgetByObjectName("ComponentSelectionPage"); + gui.findChild(selection, "Latest releases").checked = false; + gui.findChild(selection, "LTS").checked = true; + gui.findChild(selection, "FetchCategoryButton").click(); + + // Look for Name elements in + // https://download.qt.io/online/qtsdkrepository/windows_x86/desktop/qt5_5123/Updates.xml + var widget = gui.currentPageWidget(); + widget.deselectAll(); + widget.selectComponent("qt.qt5.5123.win32_msvc2017"); + widget.selectComponent("qt.qt5.5123.win64_msvc2017_64"); + gui.clickButton(buttons.NextButton); -}; +} -Controller.prototype.LicenseAgreementPageCallback = function() { +Controller.prototype.LicenseAgreementPageCallback = function() +{ console.log("Step: " + gui.currentPageWidget()); + gui.currentPageWidget().AcceptLicenseRadioButton.setChecked(true); gui.clickButton(buttons.NextButton); }; -Controller.prototype.StartMenuDirectoryPageCallback = function() { +Controller.prototype.StartMenuDirectoryPageCallback = function() +{ console.log("Step: " + gui.currentPageWidget()); gui.clickButton(buttons.NextButton); }; -Controller.prototype.ReadyForInstallationPageCallback = function() { +Controller.prototype.ReadyForInstallationPageCallback = function() +{ console.log("Step: " + gui.currentPageWidget()); gui.clickButton(buttons.NextButton); }; -Controller.prototype.FinishedPageCallback = function() { +Controller.prototype.FinishedPageCallback = function() +{ console.log("Step: " + gui.currentPageWidget()); - // TODO somehow the installer crashes after this step. - // https://stackoverflow.com/questions/25105269/silent-install-qt-run-installer-on-ubuntu-server + var checkBoxForm = gui.currentPageWidget().LaunchQtCreatorCheckBoxForm; if (checkBoxForm && checkBoxForm.launchQtCreatorCheckBox) { checkBoxForm.launchQtCreatorCheckBox.checked = false; } gui.clickButton(buttons.FinishButton); }; - -// vim: set ft=javascript: From f8d54ff51186e2ab44d8924713509af89d17f34a Mon Sep 17 00:00:00 2001 From: Daniele Masato Date: Fri, 8 May 2020 11:14:59 +0000 Subject: [PATCH 4/4] Minor cosmetic fix --- windows/installer.nsi | 6 +++--- windows/qt-installer-windows.qs | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/windows/installer.nsi b/windows/installer.nsi index e5646f6db3..06cfec108b 100755 --- a/windows/installer.nsi +++ b/windows/installer.nsi @@ -133,9 +133,9 @@ LangString RUNNING_APP_MSG ${LANG_ENGLISH} \ ; Add the Start Menu and desktop shortcuts CreateShortCut "$DESKTOP\${APP_NAME}.lnk" "$OUTDIR\${APP_EXE}" CreateDirectory "$SMPROGRAMS\${APP_NAME}" - CreateShortCut "$SMPROGRAMS\${APP_NAME}\${APP_NAME}.lnk" "$INSTDIR\${APP_EXE}" - CreateShortCut "$SMPROGRAMS\${APP_NAME}\${APP_NAME} Server.lnk" "$INSTDIR\${APP_EXE}" "-s" - CreateShortCut "$SMPROGRAMS\${APP_NAME}\${UNINSTALL_EXE}.lnk" "$INSTDIR\${UNINSTALL_EXE}" + CreateShortCut "$SMPROGRAMS\${APP_NAME}\${APP_NAME}.lnk" "$INSTDIR\${APP_EXE}" + CreateShortCut "$SMPROGRAMS\${APP_NAME}\${APP_NAME} Server.lnk" "$INSTDIR\${APP_EXE}" "-s" + CreateShortCut "$SMPROGRAMS\${APP_NAME}\${APP_NAME} Uninstall.lnk" "$INSTDIR\${UNINSTALL_EXE}" !macroend diff --git a/windows/qt-installer-windows.qs b/windows/qt-installer-windows.qs index e3c95ded8e..6f5ffdfdee 100644 --- a/windows/qt-installer-windows.qs +++ b/windows/qt-installer-windows.qs @@ -2,7 +2,7 @@ * Qt Installer script for a non-interactive installation of Qt5 on Windows. * * Run with: - * qt-unified-windows-x86-online.exe --verbose --script qt_installer_windows.qs + * qt-unified-windows-x86-online.exe --verbose --script qt-installer-windows.qs * * globals QInstaller, QMessageBox, buttons, gui, installer, console */