diff --git a/.cache/clangd/index/auth_engine.cpp.FF9D5B4DC4D6EC1A.idx b/.cache/clangd/index/auth_engine.cpp.FF9D5B4DC4D6EC1A.idx deleted file mode 100644 index 115c4b58..00000000 Binary files a/.cache/clangd/index/auth_engine.cpp.FF9D5B4DC4D6EC1A.idx and /dev/null differ diff --git a/.cache/clangd/index/auth_engine.hpp.59ACFB194846F2D4.idx b/.cache/clangd/index/auth_engine.hpp.59ACFB194846F2D4.idx deleted file mode 100644 index c150257d..00000000 Binary files a/.cache/clangd/index/auth_engine.hpp.59ACFB194846F2D4.idx and /dev/null differ diff --git a/.cache/clangd/index/camera.cpp.28876CC988FDA75F.idx b/.cache/clangd/index/camera.cpp.28876CC988FDA75F.idx deleted file mode 100644 index 03cd60b8..00000000 Binary files a/.cache/clangd/index/camera.cpp.28876CC988FDA75F.idx and /dev/null differ diff --git a/.cache/clangd/index/camera.hpp.27940B1C16C74116.idx b/.cache/clangd/index/camera.hpp.27940B1C16C74116.idx deleted file mode 100644 index 3e1595cf..00000000 Binary files a/.cache/clangd/index/camera.hpp.27940B1C16C74116.idx and /dev/null differ diff --git a/.cache/clangd/index/check_opencl.cpp.0C650A543175C7BB.idx b/.cache/clangd/index/check_opencl.cpp.0C650A543175C7BB.idx deleted file mode 100644 index 856e30cb..00000000 Binary files a/.cache/clangd/index/check_opencl.cpp.0C650A543175C7BB.idx and /dev/null differ diff --git a/.cache/clangd/index/constants.hpp.B1DCD61D6BD829EB.idx b/.cache/clangd/index/constants.hpp.B1DCD61D6BD829EB.idx deleted file mode 100644 index 0576bb4f..00000000 Binary files a/.cache/clangd/index/constants.hpp.B1DCD61D6BD829EB.idx and /dev/null differ diff --git a/.cache/clangd/index/json.hpp.A8DE86FD89E6C623.idx b/.cache/clangd/index/json.hpp.A8DE86FD89E6C623.idx deleted file mode 100644 index 7f31af30..00000000 Binary files a/.cache/clangd/index/json.hpp.A8DE86FD89E6C623.idx and /dev/null differ diff --git a/.cache/clangd/index/logger.hpp.536D7E29C90C8035.idx b/.cache/clangd/index/logger.hpp.536D7E29C90C8035.idx deleted file mode 100644 index a2300577..00000000 Binary files a/.cache/clangd/index/logger.hpp.536D7E29C90C8035.idx and /dev/null differ diff --git a/.cache/clangd/index/main.cpp.275B3AF5620C1D72.idx b/.cache/clangd/index/main.cpp.275B3AF5620C1D72.idx deleted file mode 100644 index bd826c14..00000000 Binary files a/.cache/clangd/index/main.cpp.275B3AF5620C1D72.idx and /dev/null differ diff --git a/.cache/clangd/index/main.cpp.46AC95A6BB078CE7.idx b/.cache/clangd/index/main.cpp.46AC95A6BB078CE7.idx deleted file mode 100644 index f2d37eab..00000000 Binary files a/.cache/clangd/index/main.cpp.46AC95A6BB078CE7.idx and /dev/null differ diff --git a/.cache/clangd/index/main.cpp.7B75EA6F27DB89B9.idx b/.cache/clangd/index/main.cpp.7B75EA6F27DB89B9.idx deleted file mode 100644 index 6de3e433..00000000 Binary files a/.cache/clangd/index/main.cpp.7B75EA6F27DB89B9.idx and /dev/null differ diff --git a/.cache/clangd/index/pam_linuxcampam.cpp.F05200C51EF2D0C1.idx b/.cache/clangd/index/pam_linuxcampam.cpp.F05200C51EF2D0C1.idx deleted file mode 100644 index af5bff15..00000000 Binary files a/.cache/clangd/index/pam_linuxcampam.cpp.F05200C51EF2D0C1.idx and /dev/null differ diff --git a/.cache/clangd/index/test_config.cpp.E0D6581D32F6F152.idx b/.cache/clangd/index/test_config.cpp.E0D6581D32F6F152.idx deleted file mode 100644 index 8871b0a1..00000000 Binary files a/.cache/clangd/index/test_config.cpp.E0D6581D32F6F152.idx and /dev/null differ diff --git a/.cache/clangd/index/test_embeddings.cpp.74E39A8804D14BC3.idx b/.cache/clangd/index/test_embeddings.cpp.74E39A8804D14BC3.idx deleted file mode 100644 index b28b6cd0..00000000 Binary files a/.cache/clangd/index/test_embeddings.cpp.74E39A8804D14BC3.idx and /dev/null differ diff --git a/.cache/clangd/index/test_model_version.cpp.03DEF5DB859EC74E.idx b/.cache/clangd/index/test_model_version.cpp.03DEF5DB859EC74E.idx deleted file mode 100644 index 1dc32b8c..00000000 Binary files a/.cache/clangd/index/test_model_version.cpp.03DEF5DB859EC74E.idx and /dev/null differ diff --git a/.cache/clangd/index/test_security.cpp.BCAAF14D47250A44.idx b/.cache/clangd/index/test_security.cpp.BCAAF14D47250A44.idx deleted file mode 100644 index be60ff7c..00000000 Binary files a/.cache/clangd/index/test_security.cpp.BCAAF14D47250A44.idx and /dev/null differ diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 892f9bbf..9c0fef34 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,6 +3,7 @@ name: CI on: push: branches: [master] + tags: ["v*.*.*"] pull_request: branches: [master] @@ -19,7 +20,10 @@ jobs: sudo apt-get install -y \ build-essential cmake libopencv-dev libpam0g-dev \ libjsoncpp-dev nlohmann-json3-dev v4l-utils \ - libgtest-dev + libgtest-dev devscripts debhelper dh-cmake + + - name: Download models + run: ./scripts/download_models.sh - name: Configure run: cmake -B build -DCMAKE_BUILD_TYPE=Release @@ -30,6 +34,17 @@ jobs: - name: Test run: ctest --test-dir build --output-on-failure + - name: Build package + run: | + dpkg-buildpackage -b -uc -us + mv ../linuxcampam_*.deb . + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: linuxcampam-deb + path: linuxcampam_*.deb + build-clang: name: Build (Clang) runs-on: ubuntu-24.04 @@ -49,8 +64,8 @@ jobs: - name: Build run: cmake --build build -j$(nproc) - build-arm64: - name: Build (arm64) + build-aarch64: + name: Build (aarch64) runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 @@ -61,11 +76,26 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - - name: Build arm64 - run: docker buildx build --platform linux/arm64 -f docker/Dockerfile.arm64 --load -t linuxcampam:arm64 . + - name: Download models + run: ./scripts/download_models.sh + + - name: Build aarch64 + run: docker buildx build --platform linux/aarch64 -f docker/Dockerfile.aarch64 --load -t linuxcampam:aarch64 . + + - name: Extract artifacts + run: | + docker create --name temp_container linuxcampam:aarch64 + docker cp temp_container:/ - | tar -tf - | grep '\.deb$' | head -1 | xargs -I{} docker cp temp_container:/{} ./linuxcampam_aarch64.deb + docker rm temp_container - name: Verify - run: docker run --rm --platform linux/arm64 linuxcampam:arm64 ./linuxcampam help + run: docker run --rm --platform linux/aarch64 --entrypoint /usr/bin/linuxcampam linuxcampam:aarch64 help + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: linuxcampam-aarch64-deb + path: linuxcampam_*.deb build-i386: name: Build (i386) @@ -79,11 +109,26 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 + - name: Download models + run: ./scripts/download_models.sh + - name: Build i386 run: docker buildx build --platform linux/386 -f docker/Dockerfile.i386 --load -t linuxcampam:i386 . + - name: Extract artifacts + run: | + docker create --name temp_container linuxcampam:i386 + docker cp temp_container:/ - | tar -tf - | grep '\.deb$' | head -1 | xargs -I{} docker cp temp_container:/{} ./linuxcampam_i386.deb + docker rm temp_container + - name: Verify - run: docker run --rm --platform linux/386 linuxcampam:i386 ./linuxcampam help + run: docker run --rm --platform linux/386 --entrypoint /usr/bin/linuxcampam linuxcampam:i386 help + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: linuxcampam-i386-deb + path: linuxcampam_*.deb build-riscv64: name: Build (riscv64) @@ -97,8 +142,23 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 + - name: Download models + run: ./scripts/download_models.sh + - name: Build riscv64 run: docker buildx build --platform linux/riscv64 -f docker/Dockerfile.riscv64 --load -t linuxcampam:riscv64 . + - name: Extract artifacts + run: | + docker create --name temp_container linuxcampam:riscv64 + docker cp temp_container:/ - | tar -tf - | grep '\.deb$' | head -1 | xargs -I{} docker cp temp_container:/{} ./linuxcampam_riscv64.deb + docker rm temp_container + - name: Verify - run: docker run --rm --platform linux/riscv64 linuxcampam:riscv64 ./linuxcampam help + run: docker run --rm --platform linux/riscv64 --entrypoint /usr/bin/linuxcampam linuxcampam:riscv64 help + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: linuxcampam-riscv64-deb + path: linuxcampam_*.deb diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c2fafafe..efb42ea4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,56 +1,31 @@ name: Release on: - push: - tags: - - "v*.*.*" + workflow_run: + workflows: ["CI"] + types: [completed] workflow_dispatch: jobs: - build-deb: - name: Build Debian Package - runs-on: ubuntu-24.04 - steps: - - uses: actions/checkout@v4 - - - name: Install dependencies - run: | - sudo apt-get update - sudo apt-get install -y \ - build-essential cmake libopencv-dev libpam0g-dev \ - libjsoncpp-dev nlohmann-json3-dev v4l-utils \ - devscripts debhelper dh-cmake - - - name: Download models - run: ./scripts/download_models.sh - - - name: Build package - run: dpkg-buildpackage -b -uc -us - - - name: Move artifacts - run: mv ../linuxcampam_*.deb . - - - name: Upload artifact - uses: actions/upload-artifact@v4 - with: - name: deb-package - path: linuxcampam_*.deb - create-release: name: Create GitHub Release runs-on: ubuntu-24.04 - needs: build-deb + if: ${{ github.event.workflow_run.conclusion == 'success' && startsWith(github.event.workflow_run.head_branch, 'v') }} permissions: contents: write steps: - - name: Download artifact + - name: Download artifacts uses: actions/download-artifact@v4 with: - name: deb-package + run-id: ${{ github.event.workflow_run.id }} + github-token: ${{ secrets.GITHUB_TOKEN }} + pattern: linuxcampam-*-deb + merge-multiple: true - name: Create Release uses: softprops/action-gh-release@v2 with: + tag_name: ${{ github.event.workflow_run.head_branch }} files: linuxcampam_*.deb draft: false generate_release_notes: true diff --git a/CHANGELOG.md b/CHANGELOG.md index a9412b22..37e82e24 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -91,7 +91,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Smart OpenCL backend detection (uses Rusticl on AMD, prevents Mesa/Clover crashes) - YuNet face detection and SFace face recognition (ONNX models) - Debian packaging support (CPack) -- Cross-compilation support for ARM64 and RISC-V +- Cross-compilation support for AARCH64 and RISC-V - Comprehensive security assessment documentation ### Security in 0.9.0 diff --git a/CMakeLists.txt b/CMakeLists.txt index fea6631b..62c211c8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.14) -project(LinuxCamPAM VERSION 0.9.3 LANGUAGES C CXX) +project(LinuxCamPAM VERSION 0.9.3.1 LANGUAGES C CXX) add_compile_definitions(LINUXCAMPAM_VERSION="${PROJECT_VERSION}") diff --git a/README.md b/README.md index 5c1ce094..9dc7fbe0 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ With the decision to open source this project, I have dedicated significant effo | :--- | :--- | :--- | :--- | | **x86_64** | GCC 11/12/13 | ✅ Verified | Target: Ubuntu 22.04+ / Debian 12+ | | **x86_64** | Clang 16/17/18 | ✅ Verified | Target: Ubuntu 22.04+ / Debian 12+ | -| **ARM64** | GCC (Cross) | ✅ Verified | via Docker/QEMU | +| **AARCH64** | GCC (Cross) | ✅ Verified | via Docker/QEMU | | **RISC-V** | GCC (Cross) | ✅ Verified | via Docker/QEMU | ### Option A: Direct System Install (Quickest) diff --git a/debian/changelog b/debian/changelog index b7993b6c..9239ffe0 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,11 @@ +linuxcampam (0.9.3.1-1) unstable; urgency=medium + + * Multi-arch support (AARCH64, i386, RISC-V). + * Update Dockerfiles for packaging. + * Secure release workflow. + + -- Vlad Orlinski Sat, 03 Jan 2026 02:20:00 +0100 + linuxcampam (0.9.2-1) unstable; urgency=medium * Portable camera detection via V4L2 enumeration (no hardcoded paths). diff --git a/docker/Dockerfile.arm64 b/docker/Dockerfile.aarch64 similarity index 63% rename from docker/Dockerfile.arm64 rename to docker/Dockerfile.aarch64 index 914421a8..d309c4d2 100644 --- a/docker/Dockerfile.arm64 +++ b/docker/Dockerfile.aarch64 @@ -13,6 +13,9 @@ RUN apt-get update && apt-get install -y \ nlohmann-json3-dev \ v4l-utils \ git \ + devscripts \ + debhelper \ + dh-cmake \ && rm -rf /var/lib/apt/lists/* # Set Working Directory @@ -24,9 +27,11 @@ COPY . /app # Ensure Clean Build RUN rm -rf build && mkdir build -# Build -WORKDIR /app/build -RUN cmake .. && make VERBOSE=1 -j1 +# Build and Package +# dpkg-buildpackage with cmake buildsystem will handle the build process +# We skip signing (-uc -us) +RUN dpkg-buildpackage -b -uc -us && \ + dpkg -i ../*.deb || apt-get install -f -y # Verification Command (to run manually) -CMD ["./linuxcampam", "help"] +CMD ["/usr/bin/linuxcampam", "help"] diff --git a/docker/Dockerfile.i386 b/docker/Dockerfile.i386 index e67fef43..276e27bd 100644 --- a/docker/Dockerfile.i386 +++ b/docker/Dockerfile.i386 @@ -13,6 +13,9 @@ RUN apt-get update && apt-get install -y \ nlohmann-json3-dev \ v4l-utils \ git \ + devscripts \ + debhelper \ + dh-cmake \ && rm -rf /var/lib/apt/lists/* # Set Working Directory @@ -24,9 +27,9 @@ COPY . /app # Ensure Clean Build RUN rm -rf build && mkdir build -# Build -WORKDIR /app/build -RUN cmake .. && make VERBOSE=1 -j$(nproc) +# Build and Package +RUN dpkg-buildpackage -b -uc -us && \ + dpkg -i ../*.deb || apt-get install -f -y # Verification -CMD ["./linuxcampam", "help"] +CMD ["/usr/bin/linuxcampam", "help"] diff --git a/docker/Dockerfile.riscv64 b/docker/Dockerfile.riscv64 index 1bb65a5f..80fb5471 100644 --- a/docker/Dockerfile.riscv64 +++ b/docker/Dockerfile.riscv64 @@ -13,6 +13,9 @@ RUN apt-get update && apt-get install -y \ nlohmann-json3-dev \ v4l-utils \ git \ + devscripts \ + debhelper \ + dh-cmake \ && rm -rf /var/lib/apt/lists/* # Set Working Directory @@ -24,10 +27,9 @@ COPY . /app # Ensure Clean Build RUN rm -rf build && mkdir build -# Build -WORKDIR /app/build -# Use single job and verbose mode to help debug potential slow emulation issues -RUN cmake .. && make VERBOSE=1 -j1 +# Build and Package +RUN dpkg-buildpackage -b -uc -us && \ + dpkg -i ../*.deb || apt-get install -f -y # Verification Command -CMD ["./linuxcampam", "help"] +CMD ["/usr/bin/linuxcampam", "help"]