mathic 0.2.0

A compiler with builtin support of symbolic operations, built with LLVM/MLIR
name: CI

on:
    push:
        branches: [main]
    pull_request:
    merge_group:
        types: [checks_requested]

permissions:
    contents: read

concurrency:
    group: ${{ github.workflow }}-${{ github.ref }}
    cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}


jobs:
    test:
        name: Test Suite
        runs-on: ubuntu-24.04
        env:
          LLVM_SYS_211_PREFIX: "/usr/lib/llvm-21"
          MLIR_SYS_210_PREFIX: "/usr/lib/llvm-21"
          TABLEGEN_210_PREFIX: "/usr/lib/llvm-21"
        steps:
            - uses: actions/checkout@v6

            - name: Install LLVM Dependencies
              uses: ./.github/actions/install-llvm-deps

            - name: Install Rust
              uses: dtolnay/rust-toolchain@1.94.0

            - name: Rust Cache
              uses: Swatinem/rust-cache@v2

            - name: Install testing tools
              uses: taiki-e/install-action@v2
              with:
                  tool: cargo-nextest

            - name: Run tests
              run: make test

    test-macos:
        name: Test Suite (macOS)
        runs-on: macos-14
        env:
          LIBRARY_PATH: /opt/homebrew/lib
        steps:
            - uses: actions/checkout@v6

            - name: Install LLVM Dependencies
              run: brew install llvm@21

            - name: Set LLVM environment
              run: |
                  echo "LLVM_SYS_211_PREFIX=$(brew --prefix llvm@21)" >> $GITHUB_ENV
                  echo "MLIR_SYS_210_PREFIX=$(brew --prefix llvm@21)" >> $GITHUB_ENV
                  echo "TABLEGEN_210_PREFIX=$(brew --prefix llvm@21)" >> $GITHUB_ENV

            - name: Install Rust
              uses: dtolnay/rust-toolchain@1.94.0

            - name: Rust Cache
              uses: Swatinem/rust-cache@v2

            - name: Install testing tools
              uses: taiki-e/install-action@v2
              with:
                  tool: cargo-nextest

            - uses: Homebrew/actions/setup-homebrew@master
            - name: Run tests
              run: make test

    clippy:
        name: Linting check
        runs-on: ubuntu-24.04
        env:
          LLVM_SYS_211_PREFIX: "/usr/lib/llvm-21"
          MLIR_SYS_210_PREFIX: "/usr/lib/llvm-21"
          TABLEGEN_210_PREFIX: "/usr/lib/llvm-21"
        steps:
            - uses: actions/checkout@v6

            - name: Install LLVM Dependencies
              uses: ./.github/actions/install-llvm-deps

            - name: Install Rust
              uses: dtolnay/rust-toolchain@1.94.0
              with:
                  components: rustfmt, clippy

            - name: Rust Cache
              uses: Swatinem/rust-cache@v2

            - name: Run make check
              run: make check

    format:
        name: Check Formatting
        runs-on: ubuntu-24.04
        steps:
            - uses: actions/checkout@v6

            - name: Install Rust
              uses: dtolnay/rust-toolchain@1.94.0
              with:
                  components: rustfmt

            - name: Check formatting
              run: cargo fmt --all -- --check

    unused-deps:
        name: Check Unused Dependencies
        runs-on: ubuntu-24.04
        steps:
            - uses: actions/checkout@v6

            - name: Install Rust
              uses: dtolnay/rust-toolchain@1.94.0

            - name: Check for unused dependencies
              uses: bnjbvr/cargo-machete@main

    coverage:
        name: Coverage
        runs-on: ubuntu-24.04
        env:
          LLVM_SYS_211_PREFIX: "/usr/lib/llvm-21"
          MLIR_SYS_210_PREFIX: "/usr/lib/llvm-21"
          TABLEGEN_210_PREFIX: "/usr/lib/llvm-21"
        steps:
            - uses: actions/checkout@v6

            - name: Install LLVM Dependencies
              uses: ./.github/actions/install-llvm-deps

            - name: Install Rust
              uses: dtolnay/rust-toolchain@1.94.0

            - name: Rust Cache
              uses: Swatinem/rust-cache@v2

            - name: Install testing tools
              uses: taiki-e/install-action@v2
              with:
                  tool: cargo-nextest,cargo-llvm-cov

            - name: Generate coverage report
              run: cargo llvm-cov nextest --workspace --verbose --lcov --output-path lcov.info

            - name: Upload coverage to Codecov
              uses: codecov/codecov-action@v4
              with:
                  token: ${{ secrets.CODECOV_TOKEN }}
                  files: lcov.info
                  fail_ci_if_error: false
                  verbose: true