Skip to content

Commit a60b728

Browse files
committed
Complete rewrite of Blackrock LSL Application.
1 parent ce0eefe commit a60b728

33 files changed

Lines changed: 3007 additions & 597 deletions

.github/workflows/build.yml

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

.gitignore

Lines changed: 10 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -1,107 +1,11 @@
1-
# Byte-compiled / optimized / DLL files
2-
__pycache__/
3-
*.py[cod]
4-
*$py.class
5-
6-
# C extensions
7-
*.so
8-
9-
# Distribution / packaging
10-
.Python
11-
build/
12-
develop-eggs/
13-
dist/
14-
downloads/
15-
eggs/
16-
.eggs/
17-
lib/
18-
lib64/
19-
parts/
20-
sdist/
21-
var/
22-
wheels/
23-
*.egg-info/
24-
.installed.cfg
25-
*.egg
26-
MANIFEST
27-
28-
# PyInstaller
29-
# Usually these files are written by a python script from a template
30-
# before PyInstaller builds the exe, so as to inject date/other infos into it.
31-
*.manifest
32-
*.spec
33-
34-
# Installer logs
35-
pip-log.txt
36-
pip-delete-this-directory.txt
37-
38-
# Unit test / coverage reports
39-
htmlcov/
40-
.tox/
41-
.coverage
42-
.coverage.*
43-
.cache
44-
nosetests.xml
45-
coverage.xml
46-
*.cover
47-
.hypothesis/
48-
.pytest_cache/
49-
50-
# Translations
51-
*.mo
52-
*.pot
53-
54-
# Django stuff:
55-
*.log
56-
local_settings.py
57-
db.sqlite3
58-
59-
# Flask stuff:
60-
instance/
61-
.webassets-cache
62-
63-
# Scrapy stuff:
64-
.scrapy
65-
66-
# Sphinx documentation
67-
docs/_build/
68-
69-
# PyBuilder
70-
target/
71-
72-
# Jupyter Notebook
73-
.ipynb_checkpoints
74-
75-
# pyenv
76-
.python-version
77-
78-
# celery beat schedule file
79-
celerybeat-schedule
80-
81-
# SageMath parsed files
82-
*.sage.py
83-
84-
# Environments
85-
.env
86-
.venv
87-
env/
88-
venv/
89-
ENV/
90-
env.bak/
91-
venv.bak/
92-
93-
# Spyder project settings
94-
.spyderproject
95-
.spyproject
96-
97-
PyCharm
1+
ui_*.h
2+
/build*/
3+
/cmake-build-*/
4+
/CMakeLists.txt.user
5+
/CMakeLists.json
6+
/.vs/
7+
/CMakeSettings.json
8+
/out/
9+
.DS_Store
9810
.idea
99-
100-
# Rope project settings
101-
.ropeproject
102-
103-
# mkdocs documentation
104-
/site
105-
106-
# mypy
107-
.mypy_cache/
11+
.cache/

0 commit comments

Comments
 (0)