Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
84 commits
Select commit Hold shift + click to select a range
89d3a20
Update Makefile
damiensellier Jun 2, 2025
1ffa0a2
Merge branch '5.6.33-GUI-Maintenance'
damiensellier Jun 2, 2025
4a8cf0d
Create build-release.yml
sgorpi Jun 4, 2025
3dd89d5
Improve workflow, add dependency
sgorpi Jun 4, 2025
88924b0
Fix OS-dependent dependency installation
sgorpi Jun 4, 2025
21a160a
Fix OS-dependent dependency installation
sgorpi Jun 4, 2025
404bcc0
Fix OS-dependent stuff
sgorpi Jun 4, 2025
de8b148
Small fixes to CI
sgorpi Jun 5, 2025
0565f42
Small fixes to CI
sgorpi Jun 5, 2025
479fa53
Small CI improvements
sgorpi Jun 5, 2025
e2093c4
post commit try to find windows tools paths
sgorpi Jun 5, 2025
a1b1d91
post commit try to find windows tools paths
sgorpi Jun 5, 2025
fda0ec4
See what it does for MacOS-13
sgorpi Jun 5, 2025
9745768
Set relative root directory in post-commit
sgorpi Jun 6, 2025
211dcf2
setup msbuild step
sgorpi Jun 6, 2025
b8b98ba
Disable win32 build
sgorpi Jun 6, 2025
a904c01
Restore CtrlrRevision.h
sgorpi Jun 6, 2025
cc11f6b
Try relative JUCE paths
sgorpi Jun 6, 2025
1d2138f
Unzip boost on windows, require it as package dependency only on linux
sgorpi Jun 7, 2025
5d0dbc0
Unzip boost in the 'Install dependencies' step to not clutter the out…
sgorpi Jun 9, 2025
52041dc
Add and switch to newer VisualStudio project files thx to @dnaldoog
sgorpi Jun 9, 2025
e6f4402
Set x64 architecture for msbuild
sgorpi Jun 9, 2025
05d30a3
Add debugging with tmate
sgorpi Jun 10, 2025
5819427
add quotes around paths with possible spaces and brackets
sgorpi Jun 10, 2025
04a543f
Update CtrlrRevision template to match current header
sgorpi Jun 10, 2025
24a1830
Add xcodeproject generated from projucer
sgorpi Jun 10, 2025
4484a80
Trying to fix NSIS installer
sgorpi Jun 10, 2025
1807236
change slahsh into dash for msbuild option maxcpucount
sgorpi Jun 10, 2025
765bfd4
Manually change MACOSX_DEPLOYMENT_TARGET
sgorpi Jun 11, 2025
31357b2
Change artifact path and name
sgorpi Jun 11, 2025
ffa0faf
Relative artifact directory
sgorpi Jun 11, 2025
1b92ba5
add apt-get update for linux
sgorpi Jun 11, 2025
15a337c
Merge branch '5.6.34-Maintenance' of github.com:damiensellier/CtrlrX
sgorpi Jun 21, 2025
a6a293f
MacOS xcode project target version bump to 10.13
sgorpi Jun 21, 2025
a6d7b20
Trying cmake with FRUT conversion of the .jucer project file
sgorpi Jun 22, 2025
0c81f8f
Merge branch '5.6.34-Maintenance' of github.com:damiensellier/CtrlrX
sgorpi Jun 22, 2025
d484964
Some fixes to CMake workflow
sgorpi Jun 22, 2025
b4e3005
Some hacks to try and get cmake to work in Windows and MacOS runners
sgorpi Jun 27, 2025
f07eca3
Merge branch '5.6.34-Maintenance' of github.com:damiensellier/CtrlrX
sgorpi Jun 27, 2025
d5aa689
Move comment around
sgorpi Jun 29, 2025
d8dfb4a
temporary revert fc0879b to get it to build on Windows on a github ru…
sgorpi Jun 29, 2025
4d02dd2
Add a release flow when a tag is pushed
sgorpi Jun 29, 2025
c367ddf
Get more detail which step fails
sgorpi Jun 29, 2025
fc70df8
Replace perl by sed in converting jucer to cmakefiles
sgorpi Jun 29, 2025
927391b
Fix some typos
sgorpi Jun 29, 2025
7bd9429
Try some different sed arguments
sgorpi Jun 29, 2025
b3a9081
Fix MacOS build
sgorpi Jun 30, 2025
99360d8
Small changes and typo fixes
sgorpi Jun 30, 2025
a371d00
Delete unused files
sgorpi Aug 1, 2025
32bc78e
Convert cmake workflow to use an adapted PampleJuce CMakeLists.txt
sgorpi Aug 1, 2025
e38086d
Merge branch '5.6.34-Maintenance' of github.com:damiensellier/CtrlrX
sgorpi Aug 1, 2025
d1423f6
Add a VERSION file, as required by pamplejuce cmake build. The github…
sgorpi Aug 1, 2025
41bf429
fix typo
sgorpi Aug 1, 2025
ccf26a0
Restore build.sh script
sgorpi Aug 1, 2025
ffd444d
Fixes to build
sgorpi Aug 1, 2025
58e1d3c
Some more build fixes, a.o. according to https://forum.juce.com/t/pro…
sgorpi Aug 1, 2025
aea17b1
Prevent shared lib from being uploaded as artifact
sgorpi Aug 1, 2025
495e1a3
Only hide warnings on unix platforms
sgorpi Aug 1, 2025
6c67917
Some changes for the cmake GH workflow, similar to pamplejuce
sgorpi Aug 2, 2025
faef3be
cmake GH workflow exclude uploading the sharedcode .lib on windows
sgorpi Aug 2, 2025
e21f4e5
Adopt the pamplejuce github workflow (build_and_test.yml), but made s…
sgorpi Aug 9, 2025
cbed5c9
Fix typo in build_and_test workflow
sgorpi Aug 9, 2025
237a39e
Some fixes/changes in build_and_test workflow
sgorpi Aug 9, 2025
cdc1981
Some fixes/changes in build_and_test workflow 2
sgorpi Aug 9, 2025
ab9150a
Some fixes/changes in build_and_test workflow 3
sgorpi Aug 9, 2025
dd623c4
Some fixes/changes in build_and_test workflow 4
sgorpi Aug 9, 2025
1421156
Some fixes/changes in build_and_test workflow 5
sgorpi Aug 9, 2025
b2f9d5d
Some fixes/changes in build_and_test workflow 6
sgorpi Aug 9, 2025
ae235cb
Some fixes/changes in build_and_test workflow 7
sgorpi Aug 9, 2025
9cb1fc3
Some fixes/changes in build_and_test workflow 8
sgorpi Aug 9, 2025
b175481
Some fixes/changes in build_and_test workflow 9
sgorpi Aug 9, 2025
abc35b6
CMakeLists to find packages/libraries so that missing dependencies ar…
sgorpi Aug 17, 2025
a360d37
workflow logic to only get a version from a .jucer file is that is ne…
sgorpi Aug 17, 2025
dea5789
Remove clap from Mac packaging
sgorpi Aug 17, 2025
eb1130f
simplify logic to determine version in deprecated script
sgorpi Aug 17, 2025
12dbb2b
Remove deprecated workflow and add debug option on failure if manuall…
sgorpi Aug 17, 2025
ededa2d
Improve version extraction from .jucer files
sgorpi Aug 17, 2025
51a5f21
Release job should checkout the README from repo, and ignore errors w…
sgorpi Aug 20, 2025
adec9cd
Switch getting the readme with getting artifacts to prevent the check…
sgorpi Aug 20, 2025
b26ea1e
Some additional comments and small improvements
sgorpi Aug 21, 2025
0bdfe67
Merge branch '5.6.34-Maintenance-Build-Workflow' of github.com:damien…
sgorpi Sep 17, 2025
8a4ea96
Delete file that moved to a subdirectory
sgorpi Sep 17, 2025
06d3c17
Use windows-2022 image instead of the windows-latest image for Inno S…
sgorpi Sep 17, 2025
6fc526f
Delete the Builds directory
sgorpi Sep 19, 2025
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
330 changes: 330 additions & 0 deletions .github/workflows/build_and_test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,330 @@
name: Pamplejuce

