Skip to content

Commit d9fa826

Browse files
committed
Update build
1 parent e14a9fd commit d9fa826

File tree

4 files changed

+342
-40
lines changed

4 files changed

+342
-40
lines changed

.github/workflows/build.yml

Lines changed: 208 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,94 +1,266 @@
1+
# =============================================================================
2+
# EGIAmpServer Build Workflow
3+
# =============================================================================
4+
# This workflow builds, tests, and packages EGIAmpServer for all
5+
# supported platforms.
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+
115
name: Build
216

317
on:
418
push:
5-
branches: [master, main]
19+
branches: [main, master]
20+
tags: ['v*']
621
pull_request:
7-
branches: [master, main]
22+
branches: [main, master]
823
release:
924
types: [published]
25+
workflow_dispatch:
1026

1127
env:
1228
BUILD_TYPE: Release
1329

1430
jobs:
31+
# ===========================================================================
32+
# Build Job - Multi-platform builds
33+
# ===========================================================================
1534
build:
35+
name: ${{ matrix.config.name }}
36+
runs-on: ${{ matrix.config.os }}
1637
strategy:
1738
fail-fast: false
1839
matrix:
19-
include:
20-
- os: ubuntu-22.04
21-
name: Linux
22-
- os: macos-14
23-
name: macOS-arm64
24-
- os: macos-13
25-
name: macOS-x64
26-
- os: windows-2022
27-
name: Windows
28-
29-
runs-on: ${{ matrix.os }}
30-
name: ${{ matrix.name }}
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 }
3145

3246
steps:
3347
- name: Checkout
3448
uses: actions/checkout@v4
3549

36-
- name: Install Qt (Linux)
50+
# -----------------------------------------------------------------------
51+
# Install CMake 3.28+ (Ubuntu 22.04 ships with 3.22)
52+
# -----------------------------------------------------------------------
53+
- name: Install CMake
54+
if: runner.os == 'Linux'
55+
uses: lukka/get-cmake@latest
56+
57+
# -----------------------------------------------------------------------
58+
# Install Qt6 (6.8 LTS across all platforms)
59+
# -----------------------------------------------------------------------
60+
- name: Install Linux dependencies
3761
if: runner.os == 'Linux'
3862
run: |
3963
sudo apt-get update
40-
sudo apt-get install -y qt6-base-dev libgl1-mesa-dev
41-
42-
- name: Install Qt (macOS)
43-
if: runner.os == 'macOS'
44-
uses: jurplel/install-qt-action@v4
45-
with:
46-
version: '6.5.*'
47-
cache: true
64+
sudo apt-get install -y libgl1-mesa-dev libxkbcommon-dev libxcb-cursor0
4865
49-
- name: Install Qt (Windows)
50-
if: runner.os == 'Windows'
66+
- name: Install Qt
5167
uses: jurplel/install-qt-action@v4
5268
with:
53-
version: '6.5.*'
54-
arch: win64_msvc2019_64
69+
version: '6.8.*'
5570
cache: true
5671

72+
# -----------------------------------------------------------------------
73+
# Configure
74+
# -----------------------------------------------------------------------
5775
- name: Configure CMake
5876
run: >
5977
cmake -S . -B build
6078
-DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }}
79+
-DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/install
6180
-DLSL_FETCH_IF_MISSING=ON
81+
${{ matrix.config.cmake_extra }}
6282
83+
# -----------------------------------------------------------------------
84+
# Build
85+
# -----------------------------------------------------------------------
6386
- name: Build
6487
run: cmake --build build --config ${{ env.BUILD_TYPE }} --parallel
6588

66-
- name: Test CLI
89+
# -----------------------------------------------------------------------
90+
# Test
91+
# -----------------------------------------------------------------------
92+
- name: Test CLI (Unix)
6793
if: runner.os != 'Windows'
68-
run: ./build/cli/EGIAmpServerCLI --help
94+
run: ./build/src/cli/EGIAmpServerCLI --help
6995

7096
- name: Test CLI (Windows)
7197
if: runner.os == 'Windows'
72-
run: .\build\cli\Release\EGIAmpServerCLI.exe --help
98+
run: .\build\src\cli\Release\EGIAmpServerCLI.exe --help
99+
100+
# -----------------------------------------------------------------------
101+
# Install
102+
# -----------------------------------------------------------------------
103+
- name: Install
104+
run: cmake --install build --config ${{ env.BUILD_TYPE }}
73105

106+
# -----------------------------------------------------------------------
107+
# Package
108+
# -----------------------------------------------------------------------
74109
- name: Package
75110
run: cpack -C ${{ env.BUILD_TYPE }}
76111
working-directory: build
77112

