Skip to content

Commit f58d5f8

Browse files
committed
Modernize template app
* CMake * Apple-framework * Apple sign & notarize
1 parent edf3d52 commit f58d5f8

34 files changed

+2442
-713
lines changed

.appveyor.yml

Lines changed: 0 additions & 29 deletions
This file was deleted.

.github/workflows/build.yml

Lines changed: 267 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,267 @@
1+
# =============================================================================
2+
# LSL Application Build Workflow
3+
# =============================================================================
4+
# This workflow builds, tests, and packages the LSL application for all
5+
# supported platforms. It serves as a reference for other LSL applications.
6+
#
7+
# Features:
8+
# - Multi-platform builds (Linux, macOS, Windows)
9+
# - Qt6 integration
10+
# - Automatic liblsl fetch via FetchContent
11+
# - CPack packaging
12+
# - macOS code signing and notarization (on release)
13+
# =============================================================================
14+
15+
name: Build
16+
17+
on:
18+
push:
19+
branches: [main, master, dev]
20+
tags: ['v*']
21+
pull_request:
22+
branches: [main, master]
23+
release:
24+
types: [published]
25+
workflow_dispatch:
26+
27+
env:
28+
BUILD_TYPE: Release
29+
30+
jobs:
31+
# ===========================================================================
32+
# Build Job - Multi-platform builds
33+
# ===========================================================================
34+
build:
35+
name: ${{ matrix.config.name }}
36+
runs-on: ${{ matrix.config.os }}
37+
strategy:
38+
fail-fast: false
39+
matrix:
40+
config:
41+
- { name: "Ubuntu 22.04", os: ubuntu-22.04 }
42+
- { name: "Ubuntu 24.04", os: ubuntu-24.04 }
43+
- { name: "macOS", os: macos-14, cmake_extra: '-DCMAKE_OSX_ARCHITECTURES="x86_64;arm64"' }
44+
- { name: "Windows", os: windows-latest }
45+
46+
steps:
47+
- name: Checkout
48+
uses: actions/checkout@v4
49+
50+
# -----------------------------------------------------------------------
51+
# Install Qt6 (6.8 LTS across all platforms)
52+
# -----------------------------------------------------------------------
53+
- name: Install Linux dependencies
54+
if: runner.os == 'Linux'
55+
run: |
56+
sudo apt-get update
57+
sudo apt-get install -y libgl1-mesa-dev libxkbcommon-dev libxcb-cursor0
58+
59+
- name: Install Qt
60+
uses: jurplel/install-qt-action@v4
61+
with:
62+
version: '6.8.*'
63+
cache: true
64+
65+
# -----------------------------------------------------------------------
66+
# Configure
67+
# -----------------------------------------------------------------------
68+
- name: Configure CMake
69+
run: >
70+
cmake -S . -B build
71+
-DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }}
72+
-DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/install
73+
-DLSL_FETCH_IF_MISSING=ON
74+
${{ matrix.config.cmake_extra }}
75+
76+
# -----------------------------------------------------------------------
77+
# Build
78+
# -----------------------------------------------------------------------
79+
- name: Build
80+
run: cmake --build build --config ${{ env.BUILD_TYPE }} --parallel
81+
82+
# -----------------------------------------------------------------------
83+
# Install
84+
# -----------------------------------------------------------------------
85+
- name: Install
86+
run: cmake --install build --config ${{ env.BUILD_TYPE }}
87+
88+
# -----------------------------------------------------------------------
89+
# Test CLI
90+
# -----------------------------------------------------------------------
91+
- name: Test CLI (Linux)
92+
if: runner.os == 'Linux'
93+
run: ./install/bin/LSLTemplateCLI --help
94+
95+
- name: Test CLI (macOS)
96+
if: runner.os == 'macOS'
97+
run: ./install/LSLTemplateCLI --help
98+
99+
- name: Test CLI (Windows)
100+
if: runner.os == 'Windows'
101+
run: ./install/LSLTemplateCLI.exe --help
102+
103+
# -----------------------------------------------------------------------
104+
# Package
105+
# -----------------------------------------------------------------------
106+
- name: Package
107+
run: cpack -C ${{ env.BUILD_TYPE }}
108+
working-directory: build
109+
110+
# -----------------------------------------------------------------------
111+
# Upload Artifacts
112+
# -----------------------------------------------------------------------
113+
- name: Upload Artifacts
114+
uses: actions/upload-artifact@v4
115+
with:
116+
name: package-${{ matrix.config.os }}
117+
path: |
118+
build/*.zip
119+
build/*.tar.gz
120+
build/*.deb
121+
if-no-files-found: ignore
122+
123+
# ===========================================================================
124+
# macOS Signing and Notarization (Release only)
125+
# ===========================================================================
126+
sign-macos:
127+
name: Sign & Notarize (macOS)
128+
needs: build
129+
if: github.event_name == 'release'
130+
runs-on: macos-14
131+
132+
steps:
133+
- name: Checkout
134+
uses: actions/checkout@v4
135+
136+
- name: Download macOS Artifact
137+
uses: actions/download-artifact@v4
138+
with:
139+
name: package-macos-14
140+
path: packages
141+
142+
- name: Extract Package
143+
run: |
144+
cd packages
145+
tar -xzf *.tar.gz
146+
ls -la
147+
148+
# -----------------------------------------------------------------------
149+
# Install Apple Certificates
150+
# -----------------------------------------------------------------------
151+
- name: Install Apple Certificates
152+
env:
153+
MACOS_CERTIFICATE: ${{ secrets.PROD_MACOS_CERTIFICATE }}
154+
MACOS_CERTIFICATE_PWD: ${{ secrets.PROD_MACOS_CERTIFICATE_PWD }}
155+
MACOS_CI_KEYCHAIN_PWD: ${{ secrets.PROD_MACOS_CI_KEYCHAIN_PWD }}
156+
run: |
157+
# Create temporary keychain
158+
KEYCHAIN_PATH=$RUNNER_TEMP/build.keychain
159+
security create-keychain -p "$MACOS_CI_KEYCHAIN_PWD" $KEYCHAIN_PATH
160+
security default-keychain -s $KEYCHAIN_PATH
161+
security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
162+
security unlock-keychain -p "$MACOS_CI_KEYCHAIN_PWD" $KEYCHAIN_PATH
163+
164+
# Import certificate
165+
CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12
166+
echo -n "$MACOS_CERTIFICATE" | base64 --decode -o $CERTIFICATE_PATH
167+
security import $CERTIFICATE_PATH -P "$MACOS_CERTIFICATE_PWD" -k $KEYCHAIN_PATH -A -t cert -f pkcs12
168+
rm $CERTIFICATE_PATH
169+
170+
# Allow codesign to access keychain
171+
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "$MACOS_CI_KEYCHAIN_PWD" $KEYCHAIN_PATH
172+
security list-keychain -d user -s $KEYCHAIN_PATH
173+
174+
# Extract identity name and export to environment
175+
IDENTITY=$(security find-identity -v -p codesigning $KEYCHAIN_PATH | grep "Developer ID Application" | head -1 | awk -F'"' '{print $2}')
176+
echo "APPLE_CODE_SIGN_IDENTITY_APP=$IDENTITY" >> $GITHUB_ENV
177+
178+
# -----------------------------------------------------------------------
179+
# Setup Notarization Credentials
180+
# -----------------------------------------------------------------------
181+
- name: Setup Notarization
182+
env:
183+
NOTARIZATION_APPLE_ID: ${{ secrets.PROD_MACOS_NOTARIZATION_APPLE_ID }}
184+
NOTARIZATION_PWD: ${{ secrets.PROD_MACOS_NOTARIZATION_PWD }}
185+
NOTARIZATION_TEAM_ID: ${{ secrets.PROD_MACOS_NOTARIZATION_TEAM_ID }}
186+
run: |
187+
xcrun notarytool store-credentials "notarize-profile" \
188+
--apple-id "$NOTARIZATION_APPLE_ID" \
189+
--password "$NOTARIZATION_PWD" \
190+
--team-id "$NOTARIZATION_TEAM_ID"
191+
echo "APPLE_NOTARIZE_KEYCHAIN_PROFILE=notarize-profile" >> $GITHUB_ENV
192+
193+
# -----------------------------------------------------------------------
194+
# Sign and Notarize
195+
# -----------------------------------------------------------------------
196+
- name: Sign and Notarize
197+
env:
198+
ENTITLEMENTS_FILE: ${{ github.workspace }}/app.entitlements
199+
run: |
200+
# Sign GUI app bundle (--deep handles all nested code)
201+
APP_PATH=$(find packages -name "*.app" -type d | head -1)
202+
if [[ -n "$APP_PATH" ]]; then
203+
./scripts/sign_and_notarize.sh "$APP_PATH" --notarize
204+
fi
205+
206+
# Sign CLI and its bundled liblsl
207+
CLI_PATH=$(find packages -name "LSLTemplateCLI" -type f | head -1)
208+
if [[ -n "$CLI_PATH" ]]; then
209+
CLI_DIR=$(dirname "$CLI_PATH")
210+
# Sign liblsl first (dependency must be signed before dependent)
211+
if [[ -f "$CLI_DIR/Frameworks/liblsl.dylib" ]]; then
212+
codesign --force --sign "$APPLE_CODE_SIGN_IDENTITY_APP" --options runtime \
213+
"$CLI_DIR/Frameworks/liblsl.dylib"
214+
fi
215+
./scripts/sign_and_notarize.sh "$CLI_PATH" --notarize
216+
fi
217+
218+
# -----------------------------------------------------------------------
219+
# Repackage
220+
# -----------------------------------------------------------------------
221+
- name: Repackage
222+
run: |
223+
cd packages
224+
# Remove original unsigned package
225+
rm -f *.tar.gz
226+
227+
# Get version from CMakeLists.txt
228+
VERSION=$(sed -n 's/.*VERSION \([0-9.]*\).*/\1/p' ../CMakeLists.txt | head -1)
229+
230+
# Create signed package with CLI and its Frameworks (universal binary)
231+
tar -czf "LSLTemplate-${VERSION}-macOS_universal-signed.tar.gz" \
232+
LSLTemplate*.app LSLTemplateCLI Frameworks 2>/dev/null || true
233+
234+
- name: Upload Signed Package
235+
uses: actions/upload-artifact@v4
236+
with:
237+
name: package-macos-signed
238+
path: packages/*-signed.tar.gz
239+
240+
- name: Upload to Release
241+
if: github.event_name == 'release'
242+
uses: softprops/action-gh-release@v2
243+
with:
244+
files: packages/*-signed.tar.gz
245+
246+
# ===========================================================================
247+
# Upload unsigned packages to release
248+
# ===========================================================================
249+
release:
250+
name: Upload to Release
251+
needs: build
252+
if: github.event_name == 'release'
253+
runs-on: ubuntu-latest
254+
255+
steps:
256+
- name: Download All Artifacts
257+
uses: actions/download-artifact@v4
258+
with:
259+
path: artifacts
260+
261+
- name: Upload to Release
262+
uses: softprops/action-gh-release@v2
263+
with:
264+
files: |
265+
artifacts/**/*.zip
266+
artifacts/**/*.tar.gz
267+
artifacts/**/*.deb

.travis.yml

Lines changed: 0 additions & 29 deletions
This file was deleted.

AppTemplate_cpp_qt.cfg

Lines changed: 0 additions & 3 deletions
This file was deleted.

0 commit comments

Comments
 (0)