name: CI on: pull_request: push: branches: [master] jobs: fmt: name: Check formatting runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: dtolnay/rust-toolchain@stable with: components: rustfmt - name: Check Formatting run: cargo fmt -- --check tests: name: Test ${{ matrix.toolchain }} ${{ matrix.platform.name }} runs-on: ${{ matrix.platform.os }} strategy: fail-fast: false matrix: toolchain: [stable, nightly, '1.65.0'] platform: # Note: Make sure that we test all the `docs.rs` targets defined in Cargo.toml! - { name: 'Windows 64bit MSVC', target: x86_64-pc-windows-msvc, os: windows-latest, } - { name: 'Windows 32bit MSVC', target: i686-pc-windows-msvc, os: windows-latest, } - { name: 'Windows 64bit GNU', target: x86_64-pc-windows-gnu, os: windows-latest, host: -x86_64-pc-windows-gnu } - { name: 'Windows 32bit GNU', target: i686-pc-windows-gnu, os: windows-latest, host: -i686-pc-windows-gnu } - { name: 'Linux 32bit', target: i686-unknown-linux-gnu, os: ubuntu-latest, } - { name: 'Linux 64bit', target: x86_64-unknown-linux-gnu, os: ubuntu-latest, } - { name: 'X11', target: x86_64-unknown-linux-gnu, os: ubuntu-latest, options: '--no-default-features --features=x11' } - { name: 'Wayland', target: x86_64-unknown-linux-gnu, os: ubuntu-latest, options: '--no-default-features --features=wayland,wayland-dlopen' } - { name: 'Android', target: aarch64-linux-android, os: ubuntu-latest, options: '--package=winit --features=android-native-activity', cmd: 'apk --' } - { name: 'Redox OS', target: x86_64-unknown-redox, os: ubuntu-latest, } - { name: 'macOS', target: x86_64-apple-darwin, os: macos-latest, } - { name: 'iOS x86_64', target: x86_64-apple-ios, os: macos-latest, } - { name: 'iOS Aarch64', target: aarch64-apple-ios, os: macos-latest, } - { name: 'web', target: wasm32-unknown-unknown, os: ubuntu-latest, } env: # Set more verbose terminal output CARGO_TERM_VERBOSE: true RUST_BACKTRACE: 1 # Faster compilation and error on warnings RUSTFLAGS: '--codegen=debuginfo=0 --deny=warnings' RUSTDOCFLAGS: '--deny=warnings' OPTIONS: --target=${{ matrix.platform.target }} ${{ matrix.platform.options }} CMD: ${{ matrix.platform.cmd }} steps: - uses: actions/checkout@v3 - uses: dtolnay/rust-toolchain@master with: toolchain: ${{ matrix.toolchain }}${{ matrix.platform.host }} targets: ${{ matrix.platform.target }} components: clippy - name: Restore cache of cargo folder # We use `restore` and later `save`, so that we can create the key after # the cache has been downloaded. # # This could be avoided if we added Cargo.lock to the repository. uses: actions/cache/restore@v3 with: # https://doc.rust-lang.org/cargo/guide/cargo-home.html#caching-the-cargo-home-in-ci path: | ~/.cargo/registry/index/ ~/.cargo/registry/cache/ ~/.cargo/git/db/ key: cargo-${{ matrix.toolchain }}-${{ matrix.platform.name }}-never-intended-to-be-found restore-keys: cargo-${{ matrix.toolchain }}-${{ matrix.platform.name }} - name: Generate lockfile # Also updates the crates.io index run: cargo generate-lockfile - name: Install GCC Multilib if: (matrix.platform.os == 'ubuntu-latest') && contains(matrix.platform.target, 'i686') run: sudo apt-get update && sudo apt-get install gcc-multilib - name: Cache cargo-apk if: contains(matrix.platform.target, 'android') id: cargo-apk-cache uses: actions/cache@v3 with: path: ~/.cargo/bin/cargo-apk # Change this key if we update the required cargo-apk version key: cargo-apk-${{ matrix.toolchain }}-${{ matrix.platform.name }}-v0-9-7 - name: Install cargo-apk if: contains(matrix.platform.target, 'android') && (steps.cargo-apk-cache.outputs.cache-hit != 'true') run: cargo install cargo-apk --version=^0.9.7 --locked - name: Check documentation run: cargo doc --no-deps $OPTIONS --document-private-items - name: Build crate run: cargo $CMD build $OPTIONS - name: Build tests if: > !contains(matrix.platform.target, 'redox') && matrix.toolchain != '1.65.0' run: cargo $CMD test --no-run $OPTIONS - name: Run tests if: > !contains(matrix.platform.target, 'android') && !contains(matrix.platform.target, 'ios') && !contains(matrix.platform.target, 'wasm32') && !contains(matrix.platform.target, 'redox') && matrix.toolchain != '1.65.0' run: cargo $CMD test $OPTIONS - name: Lint with clippy if: (matrix.toolchain == 'stable') && !contains(matrix.platform.options, '--no-default-features') run: cargo clippy --all-targets $OPTIONS -- -Dwarnings - name: Build tests with serde enabled if: > !contains(matrix.platform.target, 'redox') && matrix.toolchain != '1.65.0' run: cargo $CMD test --no-run $OPTIONS --features serde - name: Run tests with serde enabled if: > !contains(matrix.platform.target, 'android') && !contains(matrix.platform.target, 'ios') && !contains(matrix.platform.target, 'wasm32') && !contains(matrix.platform.target, 'redox') && matrix.toolchain != '1.65.0' run: cargo $CMD test $OPTIONS --features serde # See restore step above - name: Save cache of cargo folder uses: actions/cache/save@v3 with: path: | ~/.cargo/registry/index/ ~/.cargo/registry/cache/ ~/.cargo/git/db/ key: cargo-${{ matrix.toolchain }}-${{ matrix.platform.name }}-${{ hashFiles('Cargo.lock') }} cargo-deny: name: Run cargo-deny on ${{ matrix.platform.name }} runs-on: ubuntu-latest # TODO: remove this matrix when https://github.com/EmbarkStudios/cargo-deny/issues/324 is resolved strategy: fail-fast: false matrix: platform: - { name: 'Android', target: aarch64-linux-android } - { name: 'iOS', target: aarch64-apple-ios } - { name: 'Linux', target: x86_64-unknown-linux-gnu } - { name: 'macOS', target: x86_64-apple-darwin } - { name: 'Redox OS', target: x86_64-unknown-redox } - { name: 'web', target: wasm32-unknown-unknown } - { name: 'Windows', target: x86_64-pc-windows-gnu } steps: - uses: actions/checkout@v3 - uses: EmbarkStudios/cargo-deny-action@v1 with: command: check log-level: error arguments: --all-features --target ${{ matrix.platform.target }}