[go: up one dir, main page]

winit 0.30.1

Cross-platform window creation library.
Documentation
name: CI

on:
  pull_request:
  push:
    branches: [master]

jobs:
  fmt:
    name: Check formatting
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - 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: actions/checkout@v4
      - 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.70.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,   }
        exclude:
          # Android is tested on stable-3
          - toolchain: '1.70.0'
            platform: { name: 'Android', target: aarch64-linux-android, os: ubuntu-latest, options: '--package=winit --features=android-native-activity', cmd: 'apk --' }
        include:
          - toolchain: '1.70.0'
            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: actions/checkout@v4

    - 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.70.0'
      run: cargo test -p dpi

    - name: Build tests
      if: >
        !contains(matrix.platform.target, 'redox') &&
        matrix.toolchain != '1.70.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.70.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.70.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.70.0'
      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: actions/checkout@v4
    - uses: EmbarkStudios/cargo-deny-action@v1
      with:
        command: check
        log-level: error
        arguments: --all-features --target ${{ matrix.platform.target }}