| name: CI | |
| on: | |
| - push | |
| - pull_request | |
| defaults: | |
| run: | |
| shell: bash | |
| permissions: {} | |
| env: | |
| # Disabling incr comp reduces cache size and incr comp doesn't save as much | |
| # on CI anyway. | |
| CARGO_BUILD_INCREMENTAL: false | |
| # Rust's CI denies warnings. Deny them here too to ensure subtree syncs don't | |
| # fail because of warnings. | |
| RUSTFLAGS: "-Dwarnings" | |
| jobs: | |
| todo_check: | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 10 | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - name: Check todo | |
| run: ./y.sh check-todo | |
| rustfmt: | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 10 | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - name: Avoid installing rustc-dev | |
| run: | | |
| sed -i 's/components.*/components = ["rustfmt"]/' rust-toolchain.toml | |
| rustfmt -v | |
| - name: Rustfmt | |
| run: | | |
| cargo fmt --check | |
| rustfmt --check --edition 2024 build_system/main.rs | |
| rustfmt --check --edition 2024 example/* | |
| rustfmt --check --edition 2024 scripts/*.rs | |
| test: | |
| runs-on: ${{ matrix.os }} | |
| timeout-minutes: 60 | |
| env: | |
| CG_CLIF_EXPENSIVE_CHECKS: 1 | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - os: ubuntu-latest | |
| env: | |
| TARGET_TRIPLE: x86_64-unknown-linux-gnu | |
| - os: ubuntu-24.04-arm | |
| env: | |
| TARGET_TRIPLE: aarch64-unknown-linux-gnu | |
| - os: macos-15-intel | |
| env: | |
| TARGET_TRIPLE: x86_64-apple-darwin | |
| - os: macos-latest | |
| env: | |
| TARGET_TRIPLE: aarch64-apple-darwin | |
| - os: ubuntu-latest | |
| env: | |
| TARGET_TRIPLE: s390x-unknown-linux-gnu | |
| apt_deps: gcc-s390x-linux-gnu qemu-user | |
| - os: ubuntu-latest | |
| env: | |
| TARGET_TRIPLE: riscv64gc-unknown-linux-gnu | |
| apt_deps: gcc-riscv64-linux-gnu qemu-user | |
| - os: windows-latest | |
| env: | |
| TARGET_TRIPLE: x86_64-pc-windows-msvc | |
| - os: windows-latest | |
| env: | |
| TARGET_TRIPLE: x86_64-pc-windows-gnu | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - name: CPU features | |
| if: matrix.os == 'ubuntu-latest' | |
| run: cat /proc/cpuinfo | |
| - name: Cache cargo target dir | |
| uses: actions/cache@v5 | |
| with: | |
| path: build/cg_clif | |
| key: ${{ runner.os }}-${{ matrix.env.TARGET_TRIPLE }}-cargo-build-target-${{ hashFiles('rust-toolchain.toml', '**/Cargo.lock') }} | |
| - name: Set MinGW as the default toolchain | |
| if: matrix.os == 'windows-latest' && matrix.env.TARGET_TRIPLE == 'x86_64-pc-windows-gnu' | |
| run: rustup set default-host x86_64-pc-windows-gnu | |
| - name: Install toolchain and emulator | |
| if: matrix.apt_deps != null | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y ${{ matrix.apt_deps }} | |
| - name: Prepare dependencies | |
| run: ./y.sh prepare | |
| - name: Build | |
| run: ./y.sh build --sysroot none | |
| - name: Test | |
| env: | |
| TARGET_TRIPLE: ${{ matrix.env.TARGET_TRIPLE }} | |
| run: ./y.sh test | |
| - name: Install LLVM standard library | |
| run: rustup target add ${{ matrix.env.TARGET_TRIPLE }} | |
| # This is roughly config rust-lang/rust uses for testing | |
| - name: Test with LLVM sysroot | |
| env: | |
| TARGET_TRIPLE: ${{ matrix.env.TARGET_TRIPLE }} | |
| run: ./y.sh test --sysroot llvm --no-unstable-features | |
| # This job doesn't use cg_clif in any way. It checks that all cg_clif tests work with cg_llvm too. | |
| test_llvm: | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 60 | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - name: CPU features | |
| run: cat /proc/cpuinfo | |
| - name: Prepare dependencies | |
| run: ./y.sh prepare | |
| - name: Disable JIT tests | |
| run: | | |
| sed -i 's/jit./#jit./' config.txt | |
| - name: Test | |
| env: | |
| TARGET_TRIPLE: x86_64-unknown-linux-gnu | |
| run: ./y.sh test --use-backend llvm | |
| bench: | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 60 | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - name: CPU features | |
| run: cat /proc/cpuinfo | |
| - name: Cache cargo target dir | |
| uses: actions/cache@v5 | |
| with: | |
| path: build/cg_clif | |
| key: ${{ runner.os }}-x86_64-unknown-linux-gnu-cargo-build-target-${{ hashFiles('rust-toolchain.toml', '**/Cargo.lock') }} | |
| - name: Install hyperfine | |
| run: | | |
| sudo apt update | |
| sudo apt install -y hyperfine | |
| - name: Build | |
| run: ./y.sh build --sysroot none | |
| - name: Benchmark | |
| run: ./y.sh bench | |
| dist: | |
| runs-on: ${{ matrix.os }} | |
| timeout-minutes: 60 | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| # Intentionally using an older ubuntu version to lower the glibc requirements of the distributed cg_clif | |
| - os: ubuntu-22.04 | |
| env: | |
| TARGET_TRIPLE: x86_64-unknown-linux-gnu | |
| - os: ubuntu-24.04-arm | |
| env: | |
| TARGET_TRIPLE: aarch64-unknown-linux-gnu | |
| - os: macos-15-intel | |
| env: | |
| TARGET_TRIPLE: x86_64-apple-darwin | |
| - os: macos-latest | |
| env: | |
| TARGET_TRIPLE: aarch64-apple-darwin | |
| - os: windows-latest | |
| env: | |
| TARGET_TRIPLE: x86_64-pc-windows-msvc | |
| - os: windows-latest | |
| env: | |
| TARGET_TRIPLE: x86_64-pc-windows-gnu | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - name: Cache cargo target dir | |
| uses: actions/cache@v5 | |
| with: | |
| path: build/cg_clif | |
| key: ${{ runner.os }}-${{ matrix.env.TARGET_TRIPLE }}-dist-cargo-build-target-${{ hashFiles('rust-toolchain.toml', '**/Cargo.lock') }} | |
| - name: Set MinGW as the default toolchain | |
| if: matrix.os == 'windows-latest' && matrix.env.TARGET_TRIPLE == 'x86_64-pc-windows-gnu' | |
| run: rustup set default-host x86_64-pc-windows-gnu | |
| - name: Build backend | |
| run: ./y.sh build --sysroot none | |
| - name: Build sysroot | |
| run: ./y.sh build | |
| - name: Package prebuilt cg_clif | |
| run: tar cvfJ cg_clif.tar.xz dist | |
| - name: Upload prebuilt cg_clif | |
| uses: actions/upload-artifact@v6 | |
| with: | |
| name: cg_clif-${{ matrix.env.TARGET_TRIPLE }} | |
| path: cg_clif.tar.xz | |
| release: | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 10 | |
| if: ${{ github.ref == 'refs/heads/main' }} | |
| needs: [todo_check, rustfmt, test, bench, dist] | |
| permissions: | |
| contents: write # for creating the dev tag and release | |
| concurrency: | |
| group: release-dev | |
| cancel-in-progress: true | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - name: Download all built artifacts | |
| uses: actions/download-artifact@v4 | |
| with: | |
| path: artifacts/ | |
| - run: | | |
| ls -R artifacts/ | |
| mkdir release/ | |
| pushd artifacts/ | |
| for dir in *; do | |
| mv $dir/cg_clif.tar.xz ../release/$dir.tar.xz | |
| rmdir $dir/ # verify $dir is empty | |
| done | |
| popd | |
| rmdir artifacts/ # verify all artifacts are represented in release/ | |
| ls -R release/ | |
| - name: Publish release | |
| env: | |
| GH_TOKEN: ${{ github.token }} | |
| run: | | |
| gh release delete --cleanup-tag -y dev || true | |
| gh release create --target $GITHUB_SHA --prerelease dev release/* |