| name: CI |
| |
| permissions: |
| contents: read |
| |
| on: |
| pull_request: |
| push: |
| branches: |
| - master |
| - '[0-9]+.[0-9]+' |
| schedule: |
| - cron: '0 1 * * *' |
| |
| env: |
| CARGO_INCREMENTAL: 0 |
| CARGO_NET_RETRY: 10 |
| CARGO_TERM_COLOR: always |
| RUST_BACKTRACE: 1 |
| RUSTFLAGS: -D warnings |
| RUSTUP_MAX_RETRIES: 10 |
| |
| defaults: |
| run: |
| shell: bash |
| |
| concurrency: |
| group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} |
| cancel-in-progress: true |
| |
| jobs: |
| test: |
| name: cargo test |
| strategy: |
| fail-fast: false |
| matrix: |
| include: |
| - os: ubuntu-latest |
| - os: macos-latest |
| - os: windows-latest |
| - os: ubuntu-latest |
| target: aarch64-unknown-linux-gnu |
| - os: ubuntu-latest |
| target: armv7-unknown-linux-gnueabihf |
| - os: ubuntu-latest |
| target: armv5te-unknown-linux-gnueabi |
| - os: ubuntu-latest |
| target: i686-unknown-linux-gnu |
| runs-on: ${{ matrix.os }} |
| steps: |
| - uses: actions/checkout@v4 |
| - name: Install Rust |
| # --no-self-update is necessary because the windows environment cannot self-update rustup.exe. |
| run: rustup update nightly --no-self-update && rustup default nightly |
| - uses: taiki-e/setup-cross-toolchain-action@v1 |
| with: |
| target: ${{ matrix.target }} |
| if: matrix.target != '' |
| - run: cargo test --workspace --all-features $DOCTEST_XCOMPILE |
| - run: cargo test --workspace --all-features --release $DOCTEST_XCOMPILE |
| # TODO: https://github.com/rust-lang/futures-rs/issues/2451 |
| if: matrix.target != 'aarch64-unknown-linux-gnu' |
| |
| core-msrv: |
| name: cargo +${{ matrix.rust }} build (futures-{core, io, sink}) |
| strategy: |
| matrix: |
| rust: |
| # This is the minimum Rust version supported by futures-core, futures-io, futures-sink. |
| # When updating this, the reminder to update the minimum required version in README.md and Cargo.toml. |
| - '1.36' |
| runs-on: ubuntu-latest |
| steps: |
| - uses: actions/checkout@v4 |
| - name: Install Rust |
| run: rustup update ${{ matrix.rust }} && rustup default ${{ matrix.rust }} |
| # cargo does not support for --features/--no-default-features with workspace, so use cargo-hack instead. |
| # Refs: cargo#3620, cargo#4106, cargo#4463, cargo#4753, cargo#5015, cargo#5364, cargo#6195 |
| - name: Install cargo-hack |
| uses: taiki-e/install-action@cargo-hack |
| # remove dev-dependencies to avoid https://github.com/rust-lang/cargo/issues/4866 |
| - run: cargo hack --remove-dev-deps --workspace |
| # Check no-default-features |
| - run: | |
| cargo hack build --workspace --ignore-private --no-default-features \ |
| --exclude futures --exclude futures-util --exclude futures-task --exclude futures-macro --exclude futures-executor --exclude futures-channel --exclude futures-test |
| # Check alloc feature |
| - run: | |
| cargo hack build --workspace --ignore-private --no-default-features --features alloc --ignore-unknown-features \ |
| --exclude futures --exclude futures-util --exclude futures-task --exclude futures-macro --exclude futures-executor --exclude futures-channel --exclude futures-test |
| # Check std feature |
| - run: | |
| cargo hack build --workspace --ignore-private --no-default-features --features std \ |
| --exclude futures --exclude futures-util --exclude futures-task --exclude futures-macro --exclude futures-executor --exclude futures-channel --exclude futures-test |
| |
| util-msrv: |
| name: cargo +${{ matrix.rust }} build |
| env: |
| CARGO_NET_GIT_FETCH_WITH_CLI: true |
| strategy: |
| matrix: |
| rust: |
| # This is the minimum Rust version supported by futures, futures-util, futures-task, futures-macro, futures-executor, futures-channel, futures-test. |
| # When updating this, the reminder to update the minimum required version in README.md and Cargo.toml. |
| - '1.56' |
| runs-on: ubuntu-latest |
| steps: |
| - uses: actions/checkout@v4 |
| - name: Install Rust |
| run: rustup update ${{ matrix.rust }} && rustup default ${{ matrix.rust }} |
| - name: Install cargo-hack |
| uses: taiki-e/install-action@cargo-hack |
| # remove dev-dependencies to avoid https://github.com/rust-lang/cargo/issues/4866 |
| - run: cargo hack --remove-dev-deps --workspace |
| # Check default features |
| - run: cargo hack build --workspace --ignore-private |
| # Check no-default-features |
| - run: cargo hack build --workspace --exclude futures-test --ignore-private --no-default-features |
| # Check alloc feature |
| - run: cargo hack build --workspace --exclude futures-test --ignore-private --no-default-features --features alloc --ignore-unknown-features |
| # Check std feature |
| - run: cargo hack build --workspace --ignore-private --no-default-features --features std --ignore-unknown-features |
| # Check compat feature (futures, futures-util) |
| # Exclude io-compat feature because the MSRV when it is enabled depends on the MSRV of tokio 0.1. |
| - run: cargo hack build -p futures -p futures-util --no-default-features --features std,compat |
| # Check thread-pool feature (futures, futures-executor) |
| - run: cargo hack build -p futures -p futures-executor --no-default-features --features std,thread-pool |
| |
| build: |
| name: cargo +${{ matrix.rust }} build |
| strategy: |
| fail-fast: false |
| matrix: |
| rust: |
| - stable |
| - beta |
| - nightly |
| runs-on: ubuntu-latest |
| steps: |
| - uses: actions/checkout@v4 |
| - name: Install Rust |
| run: rustup update ${{ matrix.rust }} && rustup default ${{ matrix.rust }} |
| - name: Install cargo-hack |
| uses: taiki-e/install-action@cargo-hack |
| - run: cargo hack build --workspace --no-dev-deps |
| - run: cargo build --tests --features default,thread-pool,io-compat --manifest-path futures/Cargo.toml |
| |
| minimal-versions: |
| name: cargo minimal-versions build |
| runs-on: ubuntu-latest |
| steps: |
| - uses: actions/checkout@v4 |
| - name: Install Rust |
| run: rustup update nightly && rustup default nightly |
| - name: Install cargo-hack |
| uses: taiki-e/install-action@cargo-hack |
| - name: Install cargo-minimal-versions |
| uses: taiki-e/install-action@cargo-minimal-versions |
| - run: cargo minimal-versions build --workspace --ignore-private --all-features |
| |
| no-std: |
| name: cargo build --target ${{ matrix.target }} |
| strategy: |
| fail-fast: false |
| matrix: |
| # thumbv7m-none-eabi supports atomic CAS. |
| # thumbv6m-none-eabi supports atomic, but not atomic CAS. |
| target: |
| - thumbv7m-none-eabi |
| - thumbv6m-none-eabi |
| runs-on: ubuntu-latest |
| steps: |
| - uses: actions/checkout@v4 |
| - name: Install Rust |
| run: rustup update nightly && rustup default nightly |
| - run: rustup target add ${{ matrix.target }} |
| - name: Install cargo-hack |
| uses: taiki-e/install-action@cargo-hack |
| # remove dev-dependencies to avoid https://github.com/rust-lang/cargo/issues/4866 |
| - run: cargo hack --remove-dev-deps --workspace |
| - run: | |
| cargo hack build --manifest-path futures/tests/no-std/Cargo.toml \ |
| --each-feature --optional-deps \ |
| --target ${{ matrix.target }} |
| - run: | |
| cargo hack build --workspace --ignore-private \ |
| --exclude futures-test --exclude futures-macro \ |
| --no-default-features \ |
| --target ${{ matrix.target }} |
| - run: | |
| cargo hack build --workspace --ignore-private \ |
| --exclude futures-test --exclude futures-macro \ |
| --no-default-features --features alloc --ignore-unknown-features \ |
| --target ${{ matrix.target }} |
| - run: | |
| cargo hack build --workspace --ignore-private \ |
| --exclude futures-test --exclude futures-macro \ |
| --no-default-features --features async-await,alloc --ignore-unknown-features \ |
| --target ${{ matrix.target }} |
| |
| bench: |
| name: cargo bench |
| runs-on: ubuntu-latest |
| steps: |
| - uses: actions/checkout@v4 |
| - name: Install Rust |
| run: rustup update nightly && rustup default nightly |
| - run: cargo bench --workspace |
| - run: cargo bench --manifest-path futures-util/Cargo.toml --features=bilock,unstable |
| |
| features: |
| name: cargo hack check --feature-powerset |
| runs-on: ubuntu-latest |
| steps: |
| - uses: actions/checkout@v4 |
| - name: Install Rust |
| run: rustup update nightly && rustup default nightly |
| - name: Install cargo-hack |
| uses: taiki-e/install-action@cargo-hack |
| # Check each specified feature works properly |
| # * `--feature-powerset` - run for the feature powerset of the package |
| # * `--depth 2` - limit the max number of simultaneous feature flags of `--feature-powerset` |
| # * `--no-dev-deps` - build without dev-dependencies to avoid https://github.com/rust-lang/cargo/issues/4866 |
| # * `--exclude futures-test` - futures-test cannot be compiled with no-default features |
| # * `--features unstable` - some features cannot be compiled without this feature |
| # * `--ignore-unknown-features` - some crates doesn't have 'unstable' feature |
| - run: | |
| cargo hack check \ |
| --feature-powerset --depth 2 --no-dev-deps \ |
| --workspace --exclude futures-test \ |
| --features unstable --ignore-unknown-features |
| |
| # When this job failed, run ci/no_atomic_cas.sh and commit result changes. |
| codegen: |
| runs-on: ubuntu-latest |
| permissions: |
| contents: write |
| pull-requests: write |
| steps: |
| - uses: actions/checkout@v4 |
| - name: Install Rust |
| run: rustup update nightly && rustup default nightly |
| - run: ci/no_atomic_cas.sh |
| - run: git add -N . && git diff --exit-code |
| if: github.repository_owner != 'rust-lang' || github.event_name != 'schedule' |
| - id: diff |
| run: | |
| git config user.name "Taiki Endo" |
| git config user.email "te316e89@gmail.com" |
| git add -N . |
| if ! git diff --exit-code; then |
| git add . |
| git commit -m "Update no_atomic_cas.rs" |
| echo "::set-output name=success::false" |
| fi |
| if: github.repository_owner == 'rust-lang' && github.event_name == 'schedule' |
| - uses: peter-evans/create-pull-request@v5 |
| with: |
| title: Update no_atomic_cas.rs |
| body: | |
| Auto-generated by [create-pull-request][1] |
| [Please close and immediately reopen this pull request to run CI.][2] |
| |
| [1]: https://github.com/peter-evans/create-pull-request |
| [2]: https://github.com/peter-evans/create-pull-request/blob/HEAD/docs/concepts-guidelines.md#workarounds-to-trigger-further-workflow-runs |
| branch: update-no-atomic-cas-rs |
| if: github.repository_owner == 'rust-lang' && github.event_name == 'schedule' && steps.diff.outputs.success == 'false' |
| |
| miri: |
| name: cargo miri test |
| runs-on: ubuntu-latest |
| steps: |
| - uses: actions/checkout@v4 |
| - name: Install Rust |
| run: rustup toolchain install nightly --component miri && rustup default nightly |
| - run: cargo miri test --workspace --all-features |
| env: |
| MIRIFLAGS: -Zmiri-strict-provenance -Zmiri-symbolic-alignment-check -Zmiri-disable-isolation |
| RUSTFLAGS: ${{ env.RUSTFLAGS }} -Z randomize-layout |
| |
| san: |
| name: cargo test -Z sanitizer=${{ matrix.sanitizer }} |
| strategy: |
| fail-fast: false |
| matrix: |
| sanitizer: |
| - address |
| - memory |
| - thread |
| runs-on: ubuntu-latest |
| steps: |
| - uses: actions/checkout@v4 |
| - name: Install Rust |
| run: rustup toolchain install nightly --component rust-src && rustup default nightly |
| - run: cargo -Z build-std test --workspace --all-features --target x86_64-unknown-linux-gnu --lib --tests |
| env: |
| # TODO: Once `cfg(sanitize = "..")` is stable, replace |
| # `cfg(futures_sanitizer)` with `cfg(sanitize = "..")` and remove |
| # `--cfg futures_sanitizer`. |
| RUSTFLAGS: -D warnings -Z sanitizer=${{ matrix.sanitizer }} --cfg futures_sanitizer |
| |
| # This branch no longer actively developed. Most commits to this |
| # branch are backporting and should not be blocked by clippy. |
| # clippy: |
| # name: cargo clippy |
| # runs-on: ubuntu-latest |
| # steps: |
| # - uses: actions/checkout@v4 |
| # - name: Install Rust |
| # run: rustup toolchain install nightly --component clippy && rustup default nightly |
| # - run: cargo clippy --workspace --all-features --all-targets |
| |
| fmt: |
| name: cargo fmt |
| runs-on: ubuntu-latest |
| steps: |
| - uses: actions/checkout@v4 |
| - name: Install Rust |
| run: rustup update stable |
| - run: cargo fmt --all -- --check |
| |
| docs: |
| name: cargo doc |
| runs-on: ubuntu-latest |
| steps: |
| - uses: actions/checkout@v4 |
| - name: Install Rust |
| run: rustup update nightly && rustup default nightly |
| - run: RUSTDOCFLAGS="-D warnings --cfg docsrs" cargo doc --workspace --no-deps --all-features |