78-
- name: Upload artifacts
113+
# -----------------------------------------------------------------------
114+
# Upload Artifacts
115+
# -----------------------------------------------------------------------
116+
- name: Upload Artifacts
79117
uses: actions/upload-artifact@v4
80118
with:
81-
name: EGIAmpServer-${{ matrix.name }}
119+
name: package-${{ matrix.config.os }}
82120
path: |
83121
build/*.zip
84122
build/*.tar.gz
85123
build/*.deb
124+
if-no-files-found: ignore
125+
126+
# ===========================================================================
127+
# macOS Signing and Notarization (Release only)
128+
# ===========================================================================
129+
sign-macos:
130+
name: Sign & Notarize (macOS)
131+
needs: build
132+
if: github.event_name == 'release'
133+
runs-on: macos-14
134+
135+
steps:
136+
- name: Checkout
137+
uses: actions/checkout@v4
138+
139+
- name: Download macOS Artifact
140+
uses: actions/download-artifact@v4
141+
with:
142+
name: package-macos-14
143+
path: packages
144+
145+
- name: Extract Package
146+
run: |
147+
cd packages
148+
tar -xzf *.tar.gz
149+
# Move contents out of versioned subdirectory to packages/
150+
SUBDIR=$(ls -d EGIAmpServer-*/ | head -1)
151+
mv "$SUBDIR"/* .
152+
rmdir "$SUBDIR"
153+
ls -la
154+
155+
# -----------------------------------------------------------------------
156+
# Install Apple Certificates
157+
# -----------------------------------------------------------------------
158+
- name: Install Apple Certificates
159+
env:
160+
MACOS_CERTIFICATE: ${{ secrets.PROD_MACOS_CERTIFICATE }}
161+
MACOS_CERTIFICATE_PWD: ${{ secrets.PROD_MACOS_CERTIFICATE_PWD }}
162+
MACOS_CI_KEYCHAIN_PWD: ${{ secrets.PROD_MACOS_CI_KEYCHAIN_PWD }}
163+
run: |
164+
# Create temporary keychain
165+
KEYCHAIN_PATH=$RUNNER_TEMP/build.keychain
166+
security create-keychain -p "$MACOS_CI_KEYCHAIN_PWD" $KEYCHAIN_PATH
167+
security default-keychain -s $KEYCHAIN_PATH
168+
security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
169+
security unlock-keychain -p "$MACOS_CI_KEYCHAIN_PWD" $KEYCHAIN_PATH
170+
171+
# Import certificate
172+
CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12
173+
echo -n "$MACOS_CERTIFICATE" | base64 --decode -o $CERTIFICATE_PATH
174+
security import $CERTIFICATE_PATH -P "$MACOS_CERTIFICATE_PWD" -k $KEYCHAIN_PATH -A -t cert -f pkcs12
175+
rm $CERTIFICATE_PATH
176+
177+
# Allow codesign to access keychain
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+
# Extract identity name and export to environment
182+
IDENTITY=$(security find-identity -v -p codesigning $KEYCHAIN_PATH | grep "Developer ID Application" | head -1 | awk -F'"' '{print $2}')
183+
echo "APPLE_CODE_SIGN_IDENTITY_APP=$IDENTITY" >> $GITHUB_ENV
184+
185+
# -----------------------------------------------------------------------
186+
# Setup Notarization Credentials
187+
# -----------------------------------------------------------------------
188+
- name: Setup Notarization
189+
env:
190+
NOTARIZATION_APPLE_ID: ${{ secrets.PROD_MACOS_NOTARIZATION_APPLE_ID }}
191+
NOTARIZATION_PWD: ${{ secrets.PROD_MACOS_NOTARIZATION_PWD }}
192+
NOTARIZATION_TEAM_ID: ${{ secrets.PROD_MACOS_NOTARIZATION_TEAM_ID }}
193+
run: |
194+
xcrun notarytool store-credentials "notarize-profile" \
195+
--apple-id "$NOTARIZATION_APPLE_ID" \
196+
--password "$NOTARIZATION_PWD" \
197+
--team-id "$NOTARIZATION_TEAM_ID"
198+
echo "APPLE_NOTARIZE_KEYCHAIN_PROFILE=notarize-profile" >> $GITHUB_ENV
199+
200+
# -----------------------------------------------------------------------
201+
# Sign and Notarize
202+
# -----------------------------------------------------------------------
203+
- name: Sign and Notarize
204+
env:
205+
ENTITLEMENTS_FILE: ${{ github.workspace }}/app.entitlements
206+
run: |
207+
APP_PATH=$(find packages -name "*.app" -type d | head -1)
208+
if [[ -n "$APP_PATH" ]]; then
209+
./scripts/sign_and_notarize.sh "$APP_PATH" --notarize
210+
fi
211+
212+
# -----------------------------------------------------------------------
213+
# Repackage
214+
# -----------------------------------------------------------------------
215+
- name: Repackage
216+
run: |
217+
cd packages
218+
219+
echo "Contents of packages directory:"
220+
ls -la
221+
222+
rm -f *.tar.gz
223+
224+
VERSION=$(grep -A1 'project(EGIAmpServer' ../CMakeLists.txt | grep VERSION | sed 's/.*VERSION \([0-9.]*\).*/\1/')
225+
echo "Detected version: $VERSION"
226+
227+
tar -cvzf "EGIAmpServer-${VERSION}-macOS_universal-signed.tar.gz" \
228+
EGIAmpServer.app ampserver_config.cfg
229+
230+
echo "Created package:"
231+
ls -la *.tar.gz
232+
233+
- name: Upload Signed Package
234+
uses: actions/upload-artifact@v4
235+
with:
236+
name: package-macos-signed
237+
path: packages/*-signed.tar.gz
86238

87-
- name: Upload to release
239+
- name: Upload to Release
88240
if: github.event_name == 'release'
241+
uses: softprops/action-gh-release@v2
242+
with:
243+
files: packages/*-signed.tar.gz
244+
245+
# ===========================================================================
246+
# Upload unsigned packages to release
247+
# ===========================================================================
248+
release:
249+
name: Upload to Release
250+
needs: build
251+
if: github.event_name == 'release'
252+
runs-on: ubuntu-latest
253+
254+
steps:
255+
- name: Download All Artifacts
256+
uses: actions/download-artifact@v4
257+
with:
258+
path: artifacts
259+
260+
- name: Upload to Release
89261
uses: softprops/action-gh-release@v2
90262
with:
91263
files: |
92-
build/*.zip
93-
build/*.tar.gz
94-
build/*.deb
264+
artifacts/**/*.zip
265+
artifacts/**/*.tar.gz
266+
artifacts/**/*.deb

