Skip to content

Commit 42ae782

Browse files
committed
ARM runners, arm packages (rpi, jetson compatible)
1 parent 22cae13 commit 42ae782

File tree

9 files changed

+409
-59
lines changed

9 files changed

+409
-59
lines changed

.editorconfig

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ insert_final_newline = true
66
charset = utf-8
77
indent_style = tab
88

9-
[*.yaml]
9+
[*.{yaml,yml}]
1010
indent_style = space
1111
indent_size = 2
12-
12+
insert_final_newline = true
13+
end_of_line = lf

.github/workflows/android.yml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@ name: Android
33
on:
44
push:
55
branches: ['androidci']
6-
paths_ignore: ['docs/**', '.travis.yml']
6+
paths:
7+
- '**'
8+
- '!docs/**'
9+
- '!.github/**'
10+
- '.github/workflows/android.yml'
711
workflow_dispatch:
812
inputs:
913
cmakeextra:
@@ -53,4 +57,3 @@ jobs:
5357
with:
5458
name: build-android-${{ matrix.config.arch }}
5559
path: install
56-

.github/workflows/apple.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,13 @@ jobs:
112112
install/bin/lsl_test_internal --order rand --wait-for-keypress never --durations yes
113113
install/bin/lsl_test_exported --order rand --wait-for-keypress never --durations yes
114114
timeout-minutes: 10
115+
- name: unit test (intel)
116+
if: matrix.config.name == 'macOS-15-intel'
117+
run: |
118+
mkdir -p dumps
119+
install/bin/lsl_test_internal --order rand --wait-for-keypress never --durations yes
120+
install/bin/lsl_test_exported --order rand --wait-for-keypress never --durations yes
121+
timeout-minutes: 10
115122

116123
- name: Package and Notarize macOS Installer
117124
if: matrix.config.name == 'macOS-latest'

.github/workflows/cppcmake.yml

Lines changed: 154 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -33,72 +33,168 @@ jobs:
3333
build:
3434
name: ${{ matrix.config.name }}
3535
runs-on: ${{ matrix.config.os }}
36+
timeout-minutes: 30
3637
strategy:
3738
fail-fast: false
3839
matrix:
3940
config:
40-
- {name: "ubuntu-22.04", os: "ubuntu-22.04", cmake_extra: "-DLSL_BUNDLED_PUGIXML=OFF" }
41-
- {name: "ubuntu-24.04", os: "ubuntu-24.04", cmake_extra: "-DLSL_BUNDLED_PUGIXML=OFF" }
42-
- {name: "windows-x64", os: "windows-latest", cmake_extra: "-T v142,host=x86"}
43-
- {name: "windows-32", os: "windows-latest", cmake_extra: "-T v142,host=x86 -A Win32"}
41+
# x86_64 Linux builds
42+
- {name: "ubuntu-22.04-x64", os: "ubuntu-22.04", arch: "x86_64", cmake_extra: "-DLSL_BUNDLED_PUGIXML=OFF" }
43+
- {name: "ubuntu-24.04-x64", os: "ubuntu-24.04", arch: "x86_64", cmake_extra: "-DLSL_BUNDLED_PUGIXML=OFF" }
44+
45+
# ARM Linux builds - cross-compiled with QEMU testing (Jetson, Raspberry Pi compatible)
46+
# SHLIBDEPS must be disabled for cross-compiled packages as the host system
47+
# does not have the target architecture libraries installed
48+
- {name: "ubuntu-22.04-arm64", os: "ubuntu-22.04", arch: "aarch64", cross_compile: true, cmake_extra: "-DLSL_BUNDLED_PUGIXML=ON -DLSL_DISABLE_PACKAGE_SHLIBDEPS=ON" }
49+
- {name: "ubuntu-22.04-armhf", os: "ubuntu-22.04", arch: "armv7", cross_compile: true, cmake_extra: "-DLSL_BUNDLED_PUGIXML=ON -DLSL_DISABLE_PACKAGE_SHLIBDEPS=ON" }
50+
51+
# Native ARM build
52+
# - {name: "ubuntu-24.04-arm64-native", os: "ubuntu-24.04-arm", arch: "aarch64", cmake_extra: "-DLSL_BUNDLED_PUGIXML=OFF" }
53+
54+
# Windows builds
55+
- {name: "windows-x64", os: "windows-latest", arch: "x86_64", cmake_extra: "-T v142,host=x86"}
56+
- {name: "windows-x86", os: "windows-latest", arch: "x86", cmake_extra: "-T v142,host=x86 -A Win32"}
57+
- {name: "windows-arm64", os: "windows-11-arm", arch: "aarch64", cmake_extra: "-T v143,host=ARM64 -A ARM64"}
58+
59+
# macOS builds (Apple Silicon + Intel)
60+
# - {name: "macos-latest", os: "macos-latest", arch: "universal"}
4461

