feat(windows): add CCAP_WIN_NO_DEVICE_VERIFY option to skip device ve… #2
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Linux Build | |
| on: | |
| push: | |
| branches: [ main, develop, support_linux ] | |
| pull_request: | |
| branches: [ main, develop ] | |
| jobs: | |
| build-ubuntu: | |
| name: "Build (${{ matrix.build_type }}-gcc-${{ matrix.library_type }})" | |
| runs-on: ubuntu-latest | |
| strategy: | |
| matrix: | |
| build_type: [Debug, Release] | |
| library_type: [static, shared] | |
| 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: | | |
| if [ "${{ matrix.library_type }}" = "shared" ]; then | |
| SHARED_FLAG="-DCCAP_BUILD_SHARED=ON" | |
| echo "Configuring build ${{ matrix.build_type }} with gcc (SHARED LIBRARY)" | |
| else | |
| SHARED_FLAG="" | |
| echo "Configuring build ${{ matrix.build_type }} with gcc (STATIC LIBRARY)" | |
| fi | |
| cmake -B build/${{ matrix.build_type }}-${{ matrix.library_type }} \ | |
| -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} \ | |
| -DCCAP_BUILD_EXAMPLES=ON \ | |
| -DCCAP_BUILD_TESTS=ON \ | |
| $SHARED_FLAG | |
| - name: Build | |
| run: cmake --build build/${{ matrix.build_type }}-${{ matrix.library_type }} --config ${{ matrix.build_type }} --parallel $(nproc) | |
| - name: Verify library type and GLFW examples build status | |
| working-directory: build/${{ matrix.build_type }}-${{ matrix.library_type }} | |
| run: | | |
| echo "Checking built examples:" | |
| ls -la | grep -E "(glfw|example)" || echo "No GLFW examples found" | |
| # Verify library type | |
| if [ "${{ matrix.library_type }}" = "shared" ]; then | |
| if [ -f "libccap.so" ]; then | |
| echo "✓ Shared library libccap.so successfully built" | |
| echo "Exported symbols check:" | |
| nm -gD libccap.so | grep "ccap_provider_create" && echo "✓ C symbols exported" || echo "✗ C symbols not found" | |
| nm -gD libccap.so | grep "_ZN4ccap" | head -2 && echo "✓ C++ symbols exported" || echo "✗ C++ symbols not found" | |
| else | |
| echo "✗ Shared library not found" | |
| exit 1 | |
| fi | |
| else | |
| if [ -f "libccap.a" ]; then | |
| echo "✓ Static library libccap.a successfully built" | |
| else | |
| echo "✗ Static library not found" | |
| exit 1 | |
| fi | |
| fi | |
| 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: Test shared library linking | |
| if: matrix.library_type == 'shared' | |
| working-directory: build/${{ matrix.build_type }}-${{ matrix.library_type }} | |
| run: | | |
| echo "Testing shared library linking..." | |
| # Create a simple test program | |
| cat > test_shared.cpp << 'EOF' | |
| #include "ccap_c.h" | |
| #include <stdio.h> | |
| int main() { | |
| const char* version = ccap_get_version(); | |
| printf("Library version: %s\n", version ? version : "unknown"); | |
| CcapProvider* provider = ccap_provider_create(); | |
| if (provider) { | |
| printf("Provider created successfully\n"); | |
| ccap_provider_destroy(provider); | |
| return 0; | |
| } | |
| return 1; | |
| } | |
| EOF | |
| # Compile and run with shared library | |
| gcc -I../../include test_shared.cpp -L. -lccap -Wl,-rpath=. -o test_shared | |
| ./test_shared | |
| echo "✓ Shared library linking test passed" | |
| - name: Run Unit Tests | |
| if: matrix.build_type == 'Release' | |
| run: | | |
| # Create symbolic links to make test script work with new build directory structure | |
| mkdir -p build | |
| if [ ! -L "build/${{ matrix.build_type }}" ]; then | |
| ln -sf "${{ matrix.build_type }}-${{ matrix.library_type }}" "build/${{ matrix.build_type }}" | |
| fi | |
| cd scripts | |
| # Set library type specific environment if needed | |
| if [ "${{ matrix.library_type }}" = "shared" ]; then | |
| export LD_LIBRARY_PATH="$PWD/../build/${{ matrix.build_type }}-${{ matrix.library_type }}:$LD_LIBRARY_PATH" | |
| fi | |
| ./run_tests.sh --functional --exit-when-failed | |
| - name: Upload artifacts | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: ccap-linux-gcc-${{ matrix.build_type }}-${{ matrix.library_type }} | |
| path: | | |
| build/${{ matrix.build_type }}-${{ matrix.library_type }}/libccap.* | |
| build/${{ matrix.build_type }}-${{ matrix.library_type }}/0-print_camera | |
| build/${{ matrix.build_type }}-${{ matrix.library_type }}/1-minimal_example | |
| build/${{ matrix.build_type }}-${{ matrix.library_type }}/2-capture_grab | |
| build/${{ matrix.build_type }}-${{ matrix.library_type }}/3-capture_callback | |
| build/${{ matrix.build_type }}-${{ matrix.library_type }}/4-example_with_glfw | |
| build/${{ matrix.build_type }}-${{ matrix.library_type }}/*_results.xml | |
| if-no-files-found: warn | |
| build-ubuntu-clang: | |
| name: "Build (${{ matrix.build_type }}-clang-${{ matrix.library_type }})" | |
| 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] | |
| library_type: [static, shared] | |
| 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: | | |
| if [ "${{ matrix.library_type }}" = "shared" ]; then | |
| SHARED_FLAG="-DCCAP_BUILD_SHARED=ON" | |
| echo "Configuring build ${{ matrix.build_type }} with clang (SHARED LIBRARY with system GLFW)" | |
| else | |
| SHARED_FLAG="" | |
| echo "Configuring build ${{ matrix.build_type }} with clang (STATIC LIBRARY with system GLFW)" | |
| fi | |
| cmake -B build/${{ matrix.build_type }}-${{ matrix.library_type }} \ | |
| -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} \ | |
| -DCCAP_BUILD_EXAMPLES=ON \ | |
| -DCCAP_BUILD_TESTS=ON \ | |
| $SHARED_FLAG | |
| - name: Build | |
| run: cmake --build build/${{ matrix.build_type }}-${{ matrix.library_type }} --config ${{ matrix.build_type }} --parallel $(nproc) | |
| - name: Verify build outputs and library type | |
| working-directory: build/${{ matrix.build_type }}-${{ matrix.library_type }} | |
| run: | | |
| echo "Checking built examples:" | |
| ls -la | grep -E "(glfw|example)" || echo "No examples found" | |
| # Verify library type | |
| if [ "${{ matrix.library_type }}" = "shared" ]; then | |
| if [ -f "libccap.so" ]; then | |
| echo "✓ Shared library libccap.so successfully built" | |
| else | |
| echo "✗ Shared library not found" | |
| exit 1 | |
| fi | |
| else | |
| if [ -f "libccap.a" ]; then | |
| echo "✓ Static library libccap.a successfully built" | |
| else | |
| echo "✗ Static library not found" | |
| exit 1 | |
| fi | |
| fi | |
| echo "✓ Build completed successfully" | |
| - name: Run Unit Tests | |
| if: matrix.build_type == 'Release' | |
| run: | | |
| # Create symbolic links to make test script work with new build directory structure | |
| mkdir -p build | |
| if [ ! -L "build/${{ matrix.build_type }}" ]; then | |
| ln -sf "${{ matrix.build_type }}-${{ matrix.library_type }}" "build/${{ matrix.build_type }}" | |
| fi | |
| cd scripts | |
| # Set library type specific environment if needed | |
| if [ "${{ matrix.library_type }}" = "shared" ]; then | |
| export LD_LIBRARY_PATH="$PWD/../build/${{ matrix.build_type }}-${{ matrix.library_type }}:$LD_LIBRARY_PATH" | |
| fi | |
| ./run_tests.sh --functional --exit-when-failed | |
| - name: Upload artifacts | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: ccap-linux-clang-${{ matrix.build_type }}-${{ matrix.library_type }} | |
| path: | | |
| build/${{ matrix.build_type }}-${{ matrix.library_type }}/libccap.* | |
| build/${{ matrix.build_type }}-${{ matrix.library_type }}/0-print_camera | |
| build/${{ matrix.build_type }}-${{ matrix.library_type }}/1-minimal_example | |
| build/${{ matrix.build_type }}-${{ matrix.library_type }}/2-capture_grab | |
| build/${{ matrix.build_type }}-${{ matrix.library_type }}/3-capture_callback | |
| build/${{ matrix.build_type }}-${{ matrix.library_type }}/4-example_with_glfw | |
| build/${{ matrix.build_type }}-${{ matrix.library_type }}/*_results.xml | |
| if-no-files-found: warn | |
| build-ubuntu-arm64: | |
| name: "Build ARM64 (${{ matrix.build_type }}-gcc-${{ matrix.library_type }})" | |
| runs-on: ubuntu-latest | |
| strategy: | |
| matrix: | |
| build_type: [Debug, Release] | |
| library_type: [static, shared] | |
| 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: | | |
| if [ "${{ matrix.library_type }}" = "shared" ]; then | |
| SHARED_FLAG="-DCCAP_BUILD_SHARED=ON" | |
| echo "Configuring build ${{ matrix.build_type }} for ARM64 (SHARED LIBRARY cross-compilation)" | |
| else | |
| SHARED_FLAG="" | |
| echo "Configuring build ${{ matrix.build_type }} for ARM64 (STATIC LIBRARY cross-compilation)" | |
| fi | |
| cmake -B build/arm64/${{ matrix.build_type }}-${{ matrix.library_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 \ | |
| $SHARED_FLAG | |
| - name: Build ARM64 | |
| run: cmake --build build/arm64/${{ matrix.build_type }}-${{ matrix.library_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 }}-${{ matrix.library_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 }}-${{ matrix.library_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 }}-${{ matrix.library_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 }}-${{ matrix.library_type }}/arm64_results.xml | |
| echo "✓ ARM64 unit tests finished" | |
| - name: Verify build outputs and library type | |
| working-directory: build/arm64/${{ matrix.build_type }}-${{ matrix.library_type }} | |
| run: | | |
| echo "Checking built ARM64 binaries:" | |
| ls -la | grep -E "(ccap|example)" || echo "No examples found" | |
| # Verify library type and architecture | |
| if [ "${{ matrix.library_type }}" = "shared" ]; then | |
| if [ -f "libccap.so" ]; then | |
| echo "✓ ARM64 shared library libccap.so successfully built" | |
| file libccap.so | grep -q "aarch64" && echo "✓ Library is ARM64" || echo "⚠ Library architecture verification failed" | |
| else | |
| echo "✗ ARM64 shared library not found" | |
| exit 1 | |
| fi | |
| else | |
| if [ -f "libccap.a" ]; then | |
| echo "✓ ARM64 static library libccap.a successfully built" | |
| file libccap.a | grep -q "aarch64" && echo "✓ Library is ARM64" || echo "⚠ Library architecture verification failed" | |
| else | |
| echo "✗ ARM64 static library not found" | |
| exit 1 | |
| fi | |
| fi | |
| 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 }}-${{ matrix.library_type }} | |
| path: | | |
| build/arm64/${{ matrix.build_type }}-${{ matrix.library_type }}/libccap.* | |
| build/arm64/${{ matrix.build_type }}-${{ matrix.library_type }}/0-print_camera | |
| build/arm64/${{ matrix.build_type }}-${{ matrix.library_type }}/1-minimal_example | |
| build/arm64/${{ matrix.build_type }}-${{ matrix.library_type }}/2-capture_grab | |
| build/arm64/${{ matrix.build_type }}-${{ matrix.library_type }}/3-capture_callback | |
| build/arm64/${{ matrix.build_type }}-${{ matrix.library_type }}/4-example_with_glfw | |
| build/arm64/${{ matrix.build_type }}-${{ matrix.library_type }}/*_results.xml | |
| if-no-files-found: warn | |
| build-fedora: | |
| name: "Build Fedora (${{ matrix.build_type }}-${{ matrix.library_type }})" | |
| runs-on: ubuntu-latest | |
| container: fedora:latest | |
| strategy: | |
| matrix: | |
| build_type: [Debug, Release] | |
| library_type: [static, shared] | |
| 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: | | |
| if [ "${{ matrix.library_type }}" = "shared" ]; then | |
| SHARED_FLAG="-DCCAP_BUILD_SHARED=ON" | |
| echo "Configuring Fedora build ${{ matrix.build_type }} - SHARED LIBRARY" | |
| else | |
| SHARED_FLAG="" | |
| echo "Configuring Fedora build ${{ matrix.build_type }} - STATIC LIBRARY" | |
| fi | |
| cmake -B build/${{ matrix.build_type }}-${{ matrix.library_type }} \ | |
| -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} \ | |
| -DCCAP_BUILD_EXAMPLES=ON \ | |
| -DCCAP_BUILD_TESTS=ON \ | |
| $SHARED_FLAG | |
| - name: Build | |
| run: cmake --build build/${{ matrix.build_type }}-${{ matrix.library_type }} --config ${{ matrix.build_type }} --parallel $(nproc) | |
| - name: Verify library type | |
| working-directory: build/${{ matrix.build_type }}-${{ matrix.library_type }} | |
| run: | | |
| # Verify library type | |
| if [ "${{ matrix.library_type }}" = "shared" ]; then | |
| if [ -f "libccap.so" ]; then | |
| echo "✓ Fedora shared library libccap.so successfully built" | |
| else | |
| echo "✗ Fedora shared library not found" | |
| exit 1 | |
| fi | |
| else | |
| if [ -f "libccap.a" ]; then | |
| echo "✓ Fedora static library libccap.a successfully built" | |
| else | |
| echo "✗ Fedora static library not found" | |
| exit 1 | |
| fi | |
| fi | |
| - name: Run Unit Tests | |
| if: matrix.build_type == 'Release' | |
| run: | | |
| # Create symbolic links to make test script work with new build directory structure | |
| mkdir -p build | |
| if [ ! -L "build/${{ matrix.build_type }}" ]; then | |
| ln -sf "${{ matrix.build_type }}-${{ matrix.library_type }}" "build/${{ matrix.build_type }}" | |
| fi | |
| cd scripts | |
| # Set library type specific environment if needed | |
| if [ "${{ matrix.library_type }}" = "shared" ]; then | |
| export LD_LIBRARY_PATH="$PWD/../build/${{ matrix.build_type }}-${{ matrix.library_type }}:$LD_LIBRARY_PATH" | |
| fi | |
| ./run_tests.sh --functional --exit-when-failed | |
| - name: Upload artifacts | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: ccap-fedora-${{ matrix.build_type }}-${{ matrix.library_type }} | |
| path: | | |
| build/${{ matrix.build_type }}-${{ matrix.library_type }}/libccap.* | |
| build/${{ matrix.build_type }}-${{ matrix.library_type }}/0-print_camera | |
| build/${{ matrix.build_type }}-${{ matrix.library_type }}/1-minimal_example | |
| build/${{ matrix.build_type }}-${{ matrix.library_type }}/2-capture_grab | |
| build/${{ matrix.build_type }}-${{ matrix.library_type }}/3-capture_callback | |
| build/${{ matrix.build_type }}-${{ matrix.library_type }}/*_results.xml | |
| if-no-files-found: warn |