name: CI on: pull_request: push: branches: [master] jobs: fmt: name: Check formatting runs-on: ubuntu-latest steps: - uses: taiki-e/checkout-action@v1 - uses: dtolnay/rust-toolchain@nightly with: components: rustfmt - name: Check Formatting run: cargo fmt -- --check typos: name: Check for typos runs-on: ubuntu-latest timeout-minutes: 30 steps: - uses: taiki-e/checkout-action@v1 - uses: taiki-e/install-action@v2 with: tool: typos-cli - name: run typos run: typos - name: Typos info if: failure() run: | echo 'To fix typos, please run `typos -w`' echo 'To check for a diff, run `typos`' echo 'You can find typos here: https://crates.io/crates/typos' tests: name: Test ${{ matrix.toolchain }} ${{ matrix.platform.name }} runs-on: ${{ matrix.platform.os }} strategy: fail-fast: false matrix: toolchain: [stable, nightly, '1.73'] 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, } exclude: # Android is tested on stable-3 - toolchain: '1.73' platform: { name: 'Android', target: aarch64-linux-android, os: ubuntu-latest, options: '--package=winit --features=android-native-activity', cmd: 'apk --' } include: - toolchain: '1.73' platform: { name: 'Android', target: aarch64-linux-android, os: ubuntu-latest, options: '--package=winit --features=android-native-activity', cmd: 'apk --' } - toolchain: 'nightly' platform: { name: 'Web Atomic', target: wasm32-unknown-unknown, os: ubuntu-latest, options: '-Zbuild-std=panic_abort,std', rustflags: '-Ctarget-feature=+atomics,+bulk-memory', components: rust-src, } 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 ${{ matrix.platform.rustflags }}' OPTIONS: --target=${{ matrix.platform.target }} ${{ matrix.platform.options }} CMD: ${{ matrix.platform.cmd }} steps: - uses: taiki-e/checkout-action@v1 - 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 && cargo update -p ahash --precise 0.8.7 && cargo update -p bumpalo --precise 3.14.0 - 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-v0-9-7 - uses: dtolnay/rust-toolchain@master if: contains(matrix.platform.target, 'android') && (steps.cargo-apk-cache.outputs.cache-hit != 'true') with: toolchain: stable - 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 - uses: dtolnay/rust-toolchain@master with: toolchain: ${{ matrix.toolchain }}${{ matrix.platform.host }} targets: ${{ matrix.platform.target }} components: clippy, ${{ matrix.platform.components }} - name: Check documentation run: cargo doc --no-deps $OPTIONS --document-private-items env: RUSTDOCFLAGS: '--deny=warnings ${{ matrix.platform.rustflags }}' - name: Build crate run: cargo $CMD build $OPTIONS # Test only on Linux x86_64, so we avoid spending unnecessary CI hours. - name: Test dpi crate if: > contains(matrix.platform.name, 'Linux 64bit') && matrix.toolchain != '1.73' run: cargo test -p dpi - name: Build tests if: > !contains(matrix.platform.target, 'redox') && matrix.toolchain != '1.73' 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.73' 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.73' 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.73' run: cargo $CMD test $OPTIONS --features serde - name: Check docs.rs documentation if: matrix.toolchain == 'nightly' run: cargo doc --no-deps $OPTIONS --features=rwh_04,rwh_05,rwh_06,serde,mint,android-native-activity env: RUSTDOCFLAGS: '--deny=warnings ${{ matrix.platform.rustflags }} --cfg=docsrs --cfg=unreleased_changelogs' # 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: taiki-e/checkout-action@v1 - uses: EmbarkStudios/cargo-deny-action@v1 with: command: check log-level: error arguments: --all-features --target ${{ matrix.platform.target }} swc: name: Minimize JavaScript runs-on: ubuntu-latest steps: - uses: taiki-e/checkout-action@v1 - name: Install SWC run: sudo npm i -g @swc/cli - name: Run SWC run: | swc src/platform_impl/web/web_sys/worker.js -o src/platform_impl/web/web_sys/worker.min.js - name: Check for diff run: | [[ -z $(git status -s) ]]