From 184e2704a42f5bc75ef5d3c2d23da4cb5e9ba7c0 Mon Sep 17 00:00:00 2001 From: Bruno Lopes Date: Fri, 17 Nov 2023 13:03:18 -0300 Subject: [PATCH] build/windows: Add MS Store dist script Adds PowerShell script and proper manifest for making .msixupload (only for releases) and/or .msixbundle (always, for testing). As authorized by Jehan, 32-bit willn't be supported. The reasons are: 1. 32-bit is going to die when WIA plug-in is done. This can hurt reviews 2. 32-bit is being restricted in ARM64 version. This causes disparity 3. 32-bit is generating a big footprint. "This is bad for the environment" To be clear: we are discarding most of 32-bit artifact (see point 1) and what could not (TWAIN for x64 only, point 2) almost doubles .msix. There is one small circumstantial reason too: 4. 32-bit wouldn't have .pdb even after GCC 14 because bins have same name as x64, and MS don't allow multiarch debug symbols in the same .appxsym --- .../windows/gitlab-ci/4_dist-gimp-winsdk.ps1 | 204 ++++++++++++++++++ build/windows/store/AppxManifest.xml | 81 +++++++ build/windows/store/pseudo-gimp.pfx | Bin 0 -> 2710 bytes plug-ins/twain/meson.build | 2 +- 4 files changed, 286 insertions(+), 1 deletion(-) create mode 100644 build/windows/gitlab-ci/4_dist-gimp-winsdk.ps1 create mode 100644 build/windows/store/AppxManifest.xml create mode 100644 build/windows/store/pseudo-gimp.pfx diff --git a/build/windows/gitlab-ci/4_dist-gimp-winsdk.ps1 b/build/windows/gitlab-ci/4_dist-gimp-winsdk.ps1 new file mode 100644 index 0000000000..58c3f6f51c --- /dev/null +++ b/build/windows/gitlab-ci/4_dist-gimp-winsdk.ps1 @@ -0,0 +1,204 @@ +#!/usr/bin/env pwsh + +# Parameters +param ($gimp_version, + $gimp_app_version, + $arch_a64 = 'gimp-a64', + $arch_x64 = 'gimp-x64') + + +# Needed tools from Windows SDK +Set-Alias -Name 'makepri' -Value "C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64\makepri.exe" +Set-Alias -Name 'makeappx' -Value 'C:\Program Files (x86)\Windows Kits\10\App Certification Kit\MakeAppx.exe' +Set-Alias -Name 'signtool' -Value 'C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64\signtool.exe' + + +# Global variables + +## GIMP version (major.minor.micro) +if (-Not $gimp_version) + { + $config_path = Resolve-Path -Path "_build-*\config.h" | Select-Object -ExpandProperty Path + $gimp_version = Get-Content -Path "$config_path" | Select-String 'GIMP_VERSION' | + Foreach-Object {$_ -replace '#define GIMP_VERSION "',''} | Foreach-Object {$_ -replace '"',''} + } + +## GIMP app version (major.minor) +if (-Not $gimp_app_version) + { + $config_path = Resolve-Path -Path "_build-*\config.h" | Select-Object -ExpandProperty Path + $gimp_app_version = Get-Content -Path "$config_path" | Select-String 'GIMP_APP_VERSION "' | + Foreach-Object {$_ -replace '#define GIMP_APP_VERSION "',''} | Foreach-Object {$_ -replace '"',''} + } + +## GIMP arch folders +$vfs_a64 = "$arch_a64\VFS\ProgramFilesX64\GIMP ${gimp_app_version}" +$vfs_x64 = "$arch_x64\VFS\ProgramFilesX64\GIMP ${gimp_app_version}" +$archsArray = "$arch_a64","$arch_x64" +$vfsArray = "$vfs_a64","$vfs_x64" + +Set-Location build\windows\store\ +New-Item -Path "." -Name ".gitignore" -ItemType "File" -Force +Set-Content ".gitignore" "$arch_a64`n$arch_x64`n_TempOutput`n_Output" + + +# 1. CONFIGURE MANIFEST +function Configure-Arch ([string]$arch, [string]$arch_msix) +{ + New-Item -ItemType Directory -Path $arch + Copy-Item AppxManifest.xml $arch + + ## Set GIMP version + (Get-Content -Path "$arch\AppxManifest.xml") | Foreach-Object {$_ -replace "@GIMP_VERSION@","$gimp_version"} | + Set-Content -Path "$arch\AppxManifest.xml" + + ## Set GIMP app version + (Get-Content -Path "$arch\AppxManifest.xml") | Foreach-Object {$_ -replace "@GIMP_APP_VERSION@","$gimp_app_version"} | + Set-Content -Path "$arch\AppxManifest.xml" + + ## Set arch + (Get-Content -Path "$arch\AppxManifest.xml") | Foreach-Object {$_ -replace "neutral","$arch_msix"} | + Set-Content -Path "$arch\AppxManifest.xml" + + ## Match supported filetypes + $file_types = Get-Content -Path '..\installer\data_associations.list' | Foreach-Object {" ." + $_} | + Foreach-Object {$_ + ""} | + Where-Object {$_ -notmatch 'xcf'} + (Get-Content -Path "$arch\AppxManifest.xml") | Foreach-Object {$_ -replace "@FILE_TYPES@","$file_types"} | + Set-Content -Path "$arch\AppxManifest.xml" +} + +Configure-Arch "$arch_a64" 'arm64' +Configure-Arch "$arch_x64" 'x64' + + +# 2. CREATE ASSETS + +## Copy pre-generated icons to each arch +$icons_path = Resolve-Path -Path "..\..\..\_build-*\build\windows\store\Assets" +if (Test-Path -Path "$icons_path") + { + foreach ($arch in $archsArray) + { + New-Item -ItemType Directory -Path "$arch\Assets\" + Copy-Item -Path "$icons_path\*.png" -Destination "$arch\Assets\" -Recurse + } + } +else + { + "MS Store icons not found. You can generate them adding '-Dms-store=true' option" + "at meson configure time." + exit 1 + } + +## Generate resources.pri +foreach ($arch in $archsArray) + { + Set-Location $arch + makepri createconfig /cf priconfig.xml /dq lang-en-US /pv 10.0.0 + Set-Location ..\ + makepri new /pr $arch /cf $arch\priconfig.xml /of $arch + Remove-Item "$arch\priconfig.xml" + } + + +# 3. COPY GIMP FILES + +## Copy files into VFS folder (to support external 3P plug-ins) +Copy-Item -Path "..\..\..\$arch_a64" -Destination "$vfs_a64" -Recurse +Copy-Item -Path "..\..\..\$arch_x64" -Destination "$vfs_x64" -Recurse + +## Remove uneeded files (to match the Inno Windows Installer artifact) +$omissions = ("include\", "lib\gimp\${gimp_app_version}\plug-ins\test-sphere-v3\", "lib\gimp\${gimp_app_version}\plug-ins\ts-helloworld\", "share\gir-1.0\", "share\man\", "share\vala\", "gimp.cmd", "README.txt") +Set-Location $vfs_a64 +Remove-Item $omissions -Recurse +Set-Location ..\..\..\..\$vfs_x64 +Remove-Item $omissions -Recurse +Set-Location ..\..\..\..\ + +## Disable Update check (since the package is auto updated) +foreach ($vfs in $vfsArray) + { + Add-Content $vfs\share\gimp\$gimp_app_version\gimp-release "check-update=false" + } + +## Remove uncompliant files (to fix 'signtool' issues) +$corrections = ("*.debug", "*.tar") +foreach ($vfs in $vfsArray) + { + Get-ChildItem $vfs -Recurse -Include $corrections | Remove-Item -Recurse + } + + +# 4. MAKE .MSIXUPLOAD (ONLY FOR RELEASES) +New-Item -ItemType Directory -Path "_TempOutput" +New-Item -ItemType Directory -Path "_Output" +$archsArray_limited = $archsArray -replace "gimp-", "" + +## Make .appxsym for each arch +if ($CI_COMMIT_TAG -or ($GIMP_CI_MS_STORE -eq 'MSIXUPLOAD')) + { + foreach ($arch in $archsArray_limited) + { + Get-ChildItem -Path "gimp-$arch" -Filter "*.pdb" -Recurse | + Compress-Archive -DestinationPath "_TempOutput\gimp-${gimp_version}_$arch.zip" + Get-ChildItem "_TempOutput\*.zip" | Rename-Item -NewName { $_.Name -replace '.zip','.appxsym' } + } + } + +## Make .msix for each arch (this is needed to make the .msixbundle too) +foreach ($arch in $archsArray_limited) + { + Get-ChildItem "gimp-$arch" -Include "*.pdb" -Recurse -Force | Remove-Item -Recurse -Force + makeappx pack /d "gimp-$arch" /p "_TempOutput\gimp-${gimp_version}_$arch.msix" + Remove-Item "gimp-$arch" -Recurse + } + +## Make .msixupload +if ($CI_COMMIT_TAG -or ($GIMP_CI_MS_STORE -eq 'MSIXUPLOAD')) + { + Compress-Archive -Path "_TempOutput\*" "_Output\gimp-${gimp_version}-store.zip" + Get-ChildItem "_Output\*.zip" | Rename-Item -NewName { $_.Name -replace '.zip','.msixupload' } + Get-ChildItem "_TempOutput\*.appxsym" | Remove-Item -Recurse -Force + } + + +# 5. MAKE .MSIXBUNDLE + +## Make .msixbundle with all archs +makeappx bundle /bv "${gimp_version}.0" /d "_TempOutput\" /p "_Output\gimp-${gimp_version}-local.msixbundle" +Remove-Item "_TempOutput\" -Recurse + +## Sign .msixbundle +Copy-Item -Path "pseudo-gimp.pfx" -Destination "_Output\" -Recurse +SignTool sign /fd sha256 /a /f _Output\pseudo-gimp.pfx /p eek "_Output\gimp-${gimp_version}-local.msixbundle" + + +# 6. TEST .MSIXUPLOAD OR .MSIXBUNDLE +if ($CI_COMMIT_TAG -or ($GIMP_CI_MS_STORE -eq 'MSIXUPLOAD')) + { + $MSIX_ARTIFACT="gimp-${gimp_version}-store.msixupload" + } +else + { + $MSIX_ARTIFACT="gimp-${gimp_version}-local.msixbundle" + } + +if (Test-Path -Path "_Output\${MSIX_ARTIFACT}" -PathType Leaf) + { + Set-Location _Output\ + Get-FileHash $MSIX_ARTIFACT -Algorithm SHA256 | Out-File -FilePath "${MSIX_ARTIFACT}.SHA256SUMS" + Get-FileHash $MSIX_ARTIFACT -Algorithm SHA512 | Out-File -FilePath "${MSIX_ARTIFACT}.SHA512SUMS" + + ### Return to git golder + Set-Location ..\..\..\..\ + + exit 0 + } +else + { + ### Return to git golder + Set-Location ..\..\..\ + + exit 1 + } diff --git a/build/windows/store/AppxManifest.xml b/build/windows/store/AppxManifest.xml new file mode 100644 index 0000000000..86dfa9187c --- /dev/null +++ b/build/windows/store/AppxManifest.xml @@ -0,0 +1,81 @@ + + + + + GIMP + GIMP + GNU Image Manipulation Program + Assets\StoreLogo.png + + + + + + + + + + + + + + + + + + + + + + + + + + + eXperimental Computing Facility file + Assets\fileicon.png + + .xcf + + + + + + Assets\fileicon.png + + @FILE_TYPES@ + + + + + + + + + + + UTF-8 + + + + + + + + + + + + + + diff --git a/build/windows/store/pseudo-gimp.pfx b/build/windows/store/pseudo-gimp.pfx new file mode 100644 index 0000000000000000000000000000000000000000..e9b749b614a6b844c45df78fc65dd6d8b94087a8 GIT binary patch literal 2710 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