Skip to content

Implement error callback system for simplified error handling #58

Implement error callback system for simplified error handling

Implement error callback system for simplified error handling #58

Workflow file for this run

name: Linux Build
on:
push:
branches: [ main, develop, support_linux ]
pull_request:
branches: [ main, develop ]
jobs:
build-ubuntu:
name: "Build (${{ matrix.build_type }}-gcc)"
runs-on: ubuntu-latest
strategy:
matrix:
build_type: [Debug, Release]
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Install base dependencies
run: |
sudo apt-get update
sudo apt-get install -y cmake build-essential gcc
- name: Install GLFW (for Release builds only)
if: matrix.build_type == 'Release'
run: |
sudo apt-get install -y libglfw3-dev
echo "GLFW_INSTALLED=true" >> $GITHUB_ENV
- name: Setup compiler
run: |
echo "CC=gcc" >> $GITHUB_ENV
echo "CXX=g++" >> $GITHUB_ENV
- name: Configure CMake
run: |
echo "Configuring build ${{ matrix.build_type }} with gcc"
cmake -B build/${{ matrix.build_type }} \
-DCMAKE_BUILD_TYPE=${{ matrix.build_type }} \
-DCCAP_BUILD_EXAMPLES=ON \
-DCCAP_BUILD_TESTS=ON
- name: Build
run: cmake --build build/${{ matrix.build_type }} --config ${{ matrix.build_type }} --parallel $(nproc)
- name: Verify GLFW examples build status
working-directory: build/${{ matrix.build_type }}
run: |
echo "Checking built examples:"
ls -la | grep -E "(glfw|example)" || echo "No GLFW examples found"
if [ "${{ matrix.build_type }}" = "Release" ]; then
echo "Release build - checking if GLFW examples were built with system GLFW:"
if [ -f "4-example_with_glfw" ]; then
echo "✓ GLFW example successfully built with system GLFW"
else
echo "✗ GLFW example not found - this might indicate a build issue"
exit 1
fi
else
echo "Debug build - checking if bundled GLFW was used:"
if [ -f "4-example_with_glfw" ]; then
echo "✓ GLFW example successfully built with bundled GLFW"
else
echo "ℹ GLFW example not built - using bundled GLFW or GLFW disabled"
fi
fi
- name: Run Unit Tests
if: matrix.build_type == 'Release'
run: |
cd scripts
./run_tests.sh --functional --exit-when-failed
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: ccap-linux-gcc-${{ matrix.build_type }}
path: |
build/${{ matrix.build_type }}/libccap.a
build/${{ matrix.build_type }}/0-print_camera
build/${{ matrix.build_type }}/1-minimal_example
build/${{ matrix.build_type }}/2-capture_grab
build/${{ matrix.build_type }}/3-capture_callback
build/${{ matrix.build_type }}/4-example_with_glfw
build/${{ matrix.build_type }}/*_results.xml
if-no-files-found: warn
build-ubuntu-clang:
name: "Build (${{ matrix.build_type }}-clang)"
runs-on: ubuntu-latest
# Run clang builds on push to main and on pull requests
if: github.event_name == 'pull_request' || (github.event_name == 'push' && github.ref == 'refs/heads/main')
strategy:
matrix:
build_type: [Debug, Release]
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y cmake build-essential clang libglfw3-dev
- name: Setup compiler
run: |
echo "CC=clang" >> $GITHUB_ENV
echo "CXX=clang++" >> $GITHUB_ENV
- name: Configure CMake
run: |
echo "Configuring build ${{ matrix.build_type }} with clang (with system GLFW)"
cmake -B build/${{ matrix.build_type }} \
-DCMAKE_BUILD_TYPE=${{ matrix.build_type }} \
-DCCAP_BUILD_EXAMPLES=ON \
-DCCAP_BUILD_TESTS=ON
- name: Build
run: cmake --build build/${{ matrix.build_type }} --config ${{ matrix.build_type }} --parallel $(nproc)
- name: Verify build outputs
working-directory: build/${{ matrix.build_type }}
run: |
echo "Checking built examples:"
ls -la | grep -E "(glfw|example)" || echo "No examples found"
echo "✓ Build completed successfully"
- name: Run Unit Tests
if: matrix.build_type == 'Release'
run: |
cd scripts
./run_tests.sh --functional --exit-when-failed
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: ccap-linux-clang-${{ matrix.build_type }}
path: |
build/${{ matrix.build_type }}/libccap.a
build/${{ matrix.build_type }}/0-print_camera
build/${{ matrix.build_type }}/1-minimal_example
build/${{ matrix.build_type }}/2-capture_grab
build/${{ matrix.build_type }}/3-capture_callback
build/${{ matrix.build_type }}/4-example_with_glfw
build/${{ matrix.build_type }}/*_results.xml
if-no-files-found: warn
build-ubuntu-arm64:
name: "Build ARM64 (${{ matrix.build_type }}-gcc)"
runs-on: ubuntu-latest
strategy:
matrix:
build_type: [Debug, Release]
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Install cross-compilation toolchain
run: |
sudo apt-get update
sudo apt-get install -y cmake build-essential gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
echo "Cross-compilation toolchain installed"
- name: Configure CMake for ARM64
run: |
echo "Configuring build ${{ matrix.build_type }} for ARM64 (cross-compilation)"
cmake -B build/arm64/${{ matrix.build_type }} \
-DCMAKE_BUILD_TYPE=${{ matrix.build_type }} \
-DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc \
-DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ \
-DCMAKE_SYSTEM_NAME=Linux \
-DCMAKE_SYSTEM_PROCESSOR=aarch64 \
-DCMAKE_CROSSCOMPILING=ON \
-DCCAP_BUILD_EXAMPLES=ON \
-DCCAP_BUILD_TESTS=ON
- name: Build ARM64
run: cmake --build build/arm64/${{ matrix.build_type }} --config ${{ matrix.build_type }} --parallel $(nproc)
- name: Build ARM64 test target (Release only)
if: matrix.build_type == 'Release'
run: |
cmake --build build/arm64/${{ matrix.build_type }} --config ${{ matrix.build_type }} --target ccap_convert_test --parallel $(nproc)
- name: Install QEMU for ARM64 test emulation (PRs and main push, Release only)
if: (github.event_name == 'pull_request' || (github.event_name == 'push' && github.ref == 'refs/heads/main')) && matrix.build_type == 'Release'
run: |
sudo apt-get update
sudo apt-get install -y qemu-user qemu-user-static
qemu-aarch64 --version
- name: Run ARM64 Unit Tests (PRs and main push, Release only)
if: (github.event_name == 'pull_request' || (github.event_name == 'push' && github.ref == 'refs/heads/main')) && matrix.build_type == 'Release'
run: |
TEST_BIN="build/arm64/${{ matrix.build_type }}/tests/ccap_convert_test"
if [ ! -x "$TEST_BIN" ]; then
echo "Test binary not found: $TEST_BIN" >&2
ls -la "build/arm64/${{ matrix.build_type }}" || true
exit 1
fi
echo "Verifying test binary architecture:"
file "$TEST_BIN" || true
echo "Running ARM64 unit tests via QEMU..."
# Use the ARM64 sysroot provided by the cross toolchain for dynamic libs
qemu-aarch64 -L /usr/aarch64-linux-gnu "$TEST_BIN" \
--gtest_fail_fast \
--gtest_output=xml:build/arm64/${{ matrix.build_type }}/arm64_results.xml
echo "✓ ARM64 unit tests finished"
- name: Verify build outputs
working-directory: build/arm64/${{ matrix.build_type }}
run: |
echo "Checking built ARM64 binaries:"
ls -la | grep -E "(ccap|example)" || echo "No examples found"
echo "Verifying ARM64 architecture:"
file libccap.a | grep -q "aarch64" && echo "✓ Library is ARM64" || echo "⚠ Library architecture verification failed"
if [ -f "0-print_camera" ]; then
file 0-print_camera | grep -q "aarch64" && echo "✓ Binary is ARM64" || echo "⚠ Binary architecture verification failed"
fi
echo "✓ ARM64 cross-compilation completed successfully"
- name: Upload ARM64 artifacts
uses: actions/upload-artifact@v4
with:
name: ccap-linux-arm64-gcc-${{ matrix.build_type }}
path: |
build/arm64/${{ matrix.build_type }}/libccap.a
build/arm64/${{ matrix.build_type }}/0-print_camera
build/arm64/${{ matrix.build_type }}/1-minimal_example
build/arm64/${{ matrix.build_type }}/2-capture_grab
build/arm64/${{ matrix.build_type }}/3-capture_callback
build/arm64/${{ matrix.build_type }}/4-example_with_glfw
build/arm64/${{ matrix.build_type }}/*_results.xml
if-no-files-found: warn
build-fedora:
name: "Build Fedora (${{ matrix.build_type }})"
runs-on: ubuntu-latest
container: fedora:latest
strategy:
matrix:
build_type: [Debug, Release]
steps:
- name: Install Git first
run: |
dnf update -y
dnf install -y git
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Install dependencies
run: |
dnf install -y cmake gcc-c++ make
- name: Configure CMake
run: |
cmake -B build/${{ matrix.build_type }} \
-DCMAKE_BUILD_TYPE=${{ matrix.build_type }} \
-DCCAP_BUILD_EXAMPLES=ON \
-DCCAP_BUILD_TESTS=ON
- name: Build
run: cmake --build build/${{ matrix.build_type }} --config ${{ matrix.build_type }} --parallel $(nproc)
- name: Run Unit Tests
if: matrix.build_type == 'Release'
run: |
cd scripts
./run_tests.sh --functional --exit-when-failed
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: ccap-fedora-${{ matrix.build_type }}
path: |
build/${{ matrix.build_type }}/libccap.a
build/${{ matrix.build_type }}/0-print_camera
build/${{ matrix.build_type }}/1-minimal_example
build/${{ matrix.build_type }}/2-capture_grab
build/${{ matrix.build_type }}/3-capture_callback
build/${{ matrix.build_type }}/*_results.xml
if-no-files-found: warn