on:
workflow_dispatch: # lets you run a build from the UI
inputs:
debug_enabled:
type: boolean
description: 'Run the build with tmate debugging enabled (https://github.com/marketplace/actions/debugging-with-tmate)'
required: false
default: false
push:
pull_request:

# When pushing new commits, cancel any running builds on that branch
concurrency:
group: ${{ github.ref }}
cancel-in-progress: true

env:
BUILD_TYPE: Release
BUILD_DIR: build
DISPLAY: :0 # linux pluginval needs this
HOMEBREW_NO_INSTALL_CLEANUP: 1
SCCACHE_GHA_ENABLED: true
SCCACHE_CACHE_MULTIARCH: 1
IPP_DIR: C:\Program Files (x86)\Intel\oneAPI\ipp\latest\lib\cmake\ipp

defaults:
run:
shell: bash

# jobs are run in paralell on different machines
# all steps run in series
jobs:
build_and_test:
# don't double run on PRs
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name
name: ${{ matrix.name }}
runs-on: ${{ matrix.os }}
env:
HAVE_DEV_ID_APP_CERT: ${{ secrets.DEV_ID_APP_CERT != '' }}
HAVE_DEV_ID_INSTALLER_CERT: ${{ secrets.DEV_ID_INSTALLER_CERT != '' }}
HAVE_AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET != '' }}
strategy:
fail-fast: false # show all errors for each platform (vs. cancel jobs on error)
matrix:
include:
- name: Linux
os: ubuntu-24.04
pluginval-binary: ./pluginval
extra-flags: -G Ninja
- name: macOS
os: macos-14
pluginval-binary: pluginval.app/Contents/MacOS/pluginval
extra-flags: -G Ninja -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64"
- name: Windows
os: windows-2022
pluginval-binary: ./pluginval.exe

