dcr 0.8.4

DCR is a utility for managing C/C++ projects in a Cargo-like style.
name: CI

on:
  push:
    branches:
      - master
      - main
      - dev
  pull_request:

env:
  CARGO_TERM_COLOR: always
  RUSTFLAGS: -Dwarnings
  CARGO_INCREMENTAL: "0"
  SCCACHE_GHA_ENABLED: "true"

jobs:
  checks:
    name: fmt / clippy / check
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Setup Rust
        uses: dtolnay/rust-toolchain@stable
        with:
          components: rustfmt, clippy

      - name: sccache
        uses: mozilla-actions/sccache-action@v0.0.9

      - uses: Swatinem/rust-cache@v2
        with:
          shared-key: dcr-ci
          cache-all-crates: true

      - name: Format
        run: cargo fmt --all --check

      - name: Clippy (default features)
        run: cargo clippy --all-targets -- -D warnings

      - name: Clippy (all features)
        run: cargo clippy --all-targets --all-features -- -D warnings

      - name: Check (all features)
        run: cargo check --all-targets --all-features

  test:
    name: tests (${{ matrix.os }})
    needs: checks
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v4

      - name: Setup Rust
        uses: dtolnay/rust-toolchain@stable

      - name: sccache
        uses: mozilla-actions/sccache-action@v0.0.9

      - uses: Swatinem/rust-cache@v2
        with:
          shared-key: dcr-ci
          cache-all-crates: true
          cache-on-failure: true

      - name: Cache apt packages
        if: runner.os == 'Linux'
        uses: actions/cache@v4
        with:
          path: /var/cache/apt/archives
          key: apt-${{ runner.os }}-${{ hashFiles('.github/workflows/ci.yml') }}
          restore-keys: apt-${{ runner.os }}-

      - name: Install Linux tools
        if: runner.os == 'Linux'
        run: |
          sudo apt-get update
          sudo apt-get install -y \
            build-essential \
            clang \
            nasm \
            clang-format \
            clang-tidy \
            git \
            llvm

      - name: Install macOS tools
        if: runner.os == 'macOS'
        run: |
          brew install nasm llvm || true
          echo "$(brew --prefix llvm)/bin" >> "$GITHUB_PATH"

      - name: Install Windows tools
        if: runner.os == 'Windows'
        shell: pwsh
        run: |
          choco install nasm llvm -y
          echo "C:\Program Files\NASM" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
          if (Test-Path "C:\Program Files\LLVM\bin") {
            echo "C:\Program Files\LLVM\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
          }

      - name: Unit tests (binary crate)
        run: cargo test --bins -- --nocapture

      - name: Integration tests (default features)
        run: cargo test --tests -- --nocapture

      - name: Integration tests (archive feature)
        if: runner.os != 'Windows'
        run: cargo test --tests --features archive -- --nocapture

      - name: sccache stats
        if: always()
        run: sccache --show-stats || true

  test-archive-linux:
    name: archive feature smoke
    needs: checks
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Setup Rust
        uses: dtolnay/rust-toolchain@stable

      - name: sccache
        uses: mozilla-actions/sccache-action@v0.0.9

      - uses: Swatinem/rust-cache@v2
        with:
          shared-key: dcr-ci
          cache-all-crates: true

      - name: Install tools
        run: |
          sudo apt-get update
          sudo apt-get install -y build-essential clang nasm llvm

      - name: Build with archive
        run: cargo build --features archive

      - name: Flat-bin + unit suite with archive
        run: cargo test --features archive --test cli_build --test cli_workspace --test cli_errors -- --nocapture

      - name: sccache stats
        if: always()
        run: sccache --show-stats || true