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(?).
This commit is contained in:
Bruno 2024-07-13 15:49:40 -03:00
parent 60897f1700
commit bd28861785
No known key found for this signature in database
3 changed files with 198 additions and 207 deletions

View File

@ -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

View File

@ -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 {" <uap:FileType>." + $_} |
Foreach-Object {$_ + "</uap:FileType>"} | 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 {" <uap:FileType>." + $_} |
Foreach-Object {$_ + "</uap:FileType>"} | 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

View File

@ -29,7 +29,7 @@
<Resource uap:Scale="400" />
</Resources>
<Applications>
<Application Id="GIMP" Executable="VFS\ProgramFilesX64\GIMP @GIMP_APP_VERSION@\bin\gimp-@GIMP_APP_VERSION@.exe" EntryPoint="Windows.FullTrustApplication">
<Application Id="GIMP" Executable="VFS\ProgramFilesX64\GIMP\bin\gimp-@GIMP_APP_VERSION@.exe" EntryPoint="Windows.FullTrustApplication">
<uap:VisualElements DisplayName="GIMP @GIMP_VERSION@" Description="GNU Image Manipulation Program" BackgroundColor="transparent" Square150x150Logo="Assets\MedTile.png" Square44x44Logo="Assets\AppList.png">
<uap:DefaultTile Wide310x150Logo="Assets\WideTile.png" Square310x310Logo="Assets\LargeTile.png" Square71x71Logo="Assets\SmallTile.png">
<uap:ShowNameOnTiles>
@ -71,7 +71,7 @@
<Extensions>
<uap6:Extension Category="windows.loaderSearchPathOverride">
<uap6:LoaderSearchPathOverride>
<uap6:LoaderSearchPathEntry FolderPath="VFS\ProgramFilesX64\GIMP @GIMP_APP_VERSION@\bin"/>
<uap6:LoaderSearchPathEntry FolderPath="VFS\ProgramFilesX64\GIMP\bin"/>
</uap6:LoaderSearchPathOverride>
</uap6:Extension>
</Extensions>