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