steps:
# Setup MSVC toolchain and developer command prompt (Windows)
- uses: ilammy/msvc-dev-cmd@v1

# Use clang on Linux so we don't introduce a 3rd compiler (Windows and macOS use MSVC and Clang)
- name: Set up Clang
if: runner.os == 'Linux'
uses: egor-tensin/setup-clang@v1

# This also starts up our "fake" display (Xvfb), needed for pluginval
- name: Install JUCE's Linux Deps
if: runner.os == 'Linux'
# Thanks to McMartin & co https://forum.juce.com/t/list-of-juce-dependencies-under-linux/15121/44
run: |
sudo apt-get update && sudo apt install libasound2-dev libx11-dev libxinerama-dev libxext-dev libfreetype6-dev libglu1-mesa-dev xvfb ninja-build
sudo /usr/bin/Xvfb $DISPLAY &

- name: Install IPP (Windows)
if: (runner.os == 'Windows')
run: |
nuget install intelipp.static.win-x64 -Version 2022.2.0.575

- name: Install Ninja (Windows)
if: runner.os == 'Windows'
run: choco install ninja

- name: Install macOS Deps
if: ${{ matrix.name == 'macOS' }}
run: brew install ninja osxutils

# This block can be removed once 15.1 is default (JUCE requires it when building on macOS 14)
- name: Use latest Xcode on system (macOS)
if: ${{ matrix.name == 'macOS' }}
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: latest-stable

- name: Checkout code
uses: actions/checkout@v4
with:
submodules: recursive

- name: Install CtrlrX Deps
run: |
echo "OS: $RUNNER_OS"
echo "Current working directory: $PWD"
if [ "$RUNNER_OS" == "Linux" ]; then
sudo apt install -y binutils-dev libboost-dev libcurl4-gnutls-dev libgl1-mesa-dev libglapi-mesa libiberty-dev libsframe1 libudev-dev libxcursor-dev libxrandr-dev xorg-dev
elif [ "$RUNNER_OS" == "Windows" ]; then
# to not clutter the build step logs:
pushd ./Source/Misc/
unzip boost/boost.zip
popd
elif [ "$RUNNER_OS" == "macOS" ]; then
brew install boost
# somehow cmake doesn't pick up on /usr/local/include/boost/ ... maybe have to set it in the .jucer project
pushd ./Source/Misc/
unzip boost/boost.zip
popd
fi

