on: [push, pull_request] name: Rust env: RUSTFLAGS: -D warnings RUSTDOCFLAGS: -D warnings NIGHTLY_VERSION: nightly-2025-09-16 jobs: fmt-crank-check-test: name: Format + check runs-on: ubuntu-22.04 timeout-minutes: 60 steps: - uses: actions/checkout@v4 with: lfs: true - uses: dtolnay/rust-toolchain@stable with: toolchain: 1.88.0 - name: Install packages (Linux) if: runner.os == 'Linux' uses: awalsh128/cache-apt-pkgs-action@v1.4.3 with: packages: libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev libxkbcommon-dev libssl-dev libgtk-3-dev # libgtk-3-dev is used by rfd version: 1.0 execute_install_scripts: true - name: Set up cargo cache uses: Swatinem/rust-cache@v2 - name: Rustfmt run: cargo fmt --all -- --check - name: Lint vertical spacing run: ./scripts/lint.py - run: cargo clippy --locked --all-features --all-targets - run: cargo clippy --locked --all-features -p egui_extras - run: cargo clippy --locked --all-targets - run: cargo clippy --locked --no-default-features --lib --all-targets - run: cargo clippy --locked --no-default-features --features x11 --lib -p eframe - run: cargo clippy --locked --no-default-features --lib -p egui_extras - run: cargo clippy --locked --no-default-features --lib -p epaint # Regression test for https://github.com/emilk/egui/issues/4771 - run: cargo clippy -p test_egui_extras_compilation - run: cargo doc --lib --no-deps --all-features - run: cargo doc --document-private-items --no-deps --all-features - name: clippy release run: cargo clippy --all-targets --all-features --release -- -D warnings # --------------------------------------------------------------------------- check_wasm: name: Check wasm32 + wasm-bindgen runs-on: ubuntu-22.04 timeout-minutes: 60 steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable with: toolchain: 1.88.0 targets: wasm32-unknown-unknown - run: sudo apt-get update && sudo apt-get install libgtk-3-dev libatk1.0-dev - name: Set up cargo cache uses: Swatinem/rust-cache@v2 - name: clippy wasm32 egui_demo_app run: cargo clippy -p egui_demo_app --lib --target wasm32-unknown-unknown - name: clippy wasm32 egui_demo_app --all-features run: cargo clippy -p egui_demo_app --lib --target wasm32-unknown-unknown --all-features - name: clippy wasm32 eframe run: cargo clippy -p eframe --lib --no-default-features --features glow,persistence --target wasm32-unknown-unknown - name: wasm-bindgen uses: jetli/wasm-bindgen-action@v0.1.0 with: version: "0.2.100" # Keep wasm-bindgen version in sync in: setup_web.sh, Cargo.toml, Cargo.lock, rust.yml - run: ./scripts/wasm_bindgen_check.sh --skip-setup - name: clippy wasm32 run: ./scripts/clippy_wasm.sh # requires a different toolchain from the other checks (nightly) check_wasm_atomics: name: Check wasm32+atomics runs-on: ubuntu-22.04 timeout-minutes: 60 steps: - uses: actions/checkout@v4 - run: sudo apt-get update && sudo apt-get install libgtk-3-dev libatk1.0-dev - name: Set up cargo cache uses: Swatinem/rust-cache@v2 - uses: dtolnay/rust-toolchain@stable with: toolchain: ${{env.NIGHTLY_VERSION}} targets: wasm32-unknown-unknown components: rust-src - name: Check wasm32+atomics eframe with wgpu run: RUSTFLAGS='-C target-feature=+atomics' cargo +${{env.NIGHTLY_VERSION}} check -p eframe --lib --no-default-features --features wgpu,wgpu/webgpu --target wasm32-unknown-unknown -Z build-std=std,panic_abort # --------------------------------------------------------------------------- cargo-deny: strategy: fail-fast: false matrix: include: - target: aarch64-apple-darwin - target: aarch64-linux-android - target: i686-pc-windows-gnu - target: i686-pc-windows-msvc - target: i686-unknown-linux-gnu - target: wasm32-unknown-unknown - target: x86_64-apple-darwin - target: x86_64-pc-windows-gnu - target: x86_64-pc-windows-msvc - target: x86_64-unknown-linux-gnu - target: x86_64-unknown-linux-musl - target: x86_64-unknown-redox name: cargo-deny ${{ matrix.target }} runs-on: ubuntu-22.04 timeout-minutes: 10 steps: - uses: actions/checkout@v4 - uses: EmbarkStudios/cargo-deny-action@v2 with: rust-version: "1.88.0" log-level: error command: check arguments: --target ${{ matrix.target }} # --------------------------------------------------------------------------- android: name: android runs-on: ubuntu-22.04 timeout-minutes: 60 steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable with: toolchain: 1.88.0 targets: aarch64-linux-android - name: Set up cargo cache uses: Swatinem/rust-cache@v2 # Default features disabled to turn off accesskit, which does not work # with NativeActivity. - run: cargo check --features wgpu,android-native-activity --target aarch64-linux-android --no-default-features working-directory: crates/eframe # --------------------------------------------------------------------------- ios: name: ios runs-on: ubuntu-22.04 timeout-minutes: 60 steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable with: toolchain: 1.88.0 targets: aarch64-apple-ios - name: Set up cargo cache uses: Swatinem/rust-cache@v2 # Default features are disabled because glutin doesn't compile for ios. - run: cargo check --features wgpu --target aarch64-apple-ios --no-default-features working-directory: crates/eframe # --------------------------------------------------------------------------- windows: name: Check Windows runs-on: windows-latest timeout-minutes: 60 steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable with: toolchain: 1.88.0 - name: Set up cargo cache uses: Swatinem/rust-cache@v2 - run: cargo clippy --all-targets --all-features - run: cargo clippy -p hello_world # --------------------------------------------------------------------------- tests: name: Run tests # We run the tests on macOS because it will run with an actual GPU runs-on: macos-latest timeout-minutes: 60 steps: - uses: actions/checkout@v4 with: lfs: true - uses: dtolnay/rust-toolchain@stable with: toolchain: 1.88.0 - name: Set up cargo cache uses: Swatinem/rust-cache@v2 - name: Run tests run: cargo test --all-features - name: Run doc-tests run: cargo test --all-features --doc - name: Upload artifacts uses: actions/upload-artifact@v4 if: always() with: name: test-results path: "**/tests/snapshots"