name: CI on: push: branches: [main, develop] pull_request: permissions: contents: read concurrency: group: ci-${{ github.ref }} cancel-in-progress: true jobs: # --------------------------------------------------------------------------- # Static checks: Rule R2 boundary + formatting. Fast, gates the build matrix. # --------------------------------------------------------------------------- lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Rule R2 — PDFium boundary check run: bash scripts/check_pdfium_boundary.sh # Pinned so CI matches the version the tree was formatted with — clang-format # output drifts between releases, and an unpinned runner version would cause # spurious lint failures. - name: Install clang-format (pinned) run: pipx install clang-format==22.1.5 - name: clang-format run: | clang-format --version find engine \( -name '*.cpp' -o -name '*.cc' -o -name '*.h' -o -name '*.hpp' \) \ -print0 | xargs -0 clang-format --dry-run --Werror # --------------------------------------------------------------------------- # Build + test on all three platforms (Gate G0: compiles clean everywhere). # --------------------------------------------------------------------------- build: needs: lint strategy: fail-fast: false matrix: include: - os: ubuntu-latest preset: linux-debug - os: macos-latest preset: macos-debug - os: windows-latest preset: windows-debug runs-on: ${{ matrix.os }} env: VCPKG_DEFAULT_BINARY_CACHE: ${{ github.workspace }}/.vcpkg-cache steps: - uses: actions/checkout@v4 - name: Install Ninja uses: seanmiddleditch/gha-setup-ninja@v5 - name: Set up MSVC environment if: runner.os == 'Windows' uses: ilammy/msvc-dev-cmd@v1 # GitHub-hosted runners ship vcpkg preinstalled. VCPKG_INSTALLATION_ROOT is # a runner OS env var, so it must be promoted to GITHUB_ENV here — it is # NOT visible via the ${{ env.* }} context in a job-level env: block. - name: Locate vcpkg shell: bash run: | echo "VCPKG_ROOT=$VCPKG_INSTALLATION_ROOT" >> "$GITHUB_ENV" # The runner's preinstalled vcpkg may predate our pinned builtin-baseline; # fetch so manifest resolution can find that commit's versions tree. git -C "$VCPKG_INSTALLATION_ROOT" fetch --quiet origin || true - name: Create vcpkg binary cache dir shell: bash run: mkdir -p "$VCPKG_DEFAULT_BINARY_CACHE" - name: Cache vcpkg artifacts uses: actions/cache@v4 with: path: ${{ env.VCPKG_DEFAULT_BINARY_CACHE }} key: vcpkg-${{ matrix.os }}-${{ hashFiles('vcpkg.json') }} restore-keys: vcpkg-${{ matrix.os }}- # vcpkg.json ships without a builtin-baseline; the local bootstrap script # normally pins it. In CI we pin it on the fly (idempotent) so the # CMakeLists dependency-pinning guard is satisfied. - name: Pin vcpkg dependency baseline shell: bash run: | if ! grep -q '"builtin-baseline"' vcpkg.json; then "$VCPKG_ROOT/vcpkg" x-update-baseline --add-initial-baseline fi - name: Configure run: cmake --preset ${{ matrix.preset }} - name: Build run: cmake --build --preset ${{ matrix.preset }} - name: Test run: ctest --preset ${{ matrix.preset }}