- name: Cache the build
uses: mozilla-actions/sccache-action@v0.0.9

- name: Extract version from .jucer file
# Try to derive version from a jucer file that is newer than the VERSION file, before configuring cmake
# This step can be removed if/when the .jucer workflow is deprecated
run: |
echo "Version"
while IFS= read -r -d $'\0' JUCER_FILE <&3; do
if [ "$JUCER_FILE" -nt "VERSION" -a -n "`grep -h 'version=.\+Ctrlr' \"$JUCER_FILE\"`" ]; then
grep -h 'version=.\+Ctrlr' "$JUCER_FILE" | sed -E 's/.*version="([^"]*).*/\1/g' | head -n 1 > VERSION
echo "Found in $JUCER_FILE"
fi
done 3< <(find -name "Ctrlr*.jucer" -type f -print0)
cat VERSION

- name: Configure
run: cmake -B ${{ env.BUILD_DIR }} -DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE}} -DCMAKE_C_COMPILER_LAUNCHER=sccache -DCMAKE_CXX_COMPILER_LAUNCHER=sccache ${{ matrix.extra-flags }} .

- name: Build
run: cmake --build ${{ env.BUILD_DIR }} --config ${{ env.BUILD_TYPE }}

# - name: Test & Benchmarks
# working-directory: ${{ env.BUILD_DIR }}
# run: ctest --verbose --output-on-failure

- name: Read in .env from CMake # see GitHubENV.cmake
run: |
cat .env # show us the config
cat .env >> $GITHUB_ENV # pull in our PRODUCT_NAME, etc

- name: Set additional env vars for next steps
run: |
ARTIFACTS_PATH=${{ env.BUILD_DIR }}/${{ env.PROJECT_NAME }}_artefacts/${{ env.BUILD_TYPE }}
echo "ARTIFACTS_PATH=$ARTIFACTS_PATH" >> $GITHUB_ENV
echo "VST3_PATH=$ARTIFACTS_PATH/VST3/${{ env.PRODUCT_NAME }}.vst3" >> $GITHUB_ENV
echo "AU_PATH=$ARTIFACTS_PATH/AU/${{ env.PRODUCT_NAME }}.component" >> $GITHUB_ENV
echo "AUV3_PATH=$ARTIFACTS_PATH/AUv3/${{ env.PRODUCT_NAME }}.appex" >> $GITHUB_ENV
echo "CLAP_PATH=$ARTIFACTS_PATH/CLAP/${{ env.PRODUCT_NAME }}.clap" >> $GITHUB_ENV
echo "STANDALONE_PATH=$ARTIFACTS_PATH/Standalone/${{ env.PRODUCT_NAME }}.app" >> $GITHUB_ENV
echo "ARTIFACT_NAME=${{ env.PRODUCT_NAME }}-${{ env.VERSION }}-${{ matrix.name }}" >> $GITHUB_ENV

- name: Pluginval
run: |
curl -LO "https://github.com/Tracktion/pluginval/releases/download/v1.0.3/pluginval_${{ matrix.name }}.zip"
7z x pluginval_${{ matrix.name }}.zip
${{ matrix.pluginval-binary }} --strictness-level 10 --verbose --validate "${{ env.VST3_PATH }}"

- name: Import Certificates (macOS)
if: ${{ matrix.name == 'macOS' && env.HAVE_DEV_ID_APP_CERT == 'true' && env.HAVE_DEV_ID_INSTALLER_CERT == 'true' }}
uses: sudara/basic-macos-keychain-action@v1
id: keychain
with:
dev-id-app-cert: ${{ secrets.DEV_ID_APP_CERT }}
dev-id-app-password: ${{ secrets.DEV_ID_APP_PASSWORD }}
dev-id-installer-cert: ${{ secrets.DEV_ID_INSTALLER_CERT }}
dev-id-installer-password: ${{ secrets.DEV_ID_INSTALLER_PASSWORD }}

