From bd288617859debd39627166cf97f0add08296bf7 Mon Sep 17 00:00:00 2001 From: Bruno Date: Sat, 13 Jul 2024 15:49:40 -0300 Subject: [PATCH] build/windows: Refactor MSIX .ps1 a bit to not impose strict SDK or .msixbundle The original script required a specific WinSDK version. Now, it autodetects. This is useful if we need to move to another runner and welcome locally too. Also, downloading the arm64 artifact was mandatory to get a x64 msix, which is silly. Now, packagers are free to package to either arm64 or x64 alone. This is useful locally but could be useful on CI too when some arch fail(?). --- .gitlab-ci.yml | 4 +- build/windows/store/3_dist-gimp-winsdk.ps1 | 397 ++++++++++----------- build/windows/store/AppxManifest.xml | 4 +- 3 files changed, 198 insertions(+), 207 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b40424c923..d1573340e1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -816,10 +816,10 @@ dist-store-weekly: - win32-ps cache: [] script: - - build\windows\store\3_dist-gimp-winsdk.ps1 | Out-File -FilePath store.log + - build\windows\store\3_dist-gimp-winsdk.ps1 | Out-File -FilePath winsdk.log artifacts: expose_as: 'Windows msix' paths: - build/windows/store/_Output/ - - store.log + - winsdk.log expire_in: 8 days diff --git a/build/windows/store/3_dist-gimp-winsdk.ps1 b/build/windows/store/3_dist-gimp-winsdk.ps1 index d3cca725eb..ca7e703a80 100644 --- a/build/windows/store/3_dist-gimp-winsdk.ps1 +++ b/build/windows/store/3_dist-gimp-winsdk.ps1 @@ -1,227 +1,218 @@ #!/usr/bin/env pwsh # Parameters -param ($gimp_version, - $gimp_app_version, - $arch_a64 = 'gimp-a64', - $arch_x64 = 'gimp-x64') +param ($build_dir = '_build', + $a64_bundle = 'gimp-a64', + $x64_bundle = 'gimp-x64') +# Autodetects latest WinSDK installed +if ($Env:PROCESSOR_ARCHITECTURE -eq 'ARM64') + { + $cpu_arch = 'arm64' + } +else + { + $cpu_arch = 'x64' + } +$win_sdk_path = Resolve-Path "C:\Program Files (x86)\Windows Kits\10\bin\*\$cpu_arch" | Select-Object -Last 1 + # 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' +Set-Alias 'makepri' "$win_sdk_path\makepri.exe" +Set-Alias 'makeappx' 'C:\Program Files (x86)\Windows Kits\10\App Certification Kit\MakeAppx.exe' +Set-Alias 'signtool' "$win_sdk_path\signtool.exe" # Global variables -$config_path = '_build\config.h' +$config_path = "$build_dir\config.h" -## Identity Name (internal) and Display Name (in the Store) -$gimp_unstable = Get-Content -Path "$config_path" | Select-String 'GIMP_UNSTABLE' | +## Get Identity Name (the dir shown in Explorer) +$GIMP_UNSTABLE = Get-Content "$CONFIG_PATH" | Select-String 'GIMP_UNSTABLE' | Foreach-Object {$_ -replace '#define GIMP_UNSTABLE ',''} -if ($gimp_unstable -ne '1') +if ($GIMP_UNSTABLE -eq '1') { - $identity_name="GIMP.GIMP" - $display_name="GIMP" + $IDENTITY_NAME="GIMP.GIMPPreview" } else { - $identity_name="GIMP.GIMPPreview" - $display_name="GIMP (Preview)" + $IDENTITY_NAME="GIMP.GIMP" } -## GIMP version (major.minor.micro) -if (-Not $gimp_version) +## Get GIMP version (major.minor.micro) +$GIMP_VERSION = Get-Content "$CONFIG_PATH" | Select-String 'GIMP_VERSION' | + Foreach-Object {$_ -replace '#define GIMP_VERSION "',''} | Foreach-Object {$_ -replace '"',''} + + +# Autodetects what arch bundles will be packaged +Copy-Item .gitignore .gitignore.bak +$supported_archs = "$a64_bundle","$x64_bundle" +foreach ($bundle in $supported_archs) { - $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) - { - $gimp_app_version = Get-Content -Path "$config_path" | Select-String 'GIMP_APP_VERSION "' | - Foreach-Object {$_ -replace '#define GIMP_APP_VERSION "',''} | Foreach-Object {$_ -replace '"',''} - } - -## GIMP API version (stable_major.0) -if (-Not $gimp_api_version) - { - $gimp_api_version = Get-Content -Path "$config_path" | Select-String 'GIMP_PKGCONFIG_VERSION "' | - Foreach-Object {$_ -replace '#define GIMP_PKGCONFIG_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 Identity Name - (Get-Content -Path "$arch\AppxManifest.xml") | Foreach-Object {$_ -replace "@IDENTITY_NAME@","$identity_name"} | - Set-Content -Path "$arch\AppxManifest.xml" - - ## Set Display Name - (Get-Content -Path "$arch\AppxManifest.xml") | Foreach-Object {$_ -replace "@DISPLAY_NAME@","$display_name"} | - Set-Content -Path "$arch\AppxManifest.xml" - - ## 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 = '..\..\..\_build\build\windows\store\Assets' -if (Test-Path -Path "$icons_path") - { - foreach ($arch in $archsArray) + if (Test-Path "$bundle") { - New-Item -ItemType Directory -Path "$arch\Assets\" - Copy-Item -Path "$icons_path\*.png" -Destination "$arch\Assets\" -Recurse + if (("$bundle" -like '*a64*') -or ("$bundle" -like '*aarch64*') -or ("$bundle" -like '*arm64*')) + { + $msix_arch = 'arm64' + } + else + { + $msix_arch = 'x64' + } + + $ig_content = "`n$bundle`n$msix_arch`n*.appxsym`n*.zip" + if (Test-Path .gitignore -Type Leaf) + { + Add-Content .gitignore "$ig_content" + } + else + { + New-Item .gitignore + Set-Content .gitignore "$ig_content" + } + + New-Item $msix_arch -ItemType Directory + + + # 1. CONFIGURE MANIFEST + Copy-Item build\windows\store\AppxManifest.xml $msix_arch + + ## Set Identity Name + (Get-Content $msix_arch\AppxManifest.xml) | Foreach-Object {$_ -replace "@IDENTITY_NAME@","$IDENTITY_NAME"} | + Set-Content $msix_arch\AppxManifest.xml + + ## Set Display Name (the name shown in MS Store) + if ($GIMP_UNSTABLE -eq '1') + { + $display_name='GIMP (Preview)' + } + else + { + $display_name='GIMP' + } + (Get-Content $msix_arch\AppxManifest.xml) | Foreach-Object {$_ -replace "@DISPLAY_NAME@","$display_name"} | + Set-Content $msix_arch\AppxManifest.xml + + ## Set GIMP version + (Get-Content $msix_arch\AppxManifest.xml) | Foreach-Object {$_ -replace "@GIMP_VERSION@","$GIMP_VERSION"} | + Set-Content $msix_arch\AppxManifest.xml + + ## Set GIMP app version (major.minor) + $gimp_app_version = Get-Content "$CONFIG_PATH" | Select-String 'GIMP_APP_VERSION "' | + Foreach-Object {$_ -replace '#define GIMP_APP_VERSION "',''} | Foreach-Object {$_ -replace '"',''} + (Get-Content $msix_arch\AppxManifest.xml) | Foreach-Object {$_ -replace "@GIMP_APP_VERSION@","$gimp_app_version"} | + Set-Content $msix_arch\AppxManifest.xml + + ## Set msix_arch + (Get-Content $msix_arch\AppxManifest.xml) | Foreach-Object {$_ -replace "neutral","$msix_arch"} | + Set-Content $msix_arch\AppxManifest.xml + + ## Match supported filetypes + $file_types = Get-Content 'build\windows\installer\data_associations.list' | Foreach-Object {" ." + $_} | + Foreach-Object {$_ + ""} | Where-Object {$_ -notmatch 'xcf'} + (Get-Content $msix_arch\AppxManifest.xml) | Foreach-Object {$_ -replace "@FILE_TYPES@","$file_types"} | + Set-Content $msix_arch\AppxManifest.xml + + + # 2. CREATE ASSETS + + ## Copy pre-generated icons to each msix_arch + $icons_path = "$build_dir\build\windows\store\Assets" + if (Test-Path "$icons_path") + { + New-Item $msix_arch\Assets -ItemType Directory + Copy-Item "$icons_path\*.png" $msix_arch\Assets\ -Recurse + } + else + { + "(ERROR): MS Store icons not found. You can build them with '-Dms-store=true'" + exit 1 + } + + ## Generate resources.pri + Set-Location $msix_arch + makepri createconfig /cf priconfig.xml /dq lang-en-US /pv 10.0.0 + Set-Location ..\ + makepri new /pr $msix_arch /cf $msix_arch\priconfig.xml /of $msix_arch + Remove-Item $msix_arch\priconfig.xml + + + # 3. COPY GIMP FILES + $vfs = "$msix_arch\VFS\ProgramFilesX64\GIMP" + + ## Copy files into VFS folder (to support external 3P plug-ins) + Copy-Item "$bundle" "$vfs" -Recurse -Force + + ## Remove uneeded files (to match the Inno Windows Installer artifact) + Remove-Item "$vfs\gimp.cmd" + + ## Disable Update check (ONLY FOR RELEASES) + if ($CI_COMMIT_TAG -or ($GIMP_CI_MS_STORE -eq 'MSIXUPLOAD')) + { + Add-Content "$vfs\share\gimp\*\gimp-release" 'check-update=false' + } + + ## Remove uncompliant files (to avoid WACK/'signtool' issues) + Get-ChildItem "$vfs" -Recurse -Include ("*.debug", "*.tar") | Remove-Item -Recurse + + + # 4. MAKE .MSIX AND CORRESPONDING .APPXSYM + $MSIX_ARTIFACT = "${IDENTITY_NAME}_${GIMP_VERSION}.0_$msix_arch.msix" + $APPXSYM = $MSIX_ARTIFACT -replace '.msix','.appxsym' + + ## Make .appxsym for each msix_arch (ONLY FOR RELEASES) + #if ($CI_COMMIT_TAG -or ($GIMP_CI_MS_STORE -eq 'MSIXUPLOAD')) + # { + # Get-ChildItem $msix_arch -Filter *.pdb -Recurse | + # Compress-Archive -DestinationPath "${IDENTITY_NAME}_${GIMP_VERSION}.0_$msix_arch.zip" + # Get-ChildItem *.zip | Rename-Item -NewName $APPXSYM + # Get-ChildItem $msix_arch -Include *.pdb -Recurse -Force | Remove-Item -Recurse -Force + # } + + ## Make .msix from each msix_arch + makeappx pack /d $msix_arch /p $MSIX_ARTIFACT + Remove-Item $msix_arch/ -Recurse + } #END of 'if (Test-Path...' + } #END of 'foreach ($msix_arch...' + + +# 5. MAKE .MSIXBUNDLE AND SUBSEQUENT .MSIXUPLOAD +if ((Get-ChildItem *.msix -Recurse).Count -gt 1) + { + ## Make .msixbundle with all archs + ## (This is needed not only for easier multi-arch testing but + ## also to make sure against Partner Center getting confused) + $MSIX_ARTIFACT = "${IDENTITY_NAME}_${GIMP_VERSION}.0_neutral.msixbundle" + New-Item _TempOutput -ItemType Directory + Move-Item *.msix _TempOutput/ + makeappx bundle /bv "${GIMP_VERSION}.0" /d _TempOutput /p $MSIX_ARTIFACT + Remove-Item _TempOutput/ -Recurse + + ## Make .msixupload (ONLY FOR RELEASES) + if ($CI_COMMIT_TAG -or ($GIMP_CI_MS_STORE -eq 'MSIXUPLOAD')) + { + $MSIX_ARTIFACT = "${IDENTITY_NAME}_${GIMP_VERSION}.0_x64_arm64_bundle.msixupload" + Get-ChildItem *.msixbundle | ForEach-Object { Compress-Archive -Path "$($_.Basename).msixbundle" -DestinationPath "$($_.Basename).zip" } + Get-ChildItem *.zip | Rename-Item -NewName $MSIX_ARTIFACT + #Get-ChildItem *.appxsym | Remove-Item -Recurse -Force + Get-ChildItem *.msixbundle | Remove-Item -Recurse -Force } } -else + + +# 5. SIGN .MSIX OR .MSIXBUNDLE (FOR TESTING ONLY) AND DO OTHER STUFF +if (-not $CI_COMMIT_TAG -and ($GIMP_CI_MS_STORE -ne 'MSIXUPLOAD') -and ($MSIX_ARTIFACT -notlike "*msixupload")) + { + signtool sign /fd sha256 /a /f build\windows\store\pseudo-gimp.pfx /p eek $MSIX_ARTIFACT + Copy-Item build\windows\store\pseudo-gimp.pfx .\ -Recurse + } + +if ($GITLAB_CI) { - "MS Store icons not found. You can generate them adding '-Dms-store=true' option" - "at meson configure time." - exit 1 + # GitLab doesn't support wildcards when using "expose_as" so let's move to a dir + New-Item build\windows\store\_Output -ItemType Directory + Move-Item $MSIX_ARTIFACT build\windows\store\_Output + Get-ChildItem pseudo-gimp.pfx | Move-Item -Destination build\windows\store\_Output } -## 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) -Remove-Item "$vfs_a64\gimp.cmd" -Remove-Item "$vfs_x64\gimp.cmd" - -## Disable Update check (since the package is auto updated) -foreach ($vfs in $vfsArray) - { - Add-Content $vfs\share\gimp\$gimp_api_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 "_Output\${identity_name}_${gimp_version}.0_$arch.zip" -# Get-ChildItem "_Output\*.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\${identity_name}_${gimp_version}.0_$arch.msix" - Remove-Item "gimp-$arch" -Recurse - } - -## Make .msixbundle with all archs -## (This is needed not only for local testing but also -## to make sure against Partner Center getting confused) -makeappx bundle /bv "${gimp_version}.0" /d "_TempOutput\" /p "_Output\${identity_name}_${gimp_version}.0_neutral.msixbundle" -Remove-Item "_TempOutput\" -Recurse -Force - -## Make .msixupload -if ($CI_COMMIT_TAG -or ($GIMP_CI_MS_STORE -eq 'MSIXUPLOAD')) - { - Compress-Archive -Path "_Output\*" "_Output\${identity_name}_${gimp_version}.0_x64_arm64_bundle.zip" - Get-ChildItem "_Output\*.zip" | Rename-Item -NewName { $_.Name -replace '.zip','.msixupload' } - #Get-ChildItem "_Output\*.appxsym" | Remove-Item -Recurse -Force - } - - -# 5. SIGN .MSIXBUNDLE (FOR TESTING) -Copy-Item -Path "pseudo-gimp.pfx" -Destination "_Output\" -Recurse -SignTool sign /fd sha256 /a /f _Output\pseudo-gimp.pfx /p eek "_Output\${identity_name}_${gimp_version}.0_neutral.msixbundle" - - -# 6. TEST .MSIXUPLOAD OR .MSIXBUNDLE -if ($CI_COMMIT_TAG -or ($GIMP_CI_MS_STORE -eq 'MSIXUPLOAD')) - { - $MSIX_ARTIFACT="${identity_name}_${gimp_version}.0_x64_arm64_bundle.msixupload" - } -else - { - $MSIX_ARTIFACT="${identity_name}_${gimp_version}.0_neutral.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 - } +Remove-Item .gitignore +Rename-Item .gitignore.bak .gitignore diff --git a/build/windows/store/AppxManifest.xml b/build/windows/store/AppxManifest.xml index 92ed134ec3..72d65cb295 100644 --- a/build/windows/store/AppxManifest.xml +++ b/build/windows/store/AppxManifest.xml @@ -29,7 +29,7 @@ - + @@ -71,7 +71,7 @@ - +