CMakeLists.txt

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ option(EGIAMP_BUILD_MOCK "Build the mock EGI Amp device for testing" ON)
2525
set(LSL_SOURCE_DIR "" CACHE PATH "Path to liblsl source for parallel development (highest priority)")
2626
set(LSL_INSTALL_ROOT "" CACHE PATH "Path to installed liblsl (second priority)")
2727
option(LSL_FETCH_IF_MISSING "Fetch liblsl from GitHub if not found locally" ON)
28-
set(LSL_FETCH_VERSION "1.16.2" CACHE STRING "liblsl version to fetch from GitHub")
28+
# TODO: Change back to version tag (e.g., "v1.16.2") once apple_framework branch is merged
29+
set(LSL_FETCH_REF "cboulay/apple_framework" CACHE STRING "liblsl git ref to fetch (tag, branch, or commit)")
2930

3031
# =============================================================================
3132
# Find/Fetch liblsl
@@ -278,11 +279,21 @@ if(APPLE AND EGIAMP_BUILD_GUI)
278279
set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${PROJECT_VERSION}")
279280

280281
install(CODE "
281-
message(STATUS \"Running ad-hoc code signing...\")
282+
set(_app \"\${CMAKE_INSTALL_PREFIX}/${INSTALL_BINDIR}/${PROJECT_NAME}.app\")
283+
set(_ent \"${CMAKE_CURRENT_SOURCE_DIR}/app.entitlements\")
284+
285+
message(STATUS \"Signing app bundle...\")
282286
execute_process(
283-
COMMAND codesign --force --deep --sign -
284-
\"\${CMAKE_INSTALL_PREFIX}/${INSTALL_BINDIR}/${PROJECT_NAME}.app\"
287+
COMMAND codesign --force --deep --sign - --entitlements \"\${_ent}\" \"\${_app}\"
288+
RESULT_VARIABLE _sign_result
285289
)
290+
291+
execute_process(COMMAND codesign --verify --verbose \"\${_app}\" RESULT_VARIABLE _verify_result)
292+
if(_verify_result EQUAL 0)
293+
message(STATUS \"App bundle signature verified successfully\")
294+
else()
295+
message(WARNING \"App bundle signature verification failed!\")
296+
endif()
286297
")
287298
endif()
288299

app.entitlements

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3+
<plist version="1.0">
4+
<dict>
5+
<key>com.apple.security.network.client</key>
6+
<true/>
7+
<key>com.apple.security.network.server</key>
8+
<true/>
9+
<key>com.apple.security.network.multicast</key>
10+
<true/>
11+
</dict>
12+
</plist>

0 commit comments

Comments
 (0)