- name: Codesign (macOS)
if: ${{ matrix.name == 'macOS' && env.HAVE_DEV_ID_APP_CERT == 'true' && env.HAVE_DEV_ID_INSTALLER_CERT == 'true' }}
timeout-minutes: 5
run: |
# Each plugin must be code signed
codesign --force -s "${{ secrets.DEVELOPER_ID_APPLICATION}}" -v "${{ env.VST3_PATH }}" --deep --strict --options=runtime --timestamp
codesign --force -s "${{ secrets.DEVELOPER_ID_APPLICATION}}" -v "${{ env.AU_PATH }}" --deep --strict --options=runtime --timestamp
codesign --force -s "${{ secrets.DEVELOPER_ID_APPLICATION}}" -v "${{ env.CLAP_PATH }}" --deep --strict --options=runtime --timestamp
codesign --force -s "${{ secrets.DEVELOPER_ID_APPLICATION}}" -v "${{ env.STANDALONE_PATH }}" --deep --strict --options=runtime --timestamp

- name: Add Custom Icons (macOS)
if: ${{ matrix.name == 'macOS' }}
run: |
# add the icns as its own icon resource (meta!)
sips -i Packaging/Mac/Icon.icns

# Grab the resource, put in tempfile
DeRez -only icns Packaging/Mac/Icon.icns > /tmp/icons

# Stuff the resource into the strange Icon? file's resource fork
Rez -a /tmp/icons -o "${{ env.VST3_PATH }}/Icon"$'\r'
Rez -a /tmp/icons -o "${{ env.AU_PATH }}/Icon"$'\r'
# Rez -a /tmp/icons -o "${{ env.CLAP_PATH }}/Icon"$'\r'

# Set custom icon attribute
SetFile -a C "${{ env.VST3_PATH }}"
SetFile -a C "${{ env.AU_PATH }}"
# SetFile -a C "${{ env.CLAP_PATH }}"

- name: pkgbuild, Productbuild and Notarize (macOS)
if: ${{ matrix.name == 'macOS' && env.HAVE_DEV_ID_APP_CERT == 'true' && env.HAVE_DEV_ID_INSTALLER_CERT == 'true' }}
timeout-minutes: 5
run: |
pkgbuild --identifier "${{ env.BUNDLE_ID }}.au.pkg" --version $VERSION --component "${{ env.AU_PATH }}" --install-location "/Library/Audio/Plug-Ins/Components" "Packaging/${{ env.PRODUCT_NAME }}.au.pkg"
pkgbuild --identifier "${{ env.BUNDLE_ID }}.vst3.pkg" --version $VERSION --component "${{ env.VST3_PATH }}" --install-location "/Library/Audio/Plug-Ins/VST3" "Packaging/${{ env.PRODUCT_NAME }}.vst3.pkg"
# pkgbuild --identifier "${{ env.BUNDLE_ID }}.clap.pkg" --version $VERSION --component "${{ env.CLAP_PATH }}" --install-location "/Library/Audio/Plug-Ins/CLAP" "Packaging/${{ env.PRODUCT_NAME }}.clap.pkg"

# Standalone is special, needs a boolean to always install in /Applications
pkgbuild --analyze --root "$(dirname "${{ env.STANDALONE_PATH }}")" standalone.plist
plutil -replace BundleIsRelocatable -bool NO standalone.plist
pkgbuild --identifier "${{ env.BUNDLE_ID }}.app.pkg" --version $VERSION --root "$(dirname "${{ env.STANDALONE_PATH }}")" --component-plist standalone.plist --install-location "/Applications" "Packaging/${{ env.PRODUCT_NAME }}.app.pkg"

cd Packaging
envsubst < ./Mac/distribution.xml.template > distribution.xml
productbuild --resources ./resources --distribution distribution.xml --sign "${{ secrets.DEVELOPER_ID_INSTALLER }}" --timestamp "${{ env.ARTIFACT_NAME }}.pkg"

xcrun notarytool submit "${{ env.ARTIFACT_NAME }}.pkg" --apple-id ${{ secrets.NOTARIZATION_USERNAME }} --password ${{ secrets.NOTARIZATION_PASSWORD }} --team-id ${{ secrets.TEAM_ID }} --wait
xcrun stapler staple "${{ env.ARTIFACT_NAME }}.pkg"

