Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .github/autobuild/ios-dependencies.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#!/bin/bash

# Values are consumed by ios.sh and the dependency cache key.
# shellcheck disable=SC2034
AQTINSTALL_VERSION=3.3.0
QT_VERSION=5.15.2
18 changes: 10 additions & 8 deletions .github/autobuild/ios.sh
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,12 @@

set -eu

QT_DIR=/opt/qt
# The following version pinnings are semi-automatically checked for
# updates. Verify .github/workflows/bump-dependencies.yaml when changing those manually:
AQTINSTALL_VERSION=3.3.0
PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
readonly PROJECT_DIR
# shellcheck disable=SC1091
source "${PROJECT_DIR}/.github/autobuild/ios-dependencies.sh"

QT_DIR=${HOME}/qt

if [[ ! ${QT_VERSION:-} =~ [0-9]+\.[0-9]+\..* ]]; then
echo "Environment variable QT_VERSION must be set to a valid Qt version"
Expand All @@ -63,13 +65,13 @@ if [[ ! ${JAMULUS_BUILD_VERSION:-} =~ [0-9]+\.[0-9]+\.[0-9]+ ]]; then
fi

setup() {
if [[ -d "${QT_DIR}" ]]; then
# We may need to create the Qt installation directory and chown it to the runner user to fix permissions
sudo mkdir -p "${QT_DIR}"
sudo chown -R "$(whoami)" "${QT_DIR}"
if [[ -x "${QT_DIR}/${QT_VERSION}/ios/bin/qmake" ]]; then
echo "Using Qt installation from previous run (actions/cache)"
else
echo "Installing Qt"
# We may need to create the Qt installation directory and chown it to the runner user to fix permissions
sudo mkdir -p "${QT_DIR}"
sudo chown "$(whoami)" "${QT_DIR}"
# Create and enter virtual environment
python3 -m venv venv
# Must hide directory as it just gets created during execution of the previous command and cannot be found by shellcheck
Expand Down
7 changes: 7 additions & 0 deletions .github/autobuild/mac-dependencies_qt5.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#!/bin/bash

# Values are consumed by .github/autobuild/mac.sh, mac/deploy-mac.sh and the dependency cache key.
# shellcheck disable=SC2034
AQTINSTALL_VERSION=3.3.0
QT_VERSION=5.15.2
CREATEDMG_VERSION=1.3.0
7 changes: 7 additions & 0 deletions .github/autobuild/mac-dependencies_qt6.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#!/bin/bash

# Values are consumed by .github/autobuild/mac.sh, mac/deploy-mac.sh and the dependency cache key.
# shellcheck disable=SC2034
AQTINSTALL_VERSION=3.3.0
QT_VERSION=6.10.2
CREATEDMG_VERSION=1.3.0
14 changes: 9 additions & 5 deletions .github/autobuild/mac.sh
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,13 @@

set -eu

QT=${QT:-6}
PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
readonly PROJECT_DIR
# shellcheck disable=SC1090
source "${PROJECT_DIR}/.github/autobuild/mac-dependencies_qt${QT}.sh"

QT_DIR=~/qt
# The following version pinnings are semi-automatically checked for
# updates. Verify .github/workflows/bump-dependencies.yaml when changing those manually:
AQTINSTALL_VERSION=3.3.0

TARGET_ARCHS="${TARGET_ARCHS:-}"

Expand All @@ -65,7 +68,8 @@ if [[ ! ${JAMULUS_BUILD_VERSION:-} =~ [0-9]+\.[0-9]+\.[0-9]+ ]]; then
fi

setup() {
if [[ -d "${QT_DIR}" ]]; then
if [[ -x "${QT_DIR}/${QT_VERSION}/macos/bin/qmake" &&
-x "${QT_DIR}/${QT_VERSION}/macos/bin/macdeployqt" ]]; then
echo "Using Qt installation from previous run (actions/cache)"
else
echo "Installing Qt..."
Expand Down Expand Up @@ -194,7 +198,7 @@ build_app_as_dmg_installer() {
if prepare_signing; then
BUILD_ARGS=("-s" "${MACOS_CERTIFICATE_DEV_ID_APPLICATION_ID}" "-a" "${MAC_STORE_APP_CERT_ID}" "-i" "${MACOS_CERTIFICATE_INST_DISTRIBUTION_ID}" "-k" "${KEYCHAIN_PASSWORD}")
fi
TARGET_ARCHS="${TARGET_ARCHS}" ./mac/deploy_mac.sh "${BUILD_ARGS[@]}"
QT=${QT} TARGET_ARCHS="${TARGET_ARCHS}" ./mac/deploy_mac.sh "${BUILD_ARGS[@]}"
}

pass_artifact_to_job() {
Expand Down
19 changes: 19 additions & 0 deletions .github/autobuild/windows-dependencies.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# The following version pinnings are semi-automatically checked for updates.
# Verify .github/workflows/bump-dependencies.yaml when changing those manually:

# Values are consumed by .github/autobuild/windows.ps1, windows/deploy_windows.ps1 and the dependency cache key.
$Qt32Version = "5.15.2"
$Qt64Version = "6.8.1"
$QtCompile32 = "msvc2019"
$QtCompile64 = "msvc2022"
$AqtinstallVersion = "3.3.0"
$JackVersion = "1.9.22"
$JomVersion = "1.1.2"

# Important:
# - Do not update ASIO SDK without checking for license-related changes.
# - Do not copy (parts of) the ASIO SDK into the Jamulus source tree without
# further consideration as it would make the license situation more complicated.
$AsioSDKVersion = "ASIO-SDK_2.3.4_2025-10-15"

$NsisVersion = "3.12"
23 changes: 10 additions & 13 deletions .github/autobuild/windows.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -68,15 +68,11 @@ $ProgressPreference = 'SilentlyContinue'
$QtDir = 'C:\Qt'
$ChocoCacheDir = 'C:\ChocoCache'
$DownloadCacheDir = 'C:\AutobuildCache'
# The following version pinnings are semi-automatically checked for
# updates. Verify .github/workflows/bump-dependencies.yaml when changing those manually:
$Qt32Version = "5.15.2"
$Qt64Version = "6.10.2"
$AqtinstallVersion = "3.3.0"
$JackVersion = "1.9.22"
$Msvc32Version = "win32_msvc2019"
$Msvc64Version = "win64_msvc2022_64"
$JomVersion = "1.1.2"
$DependencySuffix = ''
. "$PSScriptRoot\windows-dependencies.ps1"

$Msvc32Version = "${QtCompile32}"
$Msvc64Version = "${QtCompile64}_64"

# Compose JACK download urls
$JackBaseUrl = "https://github.com/jackaudio/jack2-releases/releases/download/v${JackVersion}/jack2-win"
Expand Down Expand Up @@ -150,7 +146,8 @@ Function Install-Qt

Function Ensure-Qt
{
if ( Test-Path -Path $QtDir )
if ( (Test-Path -Path "$QtDir\$Qt32Version\${Msvc32Version}\bin\qmake.exe" -PathType Leaf) -and
(Test-Path -Path "$QtDir\$Qt64Version\${Msvc64Version}\bin\qmake.exe" -PathType Leaf) )
{
echo "Using Qt installation from previous run (actions/cache)"
return
Expand All @@ -165,10 +162,10 @@ Function Ensure-Qt
}

echo "Get Qt 64 bit..."
Install-Qt "${Qt64Version}" "${Msvc64Version}"
Install-Qt "${Qt64Version}" "win64_${Msvc64Version}"

echo "Get Qt 32 bit..."
Install-Qt "${Qt32Version}" "${Msvc32Version}"
Install-Qt "${Qt32Version}" "win32_${Msvc32Version}"
}

Function Ensure-jom
Expand Down Expand Up @@ -238,7 +235,7 @@ Function Build-App-With-Installer
{
$ExtraArgs += ("-BuildOption", $BuildOption)
}
powershell ".\windows\deploy_windows.ps1" "C:\Qt\${Qt32Version}" "C:\Qt\${Qt64Version}" @ExtraArgs
powershell ".\windows\deploy_windows.ps1" @ExtraArgs
if ( !$? )
{
throw "deploy_windows.ps1 failed with exit code $LastExitCode"
Expand Down
34 changes: 28 additions & 6 deletions .github/workflows/autobuild.yml
Original file line number Diff line number Diff line change
Expand Up @@ -226,47 +226,52 @@ jobs:
- config_name: MacOS (artifacts)
target_os: macos
building_on_os: macos-15
base_command: QT_VERSION=6.10.2 SIGN_IF_POSSIBLE=1 TARGET_ARCHS="x86_64 arm64" ./.github/autobuild/mac.sh
base_command: QT=6 SIGN_IF_POSSIBLE=1 TARGET_ARCHS="x86_64 arm64" ./.github/autobuild/mac.sh
# Disable CodeQL on mac as it interferes with signing the binaries (signing hangs, see #2563 and #2564)
run_codeql: false
xcode_version: 16.3.0
dependency_cache_key: qt6
is_main_build_target: true

# Reminder: If Legacy is removed, be sure to add a dedicated job for CodeQL again.
- config_name: MacOS Legacy (artifacts+CodeQL)
target_os: macos
building_on_os: macos-15-intel
base_command: QT_VERSION=5.15.2 SIGN_IF_POSSIBLE=0 ARTIFACT_SUFFIX=_legacy ./.github/autobuild/mac.sh
base_command: QT=5 SIGN_IF_POSSIBLE=0 ARTIFACT_SUFFIX=_legacy ./.github/autobuild/mac.sh
# Enable CodeQL on mac legacy as this version does not get signed
run_codeql: true
# macos-15-intel ships with Xcode 16.x; while Qt5 is older, Xcode 16 still supports building it
# https://developer.apple.com/support/xcode/
# https://xcodereleases.com/
xcode_version: 16.3.0
dependency_cache_key: qt5
is_main_build_target: true

- config_name: iOS (artifacts)
target_os: ios
building_on_os: macos-15
base_command: QT_VERSION=5.15.2 ./.github/autobuild/ios.sh
base_command: ./.github/autobuild/ios.sh
# Build failed with CodeQL enabled when last tested 03/2022 (#2490).
# There are no hints that iOS is supposed to be supported by CodeQL.
# Therefore, disable it:
run_codeql: false
xcode_version: 26.2
dependency_cache_key: ios

- config_name: Windows (artifact+codeQL)
target_os: windows
building_on_os: windows-2025
base_command: powershell .\.github\autobuild\windows.ps1 -Stage
run_codeql: true
dependency_cache_key: asio
is_main_build_target: true

- config_name: Windows JACK (artifact)
target_os: windows
building_on_os: windows-2025
base_command: powershell .\.github\autobuild\windows.ps1 -BuildOption jackonwindows -Stage
run_codeql: false
dependency_cache_key: jack

# This injects the build_all_targets information into each matrix output:
build_all_targets:
Expand Down Expand Up @@ -294,13 +299,29 @@ jobs:
fetch-depth: ${{ matrix.config.checkout_fetch_depth || '1' }}

- name: Cache Mac dependencies
if: matrix.config.target_os == 'macos'
if: matrix.config.target_os == 'macos' && matrix.config.dependency_cache_key == 'qt6'
uses: actions/cache@v6
with:
path: |
~/qt
~/Library/Cache/jamulus-dependencies
key: ${{ matrix.config.target_os }}-${{ hashFiles('.github/workflows/autobuild.yml', '.github/autobuild/mac.sh', 'mac/deploy_mac.sh') }}-${{ matrix.config.base_command }}
key: ${{ matrix.config.target_os }}-${{ hashFiles('.github/autobuild/mac-dependencies_qt6.sh') }}-${{ matrix.config.dependency_cache_key }}

- name: Cache Mac Legacy dependencies
if: matrix.config.target_os == 'macos' && matrix.config.dependency_cache_key == 'qt5'
uses: actions/cache@v6
with:
path: |
~/qt
~/Library/Cache/jamulus-dependencies
key: ${{ matrix.config.target_os }}-${{ hashFiles('.github/autobuild/mac-dependencies_qt5.sh') }}-${{ matrix.config.dependency_cache_key }}

- name: Cache iOS dependencies
if: matrix.config.target_os == 'ios'
uses: actions/cache@v6
with:
path: ~/qt
key: ${{ matrix.config.target_os }}-${{ hashFiles('.github/autobuild/ios-dependencies.sh') }}-${{ matrix.config.dependency_cache_key }}

- name: Cache Windows dependencies
if: matrix.config.target_os == 'windows'
Expand All @@ -312,7 +333,7 @@ jobs:
C:\AutobuildCache
${{ github.workspace }}\libs\NSIS\NSIS-source
${{ github.workspace }}\libs\ASIOSDK2
key: ${{ matrix.config.target_os }}-${{ hashFiles('.github/workflows/autobuild.yml', '.github/autobuild/windows.ps1', 'windows/deploy_windows.ps1') }}-${{ matrix.config.base_command }}
key: ${{ matrix.config.target_os }}-${{ hashFiles('.github/autobuild/windows-dependencies.ps1') }}-${{ matrix.config.dependency_cache_key }}

- name: Cache Android dependencies
if: matrix.config.target_os == 'android'
Expand Down Expand Up @@ -359,6 +380,7 @@ jobs:
NOTARIZATION_PASSWORD: ${{ secrets.NOTARIZATION_PASSWORD }}
KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
MACOS_CA_PUBLICKEY: ${{ secrets.MACOS_CA_PUBKEY }}

- name: Post-Build for ${{ matrix.config.config_name }}
id: get-artifacts
run: ${{ matrix.config.base_command }} get-artifacts
Expand Down
32 changes: 17 additions & 15 deletions .github/workflows/bump-dependencies.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,51 +36,50 @@ jobs:
fail-fast: false
matrix:
components:

- name: aqt
# not Changelog-worthy
get_upstream_version: GH_REPO=miurahr/aqtinstall gh release view --json tagName --jq .tagName | sed -re 's/^v//'
# The following regexps capture both the *nix and the Windows variable syntax (different case, underscore):
local_version_regex: (.*AQTINSTALL_?VERSION\s*=\s*"?)([0-9.]*)("?.*)
# Capture both plain assignments and shell parameter-expansion defaults.
local_version_regex: ^(AQTINSTALL_VERSION=|\$AqtinstallVersion = \")([0-9.]+)(|\")$

- name: create-dmg
changelog_name: create-dmg (macOS)
get_upstream_version: GH_REPO=create-dmg/create-dmg gh release view --json tagName --jq .tagName | sed -re 's/^v//'
local_version_regex: (.*CREATEDMG_VERSION\s*=\s*"?)([0-9.]*)("?.*)
local_version_regex: ^(CREATEDMG_VERSION=)([0-9.]+)()$

- name: Qt6
changelog_name: bundled Qt6
get_upstream_version: |
latest_minor="$(curl -s https://download.qt.io/official_releases/qt/ | grep -oP 'href="\K[0-9.]+(?=/")' | sort --reverse --version-sort | head -n1)";
curl -s https://download.qt.io/official_releases/qt/"${latest_minor}"/ | grep -oP 'href="\K[0-9.]+(?=/")' | sort --reverse --version-sort | head -n1
# The following regex captures both the *nix and the Windows variable syntax (different case, underscore):
local_version_regex: (.*QT[0-9_]+VERSION\s*=\s*"?)(6\.[0-9.]+)("?.*)
local_version_regex: ^(QT_VERSION=|\$Qt64Version = \")(6\.[0-9.]+)(|\")$

- name: jack
changelog_name: bundled JACK (Windows-only)
get_upstream_version: GH_REPO=jackaudio/jack2-releases gh release view --json tagName --jq .tagName | sed -re 's/^v//'
local_version_regex: (.*JackVersion\s*=\s*"?)([0-9.]+)("?.*)
local_version_regex: ^(\$JackVersion = \")([^"]+)(\")$

- name: choco-jom
# not Changelog-worthy
get_upstream_version: |
curl -sL "https://community.chocolatey.org/api/v2/FindPackagesById()?id='jom'" |
grep -oP '(?<=<d:Version>)[^<]+' | sort --version-sort | tail -n1
local_version_regex: (.*JomVersion\s*=\s*"?)([0-9.]+)("?.*)
local_version_regex: ^(\$JomVersion = \")([^"]+)(\")$

- name: NSIS
changelog_name: Windows Installer base (NSIS)
get_upstream_version: |
curl -s -o /dev/null --location --range 0-5 --write-out '%{url_effective}' https://sourceforge.net/projects/nsis/files/latest/download |
grep -oP '.*/nsis-\K[0-9.]+(?=-setup\.)'
# This pattern is a bit special as it has to match twice in a single line.
# Therefore, we have to be very careful to avoid consuming too much pattern space.
# This is why a positive lookahead is used instead of direct matching:
local_version_regex: (.*"nsis-|.*\/NSIS.20.\/|\/nsis-)([0-9.]+)(".*|(?=\/nsis-)|\.zip.*)
local_version_regex: ^(\$NsisVersion = \")([^"]+)(\")$

- name: ASIO-SDK
changelog_name: ASIO SDK (Windows-only)
get_upstream_version: |
curl -s -o /dev/null --location --range 0-5 --write-out '%{url_effective}' https://www.steinberg.net/asiosdk |
grep -oP '.*\K(?:ASIO-SDK|asiosdk)_.*(?=\.zip)'
local_version_regex: (.*["\/])((?:ASIO-SDK|asiosdk)_[^"]+?)(".*|\.zip.*)
local_version_regex: (\$AsioSDKVersion = \")([^"]+)(\")$

steps:
- uses: actions/checkout@v7
Expand All @@ -91,9 +90,12 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
set -eu
files=( .github/{autobuild,workflows}/* windows/*.ps1 mac/*.sh )
files=( .github/autobuild/*-dependencies{,_qt[56]}.* )
echo "files: (${files[@]})"
upstream_version="$(${{ matrix.components.get_upstream_version }})"
local_version="$(perl -nle 'print "$2" if /${{ matrix.components.local_version_regex }}/i' "${files[@]}" | sort --reverse --version-sort | head -n1)"
echo "upstream version: {${upstream_version}}"
local_version="$(perl -nle 'print "$2" if /${{ matrix.components.local_version_regex }}/' "${files[@]}" | sort --reverse --version-sort | head -n1)"
echo "local version: {${local_version}}"
if [[ -z "$upstream_version" ]]; then
echo "failed to extract upstream version"
exit 1
Expand All @@ -106,7 +108,7 @@ jobs:
echo "upstream ${{ matrix.components.name }} (${upstream_version}) matches local ${{ matrix.components.name }} (${local_version})"
exit 0
fi
echo "upstream ${{ matrix.components.name }} (${upstream_version}) is different than local ${{ matrix.components.name }} (${local_version}), creating PR"
echo "upstream ${{ matrix.components.name }} (${upstream_version}) does not match local ${{ matrix.components.name }} (${local_version}), creating PR"
git config --global user.email "actions@github.com"
git config --global user.name "github-actions[bot]"
pr_branch=ci/bump-dependencies/${{ matrix.components.name }}
Expand Down
7 changes: 5 additions & 2 deletions mac/deploy_mac.sh
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,13 @@
##############################################################################
set -eu -o pipefail

root_path=$(pwd)

QT=${QT:-6}
# Dependency versions
CREATEDMG_VERSION="1.3.0"
# shellcheck disable=SC1090
source "${root_path}/.github/autobuild/mac-dependencies_qt${QT}.sh"

root_path=$(pwd)
project_path="${root_path}/Jamulus.pro"
resources_path="${root_path}/src/res"
raw_path="${root_path}/rawbuild" # Path for raw, not yet runnable or signed binaries.
Expand Down
Loading
Loading