4562
steps:
46-
- uses: actions/checkout@v4
63+
- uses: actions/checkout@v5
64+
65+
# Set up cross-compilation toolchain for ARM on Linux
66+
- name: Install cross-compilation toolchain
67+
if: matrix.config.cross_compile && runner.os == 'Linux'
68+
run: |
69+
sudo apt-get update
70+
if [[ "${{ matrix.config.arch }}" == "aarch64" ]]; then
71+
sudo apt-get install -y --no-install-recommends \
72+
gcc-aarch64-linux-gnu \
73+
g++-aarch64-linux-gnu
74+
echo "CMAKE_TOOLCHAIN=-DCMAKE_TOOLCHAIN_FILE=${GITHUB_WORKSPACE}/cmake/toolchains/aarch64-linux-gnu.cmake" >> $GITHUB_ENV
75+
elif [[ "${{ matrix.config.arch }}" == "armv7" ]]; then
76+
sudo apt-get install -y --no-install-recommends \
77+
gcc-arm-linux-gnueabihf \
78+
g++-arm-linux-gnueabihf
79+
echo "CMAKE_TOOLCHAIN=-DCMAKE_TOOLCHAIN_FILE=${GITHUB_WORKSPACE}/cmake/toolchains/arm-linux-gnueabihf.cmake" >> $GITHUB_ENV
80+
fi
81+
82+
# Cache dependencies for Linux
83+
- name: Cache APT packages
84+
if: runner.os == 'Linux'
85+
uses: actions/cache@v4
86+
with:
87+
path: /var/cache/apt/archives
88+
key: ${{ runner.os }}-apt-${{ matrix.config.name }}-${{ hashFiles('.github/workflows/cppcmake.yml') }}
89+
restore-keys: |
90+
${{ runner.os }}-apt-${{ matrix.config.name }}-
91+
${{ runner.os }}-apt-
92+
93+
# Cache build artifacts with ccache
94+
- name: Cache ccache
95+
if: runner.os == 'Linux' || runner.os == 'macOS'
96+
uses: actions/cache@v4
97+
with:
98+
path: ~/.ccache
99+
key: ${{ runner.os }}-ccache-${{ matrix.config.name }}-${{ github.sha }}
100+
restore-keys: |
101+
${{ runner.os }}-ccache-${{ matrix.config.name }}-
102+
${{ runner.os }}-ccache-
103+
104+
- name: Install ccache
105+
if: runner.os == 'Linux' || runner.os == 'macOS'
106+
run: |
107+
if [[ "${{ runner.os }}" == "Linux" ]]; then
108+
sudo apt-get install -y ccache
109+
elif [[ "${{ runner.os }}" == "macOS" ]]; then
110+
brew install ccache
111+
fi
112+
ccache --max-size=500M
113+
ccache --set-config=compression=true
114+
115+
- name: Install dependencies
116+
if: runner.os == 'Linux'
117+
run: |
118+
if [[ "${{ matrix.config.cross_compile }}" != "true" ]]; then
119+
sudo apt-get install -y --no-install-recommends libpugixml-dev
120+
fi
47121
48122
- name: Configure CMake
49123
run: |
50-
if [[ "${{ matrix.config.name }}" = ubuntu-2* ]]; then
51-
sudo apt-get install -y --no-install-recommends libpugixml-dev
52-
fi
53-
cmake --version
54-
cmake -S . -B build \
55-
-DCMAKE_BUILD_TYPE=Release \
56-
-DCMAKE_INSTALL_PREFIX=${PWD}/install \
57-
-DLSL_UNITTESTS=ON \
58-
-DLSL_BENCHMARKS=ON \
59-
-DCPACK_PACKAGE_DIRECTORY=${PWD}/package \
60-
-Dlslgitrevision=${{ github.sha }} \
61-
-Dlslgitbranch=${{ github.ref }} \
62-
${{ matrix.config.cmake_extra }} \
63-
${{ github.event.inputs.cmakeextra }}
64-
echo ${PWD}
65-
66-
- name: make
67-
run: cmake --build build --config Release -j
68-
69-
- name: make install
124+
# Set up ccache as compiler wrapper (skip for cross-compilation)
125+
if [[ "${{ runner.os }}" == "Linux" || "${{ runner.os }}" == "macOS" ]] && [[ "${{ matrix.config.cross_compile }}" != "true" ]]; then
126+
export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"
127+
export CC="ccache gcc"
128+
export CXX="ccache g++"
129+
fi
130+
131+
cmake --version
132+
cmake -S . -B build \
133+
-DCMAKE_BUILD_TYPE=Release \
134+
-DCMAKE_INSTALL_PREFIX=${PWD}/install \
135+
-DLSL_UNITTESTS=ON \
136+
-DLSL_BENCHMARKS=ON \
137+
-DCPACK_PACKAGE_DIRECTORY=${PWD}/package \
138+
-DCPACK_PACKAGE_FILE_NAME="liblsl-${{ matrix.config.arch }}" \
139+
-Dlslgitrevision=${{ github.sha }} \
140+
-Dlslgitbranch=${{ github.ref }} \
141+
${CMAKE_TOOLCHAIN} \
142+
${{ matrix.config.cmake_extra }} \
143+
${{ github.event.inputs.cmakeextra }}
144+
echo "Build directory: ${PWD}"
145+
146+
- name: Build
147+
run: |
148+
cmake --build build --config Release -j
149+
# Show ccache statistics
150+
if command -v ccache &> /dev/null; then
151+
ccache -s
152+
fi
153+
154+
- name: Install
70155
run: cmake --build build --config Release --target install
71156

