From f079f1c96dd053c31f8b6b95b605fa70f430255b Mon Sep 17 00:00:00 2001 From: "J.D. Purcell" Date: Mon, 24 Jun 2024 23:54:32 -0400 Subject: [PATCH 1/3] Add Windows ARM64 build --- .github/workflows/build.yml | 11 +- dist/scripts/build.ps1 | 2 +- dist/scripts/download-plugins.ps1 | 8 +- dist/scripts/innomake.ps1 | 12 +- dist/scripts/vcvars.ps1 | 15 ++- dist/scripts/windeployqt.ps1 | 54 +++++---- dist/win/qViewArm64.iss | 176 ++++++++++++++++++++++++++++++ 7 files changed, 240 insertions(+), 38 deletions(-) create mode 100755 dist/win/qViewArm64.iss diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3d411b2f..50850d0b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -28,6 +28,7 @@ jobs: - runner: 'macos-12' qtVersion: '6.5.3' qtModules: 'qtimageformats' + buildArch: 'Universal' - runner: 'macos-12' qtVersion: '5.15.2' osSuffix: '_legacy' @@ -36,16 +37,24 @@ jobs: qtArch: 'win64_msvc2019_64' osSuffix: '_64' qtModules: 'qtimageformats' + - runner: 'windows-2019' + qtVersion: '6.5.3' + qtArch: 'win64_msvc2019_arm64' + osSuffix: '_arm64' + qtModules: 'qtimageformats' + buildArch: 'Arm64' - runner: 'windows-2019' qtVersion: '5.15.2' qtArch: 'win32_msvc2019' osSuffix: '_32' + buildArch: 'X86' runs-on: ${{ matrix.runner }} steps: - name: Set environment variables shell: bash run: | - echo "arch=${{ matrix.qtArch }}" >> $GITHUB_ENV + echo "qtArch=${{ matrix.qtArch }}" >> $GITHUB_ENV + echo "buildArch=${{ matrix.buildArch }}" >> $GITHUB_ENV if [ "${{ inputs.isRelease }}" != "true" ]; then buildNum=$(date '+%Y-%m-%d').$GITHUB_RUN_ATTEMPT echo "nightlyDefines=NIGHTLY=$buildNum" >> $GITHUB_ENV diff --git a/dist/scripts/build.ps1 b/dist/scripts/build.ps1 index 1b06dbf6..400f13d8 100755 --- a/dist/scripts/build.ps1 +++ b/dist/scripts/build.ps1 @@ -9,7 +9,7 @@ if ($IsWindows) { dist/scripts/vcvars.ps1 } -if ((qmake --version -split '\n')[1][17] -eq '6') { +if ($env:buildArch -eq 'Universal') { qmake QMAKE_APPLE_DEVICE_ARCHS="x86_64 arm64" $args[0] PREFIX=$Prefix DEFINES+="$env:nightlyDefines" } else { qmake $args[0] PREFIX=$Prefix DEFINES+="$env:nightlyDefines" diff --git a/dist/scripts/download-plugins.ps1 b/dist/scripts/download-plugins.ps1 index ab1b9abc..a36d64f3 100755 --- a/dist/scripts/download-plugins.ps1 +++ b/dist/scripts/download-plugins.ps1 @@ -23,8 +23,8 @@ if ($pluginNames.count -eq 0) { } foreach ($pluginName in $pluginNames) { - $arch = If (-not $env:arch -or $env:arch -eq '') { "" } Else { "-$env:arch" } - $artifactName = "$pluginName-$imageName-$qtVersion$arch.zip" + $qtArch = $env:qtArch ? "-$env:qtArch" : '' + $artifactName = "$pluginName-$imageName-$qtVersion$qtArch.zip" $downloadUrl = "$binaryBaseUrl/$artifactName" Write-Host "Downloading $downloadUrl" @@ -76,7 +76,9 @@ if ($pluginNames -contains 'kimageformats') { if (Test-Path -Path kimageformats/kimageformats/output/heif.dll -PathType Leaf) { cp kimageformats/kimageformats/output/heif.dll "$out_frm/" cp kimageformats/kimageformats/output/libde265.dll "$out_frm/" - cp kimageformats/kimageformats/output/libx265.dll "$out_frm/" + if ($env:buildArch -ne 'Arm64') { + cp kimageformats/kimageformats/output/libx265.dll "$out_frm/" + } cp kimageformats/kimageformats/output/aom.dll "$out_frm/" } # copy raw stuff diff --git a/dist/scripts/innomake.ps1 b/dist/scripts/innomake.ps1 index 36505588..4d82b5ca 100755 --- a/dist/scripts/innomake.ps1 +++ b/dist/scripts/innomake.ps1 @@ -1,6 +1,8 @@ -# Script assumes $env:arch will start with win64 or win32 -$win64orwin32 = $env:arch.substring(0, 5) -New-Item -Path "dist\win\qView-$win64orwin32" -ItemType Directory -ea 0 -copy -R bin\* "dist\win\qView-$win64orwin32" -iscc dist\win\qView$($env:arch.substring(3, 2)).iss +$suffix = + $env:buildArch -eq 'X86' ? '32' : + $env:buildArch -eq 'Arm64' ? 'Arm64' : + '64'; +New-Item -Path "dist\win\qView-Win$suffix" -ItemType Directory -ea 0 +copy -R bin\* "dist\win\qView-Win$suffix" +iscc dist\win\qView$suffix.iss copy dist\win\Output\* bin\ \ No newline at end of file diff --git a/dist/scripts/vcvars.ps1 b/dist/scripts/vcvars.ps1 index 69d52ef0..1f635586 100755 --- a/dist/scripts/vcvars.ps1 +++ b/dist/scripts/vcvars.ps1 @@ -1,9 +1,16 @@ -# Script assumes $env:arch will start with win64 or win32 -# This should probably be an arg -$arch = $env:arch.substring(3, 2) +using namespace System.Runtime.InteropServices + +if ([RuntimeInformation]::OSArchitecture -ne [Architecture]::X64) { + throw 'Unsupported host architecture.' +} + +$arch = + $env:buildArch -eq 'X86' ? 'x64_x86' : + $env:buildArch -eq 'Arm64' ? 'x64_arm64' : + 'x64' $path = Resolve-Path "${env:ProgramFiles(x86)}\Microsoft Visual Studio\*\*\VC\Auxiliary\Build" | select -ExpandProperty Path -cmd.exe /c "call `"$path\vcvars$arch.bat`" && set > %temp%\vcvars.txt" +cmd.exe /c "call `"$path\vcvarsall.bat`" $arch && set > %temp%\vcvars.txt" Get-Content "$env:temp\vcvars.txt" | Foreach-Object { if ($_ -match "^(.*?)=(.*)$") { diff --git a/dist/scripts/windeployqt.ps1 b/dist/scripts/windeployqt.ps1 index 3149dfea..9f015054 100755 --- a/dist/scripts/windeployqt.ps1 +++ b/dist/scripts/windeployqt.ps1 @@ -6,35 +6,41 @@ param $qtVersion = ((qmake --version -split '\n')[1] -split ' ')[3] Write-Host "Detected Qt Version $qtVersion" -# Download and extract openssl -if ($qtVersion -like '5.*') { - $openSslDownloadUrl = "https://download.firedaemon.com/FireDaemon-OpenSSL/openssl-1.1.1w.zip" - $openSslFolderVersion = "1.1" - $openSslFilenameVersion = "1_1" -} else { - $openSslDownloadUrl = "https://download.firedaemon.com/FireDaemon-OpenSSL/openssl-3.2.1.zip" - $openSslFolderVersion = "3" - $openSslFilenameVersion = "3" +if ($env:buildArch -ne 'Arm64') { + # Download and extract openssl + if ($qtVersion -like '5.*') { + $openSslDownloadUrl = "https://download.firedaemon.com/FireDaemon-OpenSSL/openssl-1.1.1w.zip" + $openSslFolderVersion = "1.1" + $openSslFilenameVersion = "1_1" + } else { + $openSslDownloadUrl = "https://download.firedaemon.com/FireDaemon-OpenSSL/openssl-3.2.1.zip" + $openSslFolderVersion = "3" + $openSslFilenameVersion = "3" + } + Write-Host "Downloading $openSslDownloadUrl" + $ProgressPreference = 'SilentlyContinue' + Invoke-WebRequest -Uri $openSslDownloadUrl -OutFile openssl.zip + 7z x -y .\openssl.zip + + # Install approprate binaries for architecture + if ($env:buildArch -eq 'X86') { + copy openssl-$openSslFolderVersion\x86\bin\libssl-$openSslFilenameVersion.dll bin\ + copy openssl-$openSslFolderVersion\x86\bin\libcrypto-$openSslFilenameVersion.dll bin\ + } else { + copy openssl-$openSslFolderVersion\x64\bin\libssl-$openSslFilenameVersion-x64.dll bin\ + copy openssl-$openSslFolderVersion\x64\bin\libcrypto-$openSslFilenameVersion-x64.dll bin\ + } } -Write-Host "Downloading $openSslDownloadUrl" -$ProgressPreference = 'SilentlyContinue' -Invoke-WebRequest -Uri $openSslDownloadUrl -OutFile openssl.zip -7z x -y .\openssl.zip -# Check if "arch" environment variable is win32 -# If it is, install x86 binaries, otherwise x64 binaries -if ($env:arch.substring(3, 2) -eq '32') { - copy openssl-$openSslFolderVersion\x86\bin\libssl-$openSslFilenameVersion.dll bin\ - copy openssl-$openSslFolderVersion\x86\bin\libcrypto-$openSslFilenameVersion.dll bin\ +if ($env:buildArch -eq 'Arm64') { + # Run windeployqt in cross-compilation mode + $qtHostPath = [System.IO.Path]::GetFullPath("$env:QT_ROOT_DIR\..\$((Split-Path -Path $env:QT_ROOT_DIR -Leaf) -replace '_arm64', '_64')") + & "$qtHostPath\bin\windeployqt" "--qmake=$env:QT_ROOT_DIR\bin\qmake.bat" --no-compiler-runtime bin\qView.exe } else { - copy openssl-$openSslFolderVersion\x64\bin\libssl-$openSslFilenameVersion-x64.dll bin\ - copy openssl-$openSslFolderVersion\x64\bin\libcrypto-$openSslFilenameVersion-x64.dll bin\ + # Run windeployqt which should be in path + windeployqt --no-compiler-runtime bin/qView.exe } -# Run windeployqt which should be in path -windeployqt bin/qView.exe --no-compiler-runtime - - if ($NightlyVersion -eq '') { # Call innomake if we are not building a nightly version (no version passed) & "dist/scripts/innomake.ps1" diff --git a/dist/win/qViewArm64.iss b/dist/win/qViewArm64.iss new file mode 100755 index 00000000..0adcf831 --- /dev/null +++ b/dist/win/qViewArm64.iss @@ -0,0 +1,176 @@ +#define MyAppName "qView" +#define MyAppPublisher "jurplel and qView contributors" +#define MyAppURL "https://interversehq.com/qview/" +#define MyAppExeName "qView.exe" + +; Update these when building +#define MyAppVersion "6.1" +#define MyAppYear "2023" + +[Setup] +AppId={{A6A9BAAB-C59E-4EAB-ACE1-3EEDE3031880} +AppName={#MyAppName} +AppPublisher={#MyAppPublisher} +AppVersion={#MyAppVersion} +AppVerName={#MyAppName} {#MyAppVersion} +AppPublisherURL={#MyAppURL} +AppSupportURL={#MyAppURL} +AppUpdatesURL={#MyAppURL} +DefaultDirName={autopf}\{#MyAppName} +LicenseFile=../../LICENSE +OutputBaseFilename={#MyAppName}-{#MyAppVersion}-winarm64 +SetupIconFile=qView.ico +WizardSmallImageFile=wiz-small.bmp +WizardImageFile=wiz.bmp +UninstallDisplayName={#MyAppName} +UninstallDisplayIcon={app}\{#MyAppExeName} +VersionInfoVersion={#MyAppVersion} +AppCopyright=Copyright © 2018-{#MyAppYear}, {#MyAppPublisher} +MinVersion=0,6.1 +DisableProgramGroupPage=yes +ChangesAssociations=yes +Compression=lzma +SolidCompression=yes +PrivilegesRequiredOverridesAllowed=dialog +ArchitecturesInstallIn64BitMode=arm64 +ArchitecturesAllowed=arm64 + +[Languages] +Name: "english"; MessagesFile: "compiler:Default.isl" + +[Tasks] +Name: "startentry"; Description: "Create a start menu shortcut"; GroupDescription: "{cm:AdditionalIcons}"; +Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked +Name: "fileassociation"; Description: "Create file associations"; GroupDescription: "Other:"; + +[Files] +Source: "qView-WinArm64/*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs +Source: "qView.VisualElementsManifest.xml"; DestDir: "{app}"; Flags: ignoreversion +Source: "win-tile-m.png"; DestDir: "{app}"; Flags: ignoreversion +Source: "win-tile-s.png"; DestDir: "{app}"; Flags: ignoreversion + +[Icons] +Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: startentry +Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon + +[Run] +Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent + +[Registry] +; Key that specifies exe path to file associations +Root: HKA; Subkey: "SOFTWARE\Classes\{#MyAppName}.1"; Flags: uninsdeletekey; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\{#MyAppName}.1\shell\open\command"; ValueType: string; ValueData: """{app}\{#MyAppExeName}"" ""%1"""; Tasks: fileassociation + +; File associations that point to the above key +Root: HKA; Subkey: "SOFTWARE\Classes\.bmp\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.cur\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.gif\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.icns\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.ico\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.jpeg\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.jpg\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.jpe\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.jfi\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.jfif\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.pbm\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.pgm\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.png\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.ppm\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.svg\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.svgz\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.tif\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.tiff\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.wbmp\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.webp\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.xbm\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.xpm\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +; plugins +Root: HKA; Subkey: "SOFTWARE\Classes\.ani\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.apng\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.avif\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.avifs\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.bw\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.exr\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.hdr\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.heic\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.heif\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.jxl\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.kra\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.ora\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.pcx\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.pic\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.psd\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.ras\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.rgb\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.rgba\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.sgi\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.tga\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation +Root: HKA; Subkey: "SOFTWARE\Classes\.xcf\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation + +; Capabilities keys for default programs/apps to work +Root: HKA; Subkey: "Software\{#MyAppName}"; Flags: uninsdeletekey; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities"; ValueType: string; ValueName: "ApplicationName"; ValueData: "{#MyAppName}"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities"; ValueType: string; ValueName: "ApplicationDescription"; ValueData: "Practical and minimal image viewer"; Tasks: fileassociation + +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".bmp"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".cur"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".gif"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".icns"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".ico"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".jpeg"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".jpg"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".jpe"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".jfi"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".jfif"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".pbm"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".pgm"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".png"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".ppm"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".svg"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".svgz"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".tif"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".tiff"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".wbmp"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".webp"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".xbm"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".xpm"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +; plugins +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".ani"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".apng"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".avif"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".avifs"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".bw"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".exr"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".hdr"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".heic"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".heif"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".jxl"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".kra"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".ora"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".pcx"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".pic"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".psd"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".ras"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".rgb"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".rgba"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".sgi"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".tga"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation +Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".xcf"; ValueData: "{#MyAppName}.1"; Tasks: fileassociation + +Root: HKA; Subkey: "Software\RegisteredApplications"; ValueType: string; ValueName: "qView"; ValueData: "Software\qView\Capabilities"; Flags: uninsdeletevalue; Tasks: fileassociation + +[Code] +// Prompt if you want to remove user data when uninstalling +// This is not for the file associations, but for the QSettings-created config files +procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); +begin + if CurUninstallStep = usPostUninstall then + begin + if MsgBox('Do you want to also delete saved settings?', + mbConfirmation, MB_YESNO) = IDYES + then + RegDeleteKeyIncludingSubkeys(HKEY_CURRENT_USER, 'Software\qView'); + RegDeleteKeyIncludingSubkeys(HKEY_LOCAL_MACHINE, 'Software\qView'); + RegDeleteKeyIncludingSubkeys(HKEY_LOCAL_MACHINE, 'Software\WOW6432node\qView'); + end; +end; From e076dc7fa5d5296a29ecab94ceb2c961ebc3f7ae Mon Sep 17 00:00:00 2001 From: "J.D. Purcell" Date: Tue, 25 Jun 2024 00:15:50 -0400 Subject: [PATCH 2/3] Update other installer scripts * Change encoding to UTF-8 w/ BOM. * Use x64compatible/x86compatible architectures. --- dist/win/qView32.iss | 8 ++++---- dist/win/qView64.iss | 11 +++++------ 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/dist/win/qView32.iss b/dist/win/qView32.iss index 5de11d42..134b9a04 100755 --- a/dist/win/qView32.iss +++ b/dist/win/qView32.iss @@ -1,4 +1,4 @@ -#define MyAppName "qView" +#define MyAppName "qView" #define MyAppPublisher "jurplel and qView contributors" #define MyAppURL "https://interversehq.com/qview/" #define MyAppExeName "qView.exe" @@ -25,14 +25,14 @@ WizardImageFile=wiz.bmp UninstallDisplayName={#MyAppName} UninstallDisplayIcon={app}\{#MyAppExeName} VersionInfoVersion={#MyAppVersion} -AppCopyright=Copyright © 2018-{#MyAppYear}, {#MyAppPublisher} +AppCopyright=Copyright © 2018-{#MyAppYear}, {#MyAppPublisher} MinVersion=0,6.1 DisableProgramGroupPage=yes ChangesAssociations=yes Compression=lzma SolidCompression=yes PrivilegesRequiredOverridesAllowed=dialog -ArchitecturesAllowed=x86 x64 +ArchitecturesAllowed=x86compatible [Languages] Name: "english"; MessagesFile: "compiler:Default.isl" @@ -43,7 +43,7 @@ Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{ Name: "fileassociation"; Description: "Create file associations"; GroupDescription: "Other:"; [Files] -Source: "qView-win32/*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs +Source: "qView-Win32/*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs Source: "qView.VisualElementsManifest.xml"; DestDir: "{app}"; Flags: ignoreversion Source: "win-tile-m.png"; DestDir: "{app}"; Flags: ignoreversion Source: "win-tile-s.png"; DestDir: "{app}"; Flags: ignoreversion diff --git a/dist/win/qView64.iss b/dist/win/qView64.iss index 00eb766d..a902017b 100755 --- a/dist/win/qView64.iss +++ b/dist/win/qView64.iss @@ -1,4 +1,4 @@ -#define MyAppName "qView" +#define MyAppName "qView" #define MyAppPublisher "jurplel and qView contributors" #define MyAppURL "https://interversehq.com/qview/" #define MyAppExeName "qView.exe" @@ -25,15 +25,15 @@ WizardImageFile=wiz.bmp UninstallDisplayName={#MyAppName} UninstallDisplayIcon={app}\{#MyAppExeName} VersionInfoVersion={#MyAppVersion} -AppCopyright=Copyright © 2018-{#MyAppYear}, {#MyAppPublisher} +AppCopyright=Copyright © 2018-{#MyAppYear}, {#MyAppPublisher} MinVersion=0,6.1 DisableProgramGroupPage=yes ChangesAssociations=yes Compression=lzma SolidCompression=yes PrivilegesRequiredOverridesAllowed=dialog -ArchitecturesInstallIn64BitMode=x64 -ArchitecturesAllowed=x64 +ArchitecturesInstallIn64BitMode=x64compatible +ArchitecturesAllowed=x64compatible [Languages] Name: "english"; MessagesFile: "compiler:Default.isl" @@ -44,7 +44,7 @@ Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{ Name: "fileassociation"; Description: "Create file associations"; GroupDescription: "Other:"; [Files] -Source: "qView-win64/*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs +Source: "qView-Win64/*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs Source: "qView.VisualElementsManifest.xml"; DestDir: "{app}"; Flags: ignoreversion Source: "win-tile-m.png"; DestDir: "{app}"; Flags: ignoreversion Source: "win-tile-s.png"; DestDir: "{app}"; Flags: ignoreversion @@ -107,7 +107,6 @@ Root: HKA; Subkey: "SOFTWARE\Classes\.sgi\OpenWithProgids"; ValueType: string; V Root: HKA; Subkey: "SOFTWARE\Classes\.tga\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation Root: HKA; Subkey: "SOFTWARE\Classes\.xcf\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppName}.1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassociation - ; Capabilities keys for default programs/apps to work Root: HKA; Subkey: "Software\{#MyAppName}"; Flags: uninsdeletekey; Tasks: fileassociation Root: HKA; Subkey: "Software\{#MyAppName}\Capabilities"; ValueType: string; ValueName: "ApplicationName"; ValueData: "{#MyAppName}"; Tasks: fileassociation From b3646759463b41bbbde71c573b14fd7c562b998e Mon Sep 17 00:00:00 2001 From: "J.D. Purcell" Date: Tue, 25 Jun 2024 00:21:38 -0400 Subject: [PATCH 3/3] Update Windows runners to 2022 --- .github/workflows/build.yml | 6 +++--- dist/scripts/download-plugins.ps1 | 2 +- dist/scripts/vcvars.ps1 | 11 ++++++----- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 50850d0b..34147dc2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -32,18 +32,18 @@ jobs: - runner: 'macos-12' qtVersion: '5.15.2' osSuffix: '_legacy' - - runner: 'windows-2019' + - runner: 'windows-2022' qtVersion: '6.5.3' qtArch: 'win64_msvc2019_64' osSuffix: '_64' qtModules: 'qtimageformats' - - runner: 'windows-2019' + - runner: 'windows-2022' qtVersion: '6.5.3' qtArch: 'win64_msvc2019_arm64' osSuffix: '_arm64' qtModules: 'qtimageformats' buildArch: 'Arm64' - - runner: 'windows-2019' + - runner: 'windows-2022' qtVersion: '5.15.2' qtArch: 'win32_msvc2019' osSuffix: '_32' diff --git a/dist/scripts/download-plugins.ps1 b/dist/scripts/download-plugins.ps1 index a36d64f3..d496979d 100755 --- a/dist/scripts/download-plugins.ps1 +++ b/dist/scripts/download-plugins.ps1 @@ -9,7 +9,7 @@ Write-Host "Detected Qt Version $qtVersion" # Qt version availability and runner names are assumed. if ($IsWindows) { - $imageName = "windows-2019" + $imageName = "windows-2022" } elseif ($IsMacOS) { $imageName = "macos-12" } else { diff --git a/dist/scripts/vcvars.ps1 b/dist/scripts/vcvars.ps1 index 1f635586..ae63eb37 100755 --- a/dist/scripts/vcvars.ps1 +++ b/dist/scripts/vcvars.ps1 @@ -8,12 +8,13 @@ $arch = $env:buildArch -eq 'X86' ? 'x64_x86' : $env:buildArch -eq 'Arm64' ? 'x64_arm64' : 'x64' -$path = Resolve-Path "${env:ProgramFiles(x86)}\Microsoft Visual Studio\*\*\VC\Auxiliary\Build" | select -ExpandProperty Path +$path = Resolve-Path "${env:ProgramFiles}\Microsoft Visual Studio\*\*\VC\Auxiliary\Build" | Select-Object -ExpandProperty Path cmd.exe /c "call `"$path\vcvarsall.bat`" $arch && set > %temp%\vcvars.txt" +$exclusions = @('VCPKG_ROOT') # Workaround for https://developercommunity.visualstudio.com/t/VCPKG_ROOT-is-being-overwritten-by-the-D/10430650 Get-Content "$env:temp\vcvars.txt" | Foreach-Object { - if ($_ -match "^(.*?)=(.*)$") { - Set-Content "env:\$($matches[1])" $matches[2] - } -} \ No newline at end of file + if ($_ -match "^(.*?)=(.*)$" -and $matches[1] -notin $exclusions) { + [Environment]::SetEnvironmentVariable($matches[1], $matches[2]) + } +}