- name: Zip (Linux)
if: ${{ matrix.name == 'Linux' }}
working-directory: ${{ env.ARTIFACTS_PATH }}
run: 7z a -tzip "${{ env.ARTIFACT_NAME }}.zip" "-xr!lib${{ env.PRODUCT_NAME }}_SharedCode.a" .

- name: Generate Installer (Windows)
if: ${{ matrix.name == 'Windows' }}
run: |
iscc "Packaging\Windows\installer.iss"
find -iname "*.exe"
mv "Packaging/Windows/Output/${{ env.ARTIFACT_NAME }}.exe" "${{ env.ARTIFACTS_PATH }}/"

- name: Codesign with Azure Trusted Signing (Windows)
if: ${{ matrix.name == 'Windows' && env.HAVE_AZURE_CLIENT_SECRET == 'true' }}
uses: azure/trusted-signing-action@v0.5.1
with:
# The Azure Active Directory tenant (directory) ID.
azure-tenant-id: ${{ secrets.AZURE_TENANT_ID }}

# The client (application) ID of an App Registration in the tenant.
azure-client-id: ${{ secrets.AZURE_CLIENT_ID }}

# A client secret that was generated for the App Registration.
azure-client-secret: ${{ secrets.AZURE_CLIENT_SECRET }}

# The Code Signing Account endpoint. The URI value must have a URI that aligns to the region your Code Signing Account and Certificate Profile you are specifying were created in during the setup of these resources.
endpoint: ${{ secrets.AZURE_ENDPOINT }}

# The Code Signing Account name.
trusted-signing-account-name: ${{ secrets.AZURE_CODE_SIGNING_NAME }}

# The Certificate Profile name.
certificate-profile-name: ${{ secrets.AZURE_CERT_PROFILE_NAME }}

# This signs all exes inside the folder
files-folder: ${{ env.ARTIFACTS_PATH }}
files-folder-filter: exe

- name: Upload Exe (Windows)
if: ${{ matrix.name == 'Windows' }}
uses: actions/upload-artifact@v4
with:
name: ${{ env.ARTIFACT_NAME }}.exe
path: "${{ env.ARTIFACTS_PATH }}/${{ env.ARTIFACT_NAME }}.exe"

- name: Upload Zip (Linux)
if: ${{ matrix.name == 'Linux' }}
uses: actions/upload-artifact@v4
with:
name: ${{ env.ARTIFACT_NAME }}.zip
path: "${{ env.ARTIFACTS_PATH }}/${{ env.ARTIFACT_NAME }}.zip"

- name: Upload pkg (macOS)
if: ${{ matrix.name == 'macOS' }}
uses: actions/upload-artifact@v4
with:
name: ${{ env.ARTIFACT_NAME }}.pkg
path: Packaging/${{ env.ARTIFACT_NAME }}.pkg

# Enable tmate debugging of manually-triggered workflows if the input option was provided
- name: Setup tmate session if failed
uses: mxschmitt/action-tmate@v3
if: ${{ failure() && github.event_name == 'workflow_dispatch' && inputs.debug_enabled }}


release:
if: contains(github.ref, 'tags/v')
runs-on: ubuntu-latest
needs: build_and_test

steps:
- name: Get Readme
uses: actions/checkout@v4
# (sparse) checkout needs to happen before getting artifacts, as it will 'clean' the directory.
with:
sparse-checkout: |
README.md
VERSION
sparse-checkout-cone-mode: false

- name: Get Artifacts
uses: actions/download-artifact@v4

- name: Compose release notes
# Extract the first sub section after '## Changelog' until the next subsection from the README
run: |
set +e # ignore failures
echo '![alt text](/Source/Resources/Icons/CtrlrX-README-250x315.png?raw=true "CtrlrX")' > release_notes.txt
echo -e "\n# CtrlrX ${GITHUB_REF_NAME} - Changelog" >> release_notes.txt
sed '0,/^## Changelog/d; 0,/^##/d; /##/,$d' README.md >> release_notes.txt
cat release_notes.txt

- name: Create Release
uses: softprops/action-gh-release@v2
with:
body_path: release_notes.txt
prerelease: true
# download-artifact puts these files in their own dirs...
# Using globs sidesteps having to pass the version around
files: |
*/*.exe
*/*.zip
*/*.dmg
Loading