72-
- name: test install using examples
157+
- name: Test install using examples
73158
run: |
74-
# Test that the in-tree install was successful by building the examples
75-
cmake -S examples -B examples/build \
76-
-DLSL_INSTALL_ROOT=${PWD}/install \
77-
-DCMAKE_INSTALL_PREFIX=examples/build/install \
78-
-DLSL_COMFY_DEFAULTS=ON \
79-
${{ matrix.config.cmake_extra }} \
80-
${{ github.event.inputs.cmakeextra }}
81-
cmake --build examples/build --target install --config Release -j
159+
# Test that the in-tree install was successful by building the examples
160+
cmake -S examples -B examples/build \
161+
-DLSL_INSTALL_ROOT=${PWD}/install \
162+
-DCMAKE_INSTALL_PREFIX=examples/build/install \
163+
-DLSL_COMFY_DEFAULTS=ON \
164+
${CMAKE_TOOLCHAIN} \
165+
${{ matrix.config.cmake_extra }} \
166+
${{ github.event.inputs.cmakeextra }}
167+
cmake --build examples/build --target install --config Release -j
168+
169+
# Run example binary (skip for cross-compiled builds - no QEMU)
170+
if [[ "${{ matrix.config.cross_compile }}" != "true" ]]; then
82171
./examples/build/install/bin/HandleMetaData
172+
else
173+
echo "Skipping example execution for cross-compiled build (requires real ARM hardware)"
174+
echo "Build validation successful - binary can be tested on target hardware"
175+
fi
83176
84-
- name: package
177+
- name: Package
85178
run: |
86-
echo $GITHUB_REF
87-
cmake --build build --target package --config Release -j
88-
echo $PWD
89-
ls -la
90-
# On Debian / Ubuntu the dependencies can only be resolved for
91-
# already installed packages. Therefore, we have built all
92-
# packages without dependencies in the previous step,
93-
# install them and rebuild them with dependency discovery enabled
94-
if [[ "${{ matrix.config.os }}" == ubuntu-* ]]; then
95-
cmake -DCPACK_DEBIAN_PACKAGE_SHLIBDEPS=ON .
96-
sudo dpkg -i package/*.deb
97-
cmake --build build --target package --config Release -j
98-
dpkg -I package/liblsl*.deb
99-
fi
100-
cmake -E remove_directory package/_CPack_Packages
101-
cp testing/lslcfgs/default.cfg .
179+
echo "Creating package for ${{ matrix.config.arch }}"
180+
cmake --build build --target package --config Release -j
181+
182+
# On Debian / Ubuntu the dependencies can only be resolved for
183+
# already installed packages (only for native builds, not cross-compiled)
184+
if [[ "${{ matrix.config.os }}" == ubuntu-* ]] && [[ "${{ matrix.config.cross_compile }}" != "true" ]]; then
185+
cmake -DCPACK_DEBIAN_PACKAGE_SHLIBDEPS=ON build
186+
sudo dpkg -i package/*.deb
187+
cmake --build build --target package --config Release -j
188+
dpkg -I package/liblsl*.deb
189+
fi
190+
191+
if [[ "${{ matrix.config.cross_compile }}" == "true" ]]; then
192+
echo "Cross-compiled ${{ matrix.config.arch }} package created"
193+
ls -lh package/
194+
fi
195+
196+
cmake -E remove_directory package/_CPack_Packages
197+
cp testing/lslcfgs/default.cfg . 2>/dev/null || true
102198
103199
- name: upload install dir
104200
uses: actions/upload-artifact@master
@@ -122,14 +218,18 @@ jobs:
122218
ip -6 route
123219
fi
124220
125-
# run internal tests
126-
- name: unit tests
221+
# Run tests (native builds only)
222+
- name: Unit tests
223+
if: matrix.config.cross_compile != true
127224
run: |
128-
if [[ "${{ matrix.config.name }}" = ubuntu-2* ]]; then
225+
# Set up core dumps for debugging
226+
if [[ "${{ matrix.config.name }}" == ubuntu-* ]]; then
129227
ulimit -c unlimited
130228
echo "$PWD/dumps/corefile-%e-%p-%t" | sudo tee /proc/sys/kernel/core_pattern
131229
fi
132230
mkdir -p dumps
231+
232+
# Run unit tests
133233
install/bin/lsl_test_internal --order rand --wait-for-keypress never --durations yes
134234
install/bin/lsl_test_exported --order rand --wait-for-keypress never --durations yes
135235
timeout-minutes: 10

0 commit comments

Comments
 (0)