You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
249 lines
10 KiB
249 lines
10 KiB
name: Windows
|
|
|
|
on:
|
|
workflow_call:
|
|
workflow_dispatch:
|
|
|
|
jobs:
|
|
# NOTE: This job uses a fixed Qt version (set in the 'qt-version' key below)!
|
|
# So, remember to keep it updated whenever a new Qt version is available on aqtinstall.
|
|
build-aqtinstall:
|
|
name: Build (${{ matrix.arch }}, ${{ matrix.build-type }}, Qt ${{ matrix.qt-version }}, ${{ matrix.os }})
|
|
runs-on: ${{ matrix.os }}
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
include:
|
|
- os: windows-2019
|
|
arch: x64
|
|
qt-version: 5.15.2
|
|
build-type: release
|
|
|
|
- os: windows-2019
|
|
arch: x86
|
|
qt-version: 5.15.2
|
|
build-type: release
|
|
|
|
- os: windows-2019
|
|
arch: x64
|
|
qt-version: 6.4.3
|
|
build-type: release
|
|
outputs:
|
|
version: ${{ steps.vars.outputs.version }}
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@v4
|
|
with:
|
|
submodules: recursive
|
|
|
|
- name: Setup variables
|
|
id: vars
|
|
run: |
|
|
$version = Select-String -Path CMakeLists.txt -CaseSensitive -Pattern '\bAPP_VERSION +([^)]+)' | Select-Object -First 1 | %{$_.Matches.Groups[1].value}
|
|
if (!$version) {
|
|
throw "Failed to extract app version from CMakeLists.txt."
|
|
}
|
|
if ('${{ github.ref_type }}' -ne 'tag') {
|
|
$version += "+g$($env:GITHUB_SHA.Substring(0,7))"
|
|
}
|
|
$artifact_name = "Notes_$version-Qt${{ matrix.qt-version }}-${{ matrix.arch }}"
|
|
Write-Output "version=$version" >> $env:GITHUB_OUTPUT
|
|
Write-Output "artifact_name=$artifact_name" >> $env:GITHUB_OUTPUT
|
|
|
|
- name: Setup MSVC (${{ matrix.arch }})
|
|
uses: ilammy/msvc-dev-cmd@v1
|
|
with:
|
|
arch: ${{ matrix.arch }}
|
|
|
|
- name: Install Qt ${{ matrix.qt-version }} (aqtinstall, ${{ matrix.arch }})
|
|
uses: jurplel/install-qt-action@v3
|
|
with:
|
|
version: ${{ matrix.qt-version }}
|
|
cache: true
|
|
arch: ${{ matrix.arch == 'x86' && 'win32_msvc2019' || 'win64_msvc2019_64' }}
|
|
|
|
# Details about this OpenSSL build: https://kb.firedaemon.com/support/solutions/articles/4000121705
|
|
# TODO: Remove/tweak this step if/when we get rid of the x86 build or upgrade to Qt 6.5+.
|
|
- name: Download OpenSSL 1.x binaries from FireDaemon
|
|
if: ${{ startsWith(matrix.qt-version, '5.') || startsWith(matrix.qt-version, '6.4.') }}
|
|
run: |
|
|
$out_file = "openssl-1.1.1w.zip"
|
|
Invoke-WebRequest -Uri https://download.firedaemon.com/FireDaemon-OpenSSL/openssl-1.1.1w.zip -OutFile $env:Temp\$out_file
|
|
Expand-Archive -Path $env:Temp\$out_file -DestinationPath $env:Temp
|
|
Rename-Item $env:Temp\openssl-1.1 $env:Temp\OpenSSL
|
|
|
|
- name: Setup MSVC problem matcher
|
|
uses: ammaraskar/msvc-problem-matcher@0.3.0
|
|
|
|
- name: Build (${{ matrix.build-type }}, ${{ matrix.arch }})
|
|
env:
|
|
VERBOSE: 1
|
|
run: |
|
|
$env:CMAKE_BUILD_PARALLEL_LEVEL = $env:NUMBER_OF_PROCESSORS
|
|
cmake . --warn-uninitialized --warn-unused-vars `
|
|
-B build -G Ninja `
|
|
-DCMAKE_BUILD_TYPE=${{ matrix.build-type }} `
|
|
-DGIT_REVISION=${{ github.ref_type != 'tag' && 'ON' || 'OFF' }} `
|
|
-DPRO_VERSION=OFF
|
|
cmake --build build
|
|
|
|
- name: (FIXME) Run qmllint
|
|
if: startsWith(matrix.qt-version, '6.')
|
|
run: |
|
|
cmake --build build --target all_qmllint || $(exit 0)
|
|
|
|
- name: Install (${{ matrix.build-type }}, ${{ matrix.arch }})
|
|
run: |
|
|
cmake --install build --prefix build
|
|
|
|
- name: Deploy (${{ matrix.build-type }}, ${{ matrix.arch }})
|
|
run: |
|
|
windeployqt ${{ startsWith(matrix.qt-version, '5.') && '--no-qmltooling' || ' ' }} --qmldir src\qml build\bin
|
|
|
|
- name: Remove unnecessary Qt plugins and libraries
|
|
run: |
|
|
Set-Location build\bin
|
|
# We ship all required runtime DLLs individually.
|
|
Remove-Item -Verbose vc_redist.*.exe
|
|
if ('${{ matrix.qt-version }}'.StartsWith('5.')) {
|
|
# The bearer plugin has caused problems for us in the past. Plus, it was removed altogether in Qt 6.
|
|
Remove-Item -Verbose -Recurse bearer
|
|
}
|
|
# We only use the SQLite Qt driver, so it's fine to delete others.
|
|
Remove-Item -Verbose sqldrivers\qsqlodbc.dll
|
|
Remove-Item -Verbose sqldrivers\qsqlpsql.dll
|
|
|
|
- name: Include required runtime libraries (${{ matrix.build-type }}, ${{ matrix.arch }})
|
|
run: |
|
|
Set-Location build\bin
|
|
|
|
if ('${{ matrix.arch }}' -ieq 'x64') {
|
|
$openssl_lib_suffix = '-x64'
|
|
} else {
|
|
$openssl_lib_suffix = ''
|
|
}
|
|
|
|
# Include OpenSSL libraries.
|
|
Copy-Item $env:Temp\OpenSSL\${{ matrix.arch }}\bin\libcrypto-1_1$openssl_lib_suffix.dll
|
|
Copy-Item $env:Temp\OpenSSL\${{ matrix.arch }}\bin\libssl-1_1$openssl_lib_suffix.dll
|
|
|
|
# Also include OpenSSL debug symbols (when building Notes in debug mode).
|
|
if ('${{ matrix.build-type }}' -ieq 'debug') {
|
|
Copy-Item $env:Temp\OpenSSL\${{ matrix.arch }}\bin\libcrypto-1_1$openssl_lib_suffix.pdb
|
|
Copy-Item $env:Temp\OpenSSL\${{ matrix.arch }}\bin\libssl-1_1$openssl_lib_suffix.pdb
|
|
}
|
|
|
|
# Include MSVC 2019 runtime libraries.
|
|
if ('${{ matrix.build-type }}' -ieq 'release') {
|
|
Copy-Item $env:VCToolsRedistDir\${{ matrix.arch }}\Microsoft.VC142.CRT\msvcp140.dll
|
|
Copy-Item $env:VCToolsRedistDir\${{ matrix.arch }}\Microsoft.VC142.CRT\msvcp140_1.dll
|
|
|
|
# Only Qt 6 builds also need msvcp140_2.dll
|
|
if ('${{ matrix.qt-version }}'.StartsWith('6')) {
|
|
Copy-Item $env:VCToolsRedistDir\${{ matrix.arch }}\Microsoft.VC142.CRT\msvcp140_2.dll
|
|
}
|
|
|
|
Copy-Item $env:VCToolsRedistDir\${{ matrix.arch }}\Microsoft.VC142.CRT\vcruntime140.dll
|
|
if ('${{ matrix.arch }}' -ieq 'x64') {
|
|
# Only 64-bit builds also need 'vcruntime140_1.dll' (tested on Windows 7)
|
|
Copy-Item $env:VCToolsRedistDir\${{ matrix.arch }}\Microsoft.VC142.CRT\vcruntime140_1.dll
|
|
}
|
|
} else {
|
|
# On debug builds, the libraries above are included automatically, so we only need 'urtcbased.dll'.
|
|
Copy-Item $env:WindowsSdkBinPath\${{ matrix.arch }}\ucrt\ucrtbased.dll
|
|
}
|
|
|
|
- name: Upload artifacts (${{ matrix.build-type }}, ${{ matrix.arch }})
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
if-no-files-found: error
|
|
name: ${{ steps.vars.outputs.artifact_name }}-${{ runner.os }}-${{ matrix.build-type }}
|
|
path: build\bin
|
|
|
|
unified-installer:
|
|
name: Unified x64-x86 Installer
|
|
needs: build-aqtinstall
|
|
runs-on: windows-2019
|
|
steps:
|
|
- name: Checkout code to grab the ISS script
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Download build artifacts from previous job
|
|
uses: actions/download-artifact@v4
|
|
with:
|
|
path: artifacts
|
|
pattern: '*Windows*'
|
|
|
|
- name: Ensure a 64-bit Qt 6 build is present
|
|
run: |
|
|
Set-Location artifacts
|
|
$x64_build = Get-ChildItem -Filter '*Qt6*-x64-Windows-release' -Attributes Directory |
|
|
Sort-Object -Property @{Expression = "Name"; Descending = $true} |
|
|
Select-Object -First 1
|
|
if (!$x64_build) {
|
|
Throw 'Could not find a 64-bit Qt 6 build.'
|
|
}
|
|
Move-Item $x64_build Notes64
|
|
|
|
- name: Ensure a 32-bit Qt 5 build is present
|
|
run: |
|
|
Set-Location artifacts
|
|
$x86_build = Get-ChildItem -Filter '*Qt5*-x86-Windows-release' -Attributes Directory |
|
|
Sort-Object -Property @{Expression = "Name"; Descending = $true} |
|
|
Select-Object -First 1
|
|
if (!$x86_build) {
|
|
Throw 'Could not find a 32-bit Qt 5 build.'
|
|
}
|
|
Move-Item $x86_build Notes32
|
|
|
|
- name: Create unified installer
|
|
run: |
|
|
Set-Location artifacts
|
|
Copy-Item ..\packaging\windows\Notes_Inno_Script_Github.iss
|
|
$env:APP_VERSION = '${{ needs.build-aqtinstall.outputs.version }}'
|
|
iscc /Oinstaller Notes_Inno_Script_Github.iss
|
|
|
|
# This step makes sure that all files copied by windeployqt are also included in the final installer.
|
|
# This is done by parsing the 'Set-Manifest.txt' file, which is generated by Inno Setup:
|
|
# https://jrsoftware.org/ishelp/index.php?topic=setup_outputmanifestfile
|
|
- name: Verify installer files
|
|
run: |
|
|
Set-Location artifacts
|
|
$inno_setup_manifest = ".\installer\Setup-Manifest.txt"
|
|
$windeployqt_paths = @(".\Notes32", ".\Notes64")
|
|
|
|
$inno_setup_files = @()
|
|
Get-Content -LiteralPath $inno_setup_manifest -ErrorAction Stop | Select-Object -Skip 1 | Foreach-Object {
|
|
$path = ($_ -Split "\t")[1] # We only need the second column, which refers to the absolute path of the file.
|
|
$inno_setup_files += (Resolve-Path $path).ToString()
|
|
}
|
|
|
|
$missing_files = 0
|
|
Get-ChildItem -File -LiteralPath $windeployqt_paths -Recurse -ErrorAction Stop | Foreach-Object {
|
|
$path = (Resolve-Path $_).ToString()
|
|
if ($path -NotIn $inno_setup_files) {
|
|
Write-Host "File '$path' was not included in Inno Setup's list of files." -ForegroundColor Yellow
|
|
$missing_files++
|
|
}
|
|
}
|
|
|
|
if ($missing_files -gt 0) {
|
|
$is_plural = $missing_files -gt 1
|
|
Write-Host ""
|
|
Write-Host ("ERROR: {0} {1} previously copied by windeployqt {2} missing from Inno Setup's list of files." `
|
|
-F $missing_files, ($is_plural ? "files" : "file"), ($is_plural ? "are" : "is")) `
|
|
-ForegroundColor DarkRed
|
|
Write-Host (" Did you forget to include {0} in '.\packaging\windows\Notes_Inno_Script_Github.iss'?" `
|
|
-F ($is_plural ? "them" : "it")) `
|
|
-ForegroundColor DarkRed
|
|
Exit 1
|
|
}
|
|
Write-Host "SUCCESS: List of files in the installer matches the ones copied by windeployqt."
|
|
|
|
- name: Upload unified installer artifact
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
if-no-files-found: error
|
|
name: NotesSetup_${{ needs.build-aqtinstall.outputs.version }}-${{ runner.os }}-release
|
|
path: artifacts\installer
|