CI #3724
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: CI | |
permissions: | |
contents: read | |
on: | |
pull_request: | |
push: | |
branches: | |
- main | |
- dev | |
schedule: | |
- cron: '0 2 * * *' | |
workflow_dispatch: | |
env: | |
CARGO_INCREMENTAL: 0 | |
CARGO_NET_GIT_FETCH_WITH_CLI: true | |
CARGO_NET_RETRY: 10 | |
CARGO_TERM_COLOR: always | |
RUST_BACKTRACE: 1 | |
RUST_TEST_THREADS: 1 | |
RUSTDOCFLAGS: -D warnings | |
RUSTFLAGS: -D warnings | |
RUSTUP_MAX_RETRIES: 10 | |
PORTABLE_ATOMIC_DENY_WARNINGS: 1 | |
# NB: sync with: | |
# - docs.rs metadata in Cargo.toml | |
# - test_features list in tools/build.sh and tools/test.sh. | |
TEST_FEATURES: float,std,serde,critical-section | |
defaults: | |
run: | |
shell: bash --noprofile --norc -CeEuxo pipefail {0} | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} | |
cancel-in-progress: true | |
jobs: | |
check-external-types: | |
uses: taiki-e/github-actions/.github/workflows/check-external-types.yml@main | |
deny: | |
uses: taiki-e/github-actions/.github/workflows/deny.yml@main | |
docs: | |
uses: taiki-e/github-actions/.github/workflows/docs.yml@main | |
with: | |
target: x86_64-unknown-linux-gnu,aarch64-unknown-linux-gnu,powerpc64le-unknown-linux-gnu,s390x-unknown-linux-gnu,armv5te-unknown-linux-gnueabi | |
msrv: | |
needs: tidy | |
uses: taiki-e/github-actions/.github/workflows/msrv.yml@main | |
with: | |
event_name: ${{ github.event_name }} | |
# NB: sync with env.TEST_FEATURES | |
# Exclude serde and critical-section features because the MSRV when it is enabled depends on the MSRV of them | |
args: --features float,std --ignore-unknown-features | |
tidy: | |
uses: taiki-e/github-actions/.github/workflows/tidy.yml@main | |
permissions: | |
contents: read | |
pull-requests: write # for gh pr edit --add-assignee | |
repository-projects: read # for gh pr edit --add-assignee | |
secrets: inherit | |
with: | |
clippy: false # covered by TESTS=1 ./tools/build.sh | |
test: | |
needs: tidy | |
strategy: | |
fail-fast: false | |
matrix: | |
# LLVM version table: | |
# - LLVM 3.9: stable 1.14 - 1.18, ? - ? | |
# - LLVM 4 : stable 1.19 - 1.24, ? - ? | |
# - LLVM 6 : stable 1.25 - 1.28, ? - ? | |
# - LLVM 7 : stable 1.29, ? - ? | |
# - LLVM 8 : stable 1.30 - 1.37, ? - ? | |
# - LLVM 9 : stable 1.38 - 1.44, ? - ? | |
# - LLVM 10 : stable 1.45 - 1.46, ? - ? | |
# - LLVM 11 : stable 1.47 - 1.51, ? - ? | |
# - LLVM 12 : stable 1.52 - 1.55, ? - nightly-2021-08-21 (1.56) | |
# - LLVM 13 : stable 1.56 - 1.59, nightly-2021-08-22 (1.56) - nightly-2022-02-17 (1.60) | |
# - LLVM 14 : stable 1.60 - 1.64, nightly-2022-02-18 (1.60) - nightly-2022-08-12 (1.65) | |
# - LLVM 15 : stable 1.65 - 1.69, nightly-2022-08-13 (1.65) - nightly-2023-03-25 (1.70) | |
# - LLVM 16 : stable 1.70 - 1.72, nightly-2023-03-26 (1.70) - nightly-2023-08-08 (1.73) | |
# - LLVM 17 : stable 1.73 - 1.77, nightly-2023-08-09 (1.73) - nightly-2024-02-13 (1.78) | |
# - LLVM 18 : stable 1.78 - 1.81, nightly-2024-02-14 (1.78) - nightly-2024-07-31 (1.82) | |
# - LLVM 19 : stable 1.82 - , nightly-2024-08-01 (1.82) - | |
# (see also https://github.com/rust-lang/rust/commits/master/src/llvm-project) | |
# Minimum external LLVM version table: | |
# - LLVM 3.9: stable 1.23 - 1.28, since https://github.com/rust-lang/rust/pull/45326 | |
# - LLVM 5 : stable 1.29 - 1.32, since https://github.com/rust-lang/rust/pull/51899 | |
# - LLVM 6 : stable 1.33 - 1.40, since https://github.com/rust-lang/rust/pull/56642 | |
# - LLVM 7 : stable 1.41 - 1.43, since https://github.com/rust-lang/rust/pull/66973 | |
# - LLVM 8 : stable 1.44 - 1.49, since https://github.com/rust-lang/rust/pull/71147 | |
# - LLVM 9 : stable 1.50 - 1.52, since https://github.com/rust-lang/rust/pull/78848 | |
# - LLVM 10 : stable 1.53 - 1.57, since https://github.com/rust-lang/rust/pull/83387 | |
# - LLVM 12 : stable 1.58 - 1.64, since https://github.com/rust-lang/rust/pull/90175 | |
# - LLVM 13 : stable 1.65 - 1.68, since https://github.com/rust-lang/rust/pull/100460 | |
# - LLVM 14 : stable 1.69 - 1.72, since https://github.com/rust-lang/rust/pull/107573 | |
# - LLVM 15 : stable 1.73 - 1.75, since https://github.com/rust-lang/rust/pull/114148 | |
# - LLVM 16 : stable 1.76 - 1.78, since https://github.com/rust-lang/rust/pull/117947 | |
# - LLVM 17 : stable 1.79 - 1.82, since https://github.com/rust-lang/rust/pull/122649 | |
# - LLVM 18 : stable 1.83 - , since https://github.com/rust-lang/rust/pull/130487 | |
# NOTE that some commented-out LLVM version entries are kept here, which may be temporarily uncommented if | |
# needed to investigate possible issues that may arise between LLVM and code generated for certain targets. | |
include: | |
- rust: '1.56' | |
- rust: nightly-2021-08-21 # Rust 1.56, LLVM 12 | |
- rust: '1.59' # LLVM 13 | |
# - rust: '1.64' # LLVM 14 | |
# - rust: '1.69' # LLVM 15 | |
# - rust: '1.72' # LLVM 16 | |
# - rust: '1.77' # LLVM 17 | |
# - rust: '1.81' # LLVM 18 | |
- rust: stable | |
- rust: beta | |
- rust: nightly | |
- rust: nightly | |
flags: -C panic=abort -Z panic_abort_tests | |
- rust: nightly | |
flags: -Z codegen-backend=cranelift | |
- rust: nightly | |
# target: x86_64-apple-darwin | |
os: macos-13 # x86_64 | |
- rust: nightly | |
# target: x86_64-pc-windows-msvc | |
os: windows-latest | |
- rust: nightly-x86_64-pc-windows-gnu | |
# target: x86_64-pc-windows-gnu | |
os: windows-latest | |
- rust: nightly-i686-pc-windows-msvc | |
# target: i686-pc-windows-msvc | |
os: windows-latest | |
- rust: nightly-i686-pc-windows-gnu | |
# target: i686-pc-windows-gnu | |
os: windows-latest | |
- rust: nightly | |
target: aarch64-apple-darwin | |
os: macos-latest # AArch64 | |
- rust: nightly | |
target: aarch64-apple-ios-macabi | |
os: macos-latest # AArch64 | |
- rust: nightly-2021-08-21 # Rust 1.56, LLVM 12 | |
target: aarch64-unknown-linux-gnu | |
- rust: '1.59' # LLVM 13 | |
target: aarch64-unknown-linux-gnu | |
# - rust: '1.64' # LLVM 14 | |
# target: aarch64-unknown-linux-gnu | |
# - rust: '1.69' # LLVM 15 | |
# target: aarch64-unknown-linux-gnu | |
# - rust: '1.72' # LLVM 16 | |
# target: aarch64-unknown-linux-gnu | |
# - rust: '1.77' # LLVM 17 | |
# target: aarch64-unknown-linux-gnu | |
# - rust: '1.81' # LLVM 18 | |
# target: aarch64-unknown-linux-gnu | |
- rust: stable | |
target: aarch64-unknown-linux-gnu | |
- rust: beta | |
target: aarch64-unknown-linux-gnu | |
- rust: nightly | |
target: aarch64-unknown-linux-gnu | |
- rust: nightly | |
target: aarch64-unknown-linux-gnu | |
flags: -Z codegen-backend=cranelift | |
- rust: nightly-2024-11-07 # TODO: https://github.com/BurntSushi/memchr/pull/162 | |
target: aarch64_be-unknown-linux-gnu | |
- rust: stable | |
target: aarch64-unknown-linux-musl | |
- rust: stable | |
target: aarch64-unknown-linux-musl | |
flags: -C target-feature=-crt-static | |
- rust: nightly | |
target: aarch64-unknown-linux-musl | |
- rust: nightly | |
target: aarch64-unknown-linux-musl | |
flags: -C target-feature=-crt-static | |
- rust: stable | |
target: aarch64-linux-android | |
- rust: nightly | |
target: aarch64-linux-android | |
# TODO: flaky | |
# - rust: nightly | |
# target: aarch64-pc-windows-gnullvm | |
- rust: nightly-2021-08-21 # Rust 1.56, LLVM 12 | |
target: armv5te-unknown-linux-gnueabi | |
- rust: '1.59' # LLVM 13 | |
target: armv5te-unknown-linux-gnueabi | |
- rust: stable | |
target: armv5te-unknown-linux-gnueabi | |
- rust: nightly | |
target: armv5te-unknown-linux-gnueabi | |
- rust: nightly | |
target: arm-unknown-linux-gnueabi | |
- rust: nightly | |
target: armv7-unknown-linux-gnueabi | |
- rust: nightly | |
target: armv7-unknown-linux-gnueabihf | |
- rust: nightly | |
target: armeb-unknown-linux-gnueabi | |
# TODO: backtrace bug: panicked at /home/runner/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/../../backtrace/src/symbolize/gimli/libs_dl_iterate_phdr.rs:48:30: | |
- rust: nightly-2024-08-30 | |
target: arm-linux-androideabi | |
- rust: nightly | |
target: i586-unknown-linux-gnu | |
- rust: nightly-2021-08-21 # Rust 1.56, LLVM 12 | |
target: i686-unknown-linux-gnu | |
- rust: '1.59' # LLVM 13 | |
target: i686-unknown-linux-gnu | |
- rust: stable | |
target: i686-unknown-linux-gnu | |
- rust: nightly | |
target: i686-unknown-linux-gnu | |
- rust: nightly | |
target: loongarch64-unknown-linux-gnu | |
- rust: nightly | |
target: mips-unknown-linux-gnu | |
- rust: nightly | |
target: mipsel-unknown-linux-gnu | |
- rust: nightly | |
target: mips64-unknown-linux-gnuabi64 | |
- rust: nightly | |
target: mips64el-unknown-linux-gnuabi64 | |
- rust: nightly | |
target: mipsisa32r6-unknown-linux-gnu | |
- rust: nightly | |
target: mipsisa32r6el-unknown-linux-gnu | |
- rust: nightly | |
target: mipsisa64r6-unknown-linux-gnuabi64 | |
- rust: nightly | |
target: mipsisa64r6el-unknown-linux-gnuabi64 | |
- rust: nightly | |
target: powerpc-unknown-linux-gnu | |
- rust: nightly-2022-02-13 # Rust 1.60, LLVM 13 (oldest version we can use asm_experimental_arch on this target) | |
target: powerpc64-unknown-linux-gnu | |
# - rust: nightly-2022-08-12 # Rust 1.65, LLVM 14 | |
# target: powerpc64-unknown-linux-gnu | |
# - rust: nightly-2023-03-25 # Rust 1.70, LLVM 15 | |
# target: powerpc64-unknown-linux-gnu | |
# - rust: nightly-2023-08-08 # Rust 1.73, LLVM 16 | |
# target: powerpc64-unknown-linux-gnu | |
# - rust: nightly-2024-02-13 # Rust 1.78, LLVM 17 | |
# target: powerpc64-unknown-linux-gnu | |
# - rust: nightly-2024-07-31 # Rust 1.82, LLVM 18 | |
# target: powerpc64-unknown-linux-gnu | |
- rust: nightly | |
target: powerpc64-unknown-linux-gnu | |
- rust: nightly-2022-02-13 # Rust 1.60, LLVM 13 (oldest version we can use asm_experimental_arch on this target) | |
target: powerpc64le-unknown-linux-gnu | |
# - rust: nightly-2022-08-12 # Rust 1.65, LLVM 14 | |
# target: powerpc64le-unknown-linux-gnu | |
# - rust: nightly-2023-03-25 # Rust 1.70, LLVM 15 | |
# target: powerpc64le-unknown-linux-gnu | |
# - rust: nightly-2023-08-08 # Rust 1.73, LLVM 16 | |
# target: powerpc64le-unknown-linux-gnu | |
# - rust: nightly-2024-02-13 # Rust 1.78, LLVM 17 | |
# target: powerpc64le-unknown-linux-gnu | |
# - rust: nightly-2024-07-31 # Rust 1.82, LLVM 18 | |
# target: powerpc64le-unknown-linux-gnu | |
- rust: nightly | |
target: powerpc64le-unknown-linux-gnu | |
- rust: nightly-2022-08-12 # Rust 1.65, LLVM 14 | |
target: riscv32gc-unknown-linux-gnu | |
# - rust: nightly-2023-03-25 # Rust 1.70, LLVM 15 | |
# target: riscv32gc-unknown-linux-gnu | |
# - rust: nightly-2023-08-08 # Rust 1.73, LLVM 16 | |
# target: riscv32gc-unknown-linux-gnu | |
# - rust: nightly-2024-02-13 # Rust 1.78, LLVM 17 | |
# target: riscv32gc-unknown-linux-gnu | |
# - rust: nightly-2024-07-31 # Rust 1.82, LLVM 18 | |
# target: riscv32gc-unknown-linux-gnu | |
- rust: nightly | |
target: riscv32gc-unknown-linux-gnu | |
- rust: nightly-2021-08-21 # Rust 1.56, LLVM 12 | |
target: riscv64gc-unknown-linux-gnu | |
- rust: '1.59' # LLVM 13 | |
target: riscv64gc-unknown-linux-gnu | |
# - rust: '1.64' # LLVM 14 | |
# target: riscv64gc-unknown-linux-gnu | |
# - rust: '1.69' # LLVM 15 | |
# target: riscv64gc-unknown-linux-gnu | |
# - rust: '1.72' # LLVM 16 | |
# target: riscv64gc-unknown-linux-gnu | |
# - rust: '1.77' # LLVM 17 | |
# target: riscv64gc-unknown-linux-gnu | |
# - rust: '1.81' # LLVM 18 | |
# target: riscv64gc-unknown-linux-gnu | |
- rust: stable | |
target: riscv64gc-unknown-linux-gnu | |
- rust: nightly | |
target: riscv64gc-unknown-linux-gnu | |
- rust: nightly | |
target: riscv64gc-unknown-linux-gnu | |
flags: -Z codegen-backend=cranelift | |
# - rust: '1.84' # LLVM 19 (oldest stable version we can use asm on this target) | |
# target: s390x-unknown-linux-gnu | |
- rust: nightly-2023-05-09 # Rust 1.71, LLVM 16 (oldest version we can use asm_experimental_arch on this target) | |
target: s390x-unknown-linux-gnu | |
# - rust: nightly-2024-02-13 # Rust 1.78, LLVM 17 | |
# target: s390x-unknown-linux-gnu | |
# - rust: nightly-2024-07-31 # Rust 1.82, LLVM 18 | |
# target: s390x-unknown-linux-gnu | |
- rust: nightly | |
target: s390x-unknown-linux-gnu | |
- rust: nightly | |
target: sparc64-unknown-linux-gnu | |
- rust: nightly | |
target: thumbv7neon-unknown-linux-gnueabihf | |
runs-on: ${{ matrix.os || 'ubuntu-latest' }} | |
timeout-minutes: 60 | |
steps: | |
- uses: taiki-e/checkout-action@v1 | |
- run: | | |
lscpu | |
# sudo apt-get -o Acquire::Retries=10 -qq update && sudo apt-get -o Acquire::Retries=10 -o Dpkg::Use-Pty=0 install -y --no-install-recommends moreutils | |
if: startsWith(matrix.os, 'ubuntu') || matrix.os == '' | |
- run: | | |
sysctl hw.optional machdep.cpu | |
# brew install moreutils | |
if: startsWith(matrix.os, 'macos') | |
# - run: | | |
# C:/msys64/usr/bin/pacman -S --noconfirm moreutils | |
# if: startsWith(matrix.os, 'windows') | |
- uses: taiki-e/github-actions/install-rust@main | |
with: | |
toolchain: ${{ matrix.rust }} | |
- uses: taiki-e/install-action@cargo-hack | |
- uses: taiki-e/install-action@cargo-minimal-versions | |
- uses: taiki-e/install-action@cargo-careful | |
if: startsWith(matrix.rust, 'nightly') | |
- uses: taiki-e/setup-cross-toolchain-action@v1 | |
with: | |
target: ${{ matrix.target }} | |
if: matrix.target != '' | |
- run: printf '%s\n' "RUSTFLAGS=${RUSTFLAGS} --cfg qemu" >>"${GITHUB_ENV}" | |
if: matrix.target != '' && !startsWith(matrix.target, 'i686') && !startsWith(matrix.target, 'x86_64') && !startsWith(matrix.os, 'macos') | |
- run: | | |
printf '%s\n' "RUSTFLAGS=${RUSTFLAGS} ${{ matrix.flags }}" >>"${GITHUB_ENV}" | |
printf '%s\n' "RUSTDOCFLAGS=${RUSTDOCFLAGS} ${{ matrix.flags }}" >>"${GITHUB_ENV}" | |
if: matrix.flags != '' | |
- run: printf '%s\n' "TARGET=--target=${{ matrix.target }}" >>"${GITHUB_ENV}" | |
if: matrix.target != '' && !contains(matrix.target, '-darwin') | |
# TODO: LLVM bug: Undefined temporary symbol error when building std. | |
- run: printf 'RELEASE=--release\n' >>"${GITHUB_ENV}" | |
if: startsWith(matrix.target, 'mips-') || startsWith(matrix.target, 'mipsel-') | |
# for serde | |
- run: printf '%s\n' "RUSTFLAGS=${RUSTFLAGS} --cfg no_diagnostic_namespace" >>"${GITHUB_ENV}" | |
if: matrix.rust == 'nightly-2024-02-13' | |
- run: tools/test.sh -vv ${TARGET:-} ${DOCTEST_XCOMPILE:-} ${BUILD_STD:-} ${RELEASE:-} | |
- run: tools/test.sh -vv --tests ${TARGET:-} ${BUILD_STD:-} ${RELEASE:-} | |
env: | |
RUSTFLAGS: ${{ env.RUSTFLAGS }} --cfg portable_atomic_unstable_coerce_unsized | |
if: startsWith(matrix.rust, 'nightly') | |
# We test doctest only once with the default build conditions because doctest is slow. Both api-test | |
# and src/tests have extended copies of doctest, so this will not reduce test coverage. | |
# portable_atomic_no_outline_atomics only affects x86_64, AArch64, Arm, powerpc64, and RISC-V Linux. | |
# outline-atomics is disabled by default on AArch64/powerpc64 musl with static linking | |
# powerpc64le- (little-endian) is skipped because it is pwr8 by default | |
# RISC-V Linux is skipped because outline-atomics is currently disabled by default on riscv. | |
- run: tools/test.sh -vv --tests ${TARGET:-} ${BUILD_STD:-} ${RELEASE:-} | |
env: | |
RUSTDOCFLAGS: ${{ env.RUSTDOCFLAGS }} --cfg portable_atomic_no_outline_atomics | |
RUSTFLAGS: ${{ env.RUSTFLAGS }} --cfg portable_atomic_no_outline_atomics | |
if: (matrix.target == '' && !contains(matrix.rust, 'i686') || startsWith(matrix.target, 'x86_64')) || (startsWith(matrix.target, 'aarch64') || startsWith(matrix.target, 'powerpc64-')) && !(contains(matrix.target, '-musl') && matrix.flags == '') || startsWith(matrix.target, 'armv5te') || matrix.target == 'arm-linux-androideabi' | |
- run: tools/test.sh -vv --tests ${TARGET:-} ${BUILD_STD:-} ${RELEASE:-} | |
env: | |
# Note: detect_false cfg is intended to make it easy for portable-atomic developers to | |
# test cases such as has_cmpxchg16b == false, has_lse == false, | |
# __kuser_helper_version < 5, etc., and is not a public API. | |
RUSTDOCFLAGS: ${{ env.RUSTDOCFLAGS }} --cfg portable_atomic_test_outline_atomics_detect_false | |
RUSTFLAGS: ${{ env.RUSTFLAGS }} --cfg portable_atomic_test_outline_atomics_detect_false | |
# powerpc64 is skipped because tested below. | |
# TODO: arm-linux-androideabi is removed due to an issue between Rust nightly & QEMU in CI testing - needs investigation | |
if: (matrix.target == '' && !contains(matrix.rust, 'i686') || startsWith(matrix.target, 'x86_64')) || startsWith(matrix.target, 'aarch64') && !(contains(matrix.target, '-musl') && matrix.flags == '') || startsWith(matrix.target, 'armv5te') | |
- run: tools/test.sh -vv --tests ${TARGET:-} ${BUILD_STD:-} ${RELEASE:-} | |
env: | |
QEMU_CPU: power7 # no quadword-atomics | |
if: startsWith(matrix.target, 'powerpc64-') | |
# portable_atomic_outline_atomics only affects AArch64 non-glibc-Linux/illumos, powerpc64, and RISC-V Linux. | |
# powerpc64le- (little-endian) is skipped because it is pwr8 by default | |
- run: tools/test.sh -vv --tests ${TARGET:-} ${BUILD_STD:-} ${RELEASE:-} --exclude api-test | |
env: | |
RUSTDOCFLAGS: ${{ env.RUSTDOCFLAGS }} --cfg portable_atomic_outline_atomics | |
RUSTFLAGS: ${{ env.RUSTFLAGS }} --cfg portable_atomic_outline_atomics | |
if: startsWith(matrix.target, 'aarch64') && contains(matrix.target, '-musl') && matrix.flags == '' || startsWith(matrix.target, 'powerpc64-') || startsWith(matrix.target, 'riscv') | |
- run: tools/test.sh -vv --tests ${TARGET:-} ${BUILD_STD:-} ${RELEASE:-} --exclude api-test | |
env: | |
# Note: detect_false cfg is intended to make it easy for portable-atomic developers to | |
# test cases such as has_cmpxchg16b == false, has_lse == false, | |
# __kuser_helper_version < 5, etc., and is not a public API. | |
RUSTDOCFLAGS: ${{ env.RUSTDOCFLAGS }} --cfg portable_atomic_outline_atomics --cfg portable_atomic_test_outline_atomics_detect_false | |
RUSTFLAGS: ${{ env.RUSTFLAGS }} --cfg portable_atomic_outline_atomics --cfg portable_atomic_test_outline_atomics_detect_false | |
# powerpc64 and RISC-V are skipped because tested below. | |
if: startsWith(matrix.target, 'aarch64') && contains(matrix.target, '-musl') && matrix.flags == '' | |
- run: tools/test.sh -vv --tests ${TARGET:-} ${BUILD_STD:-} ${RELEASE:-} --exclude api-test | |
env: | |
RUSTDOCFLAGS: ${{ env.RUSTDOCFLAGS }} --cfg portable_atomic_outline_atomics | |
RUSTFLAGS: ${{ env.RUSTFLAGS }} --cfg portable_atomic_outline_atomics | |
QEMU_CPU: power7 # no quadword-atomics | |
if: startsWith(matrix.target, 'powerpc64-') | |
- run: tools/test.sh -vv --tests ${TARGET:-} ${BUILD_STD:-} ${RELEASE:-} --exclude api-test | |
env: | |
RUSTDOCFLAGS: ${{ env.RUSTDOCFLAGS }} --cfg portable_atomic_outline_atomics | |
RUSTFLAGS: ${{ env.RUSTFLAGS }} --cfg portable_atomic_outline_atomics | |
QEMU_CPU: sifive-u34 # no zacas | |
if: startsWith(matrix.target, 'riscv32') | |
- run: tools/test.sh -vv --tests ${TARGET:-} ${BUILD_STD:-} ${RELEASE:-} --exclude api-test | |
env: | |
RUSTDOCFLAGS: ${{ env.RUSTDOCFLAGS }} --cfg portable_atomic_outline_atomics | |
RUSTFLAGS: ${{ env.RUSTFLAGS }} --cfg portable_atomic_outline_atomics | |
QEMU_CPU: sifive-u54 # no zacas | |
if: startsWith(matrix.target, 'riscv64') | |
# x86_64 +cmpxchg16b | |
- run: tools/test.sh -vv --tests ${TARGET:-} ${BUILD_STD:-} ${RELEASE:-} | |
env: | |
# cmpxchg16b + outline-atomics (vmovdqa load/store) path is tested in first 2 runs on macOS. | |
RUSTDOCFLAGS: ${{ env.RUSTDOCFLAGS }} -C target-feature=+cmpxchg16b --cfg portable_atomic_no_outline_atomics | |
RUSTFLAGS: ${{ env.RUSTFLAGS }} -C target-feature=+cmpxchg16b --cfg portable_atomic_no_outline_atomics | |
if: matrix.target == '' && !contains(matrix.rust, 'i686') || startsWith(matrix.target, 'x86_64') | |
# aarch64 +lse | |
- run: tools/test.sh -vv --tests ${TARGET:-} ${BUILD_STD:-} ${RELEASE:-} | |
env: | |
RUSTDOCFLAGS: ${{ env.RUSTDOCFLAGS }} -C target-feature=+lse | |
RUSTFLAGS: ${{ env.RUSTFLAGS }} -C target-feature=+lse | |
# macOS is skipped because it is +lse,+lse2 by default | |
# QEMU + Wine is slow so test only cases where OS-specific code is called. | |
if: startsWith(matrix.target, 'aarch64') && !contains(matrix.target, '-darwin') && matrix.target != 'aarch64-pc-windows-gnullvm' | |
# aarch64 +lse,+lse2 | |
- run: tools/test.sh -vv --tests ${TARGET:-} ${BUILD_STD:-} ${RELEASE:-} | |
env: | |
RUSTDOCFLAGS: ${{ env.RUSTDOCFLAGS }} -C target-feature=+lse,+lse2 | |
RUSTFLAGS: ${{ env.RUSTFLAGS }} -C target-feature=+lse,+lse2 | |
# macOS is skipped because it is +lse,+lse2 by default | |
# QEMU + Wine is slow so test only cases where OS-specific code is called. | |
if: startsWith(matrix.target, 'aarch64') && !contains(matrix.target, '-darwin') && matrix.target != 'aarch64-pc-windows-gnullvm' | |
# powerpc64 pwr7 | |
# powerpc64- (big-endian) is skipped because it is pre-pwr8 by default | |
- run: tools/test.sh -vv --tests ${TARGET:-} ${BUILD_STD:-} ${RELEASE:-} | |
env: | |
RUSTDOCFLAGS: ${{ env.RUSTDOCFLAGS }} -C target-cpu=pwr7 | |
RUSTFLAGS: ${{ env.RUSTFLAGS }} -C target-cpu=pwr7 | |
if: startsWith(matrix.target, 'powerpc64le-') | |
# powerpc64 pwr8 | |
# powerpc64le- (little-endian) is skipped because it is pwr8 by default | |
- run: tools/test.sh -vv --tests ${TARGET:-} ${BUILD_STD:-} ${RELEASE:-} | |
env: | |
RUSTDOCFLAGS: ${{ env.RUSTDOCFLAGS }} -C target-cpu=pwr8 | |
RUSTFLAGS: ${{ env.RUSTFLAGS }} -C target-cpu=pwr8 | |
if: startsWith(matrix.target, 'powerpc64-') | |
# riscv +zabha | |
- run: tools/test.sh -vv --tests ${TARGET:-} ${BUILD_STD:-} ${RELEASE:-} | |
env: | |
RUSTDOCFLAGS: ${{ env.RUSTDOCFLAGS }} -C target-feature=+zabha | |
RUSTFLAGS: ${{ env.RUSTFLAGS }} -C target-feature=+zabha | |
QEMU_CPU: max | |
if: startsWith(matrix.target, 'riscv') | |
# riscv +experimental-zacas | |
- run: tools/test.sh -vv --tests ${TARGET:-} ${BUILD_STD:-} ${RELEASE:-} | |
env: | |
RUSTDOCFLAGS: ${{ env.RUSTDOCFLAGS }} -C target-feature=+experimental-zacas | |
RUSTFLAGS: ${{ env.RUSTFLAGS }} -C target-feature=+experimental-zacas | |
if: startsWith(matrix.target, 'riscv') | |
# s390x z196 (arch9) | |
- run: tools/test.sh -vv --tests ${TARGET:-} ${BUILD_STD:-} ${RELEASE:-} | |
env: | |
RUSTDOCFLAGS: ${{ env.RUSTDOCFLAGS }} -C target-cpu=z196 | |
RUSTFLAGS: ${{ env.RUSTFLAGS }} -C target-cpu=z196 | |
if: startsWith(matrix.target, 's390x') | |
# s390x z15 (arch13) | |
- run: tools/test.sh -vv --tests ${TARGET:-} ${BUILD_STD:-} ${RELEASE:-} | |
env: | |
RUSTDOCFLAGS: ${{ env.RUSTDOCFLAGS }} -C target-cpu=z15 | |
RUSTFLAGS: ${{ env.RUSTFLAGS }} -C target-cpu=z15 | |
if: startsWith(matrix.target, 's390x') | |
# Skip targets that also checked by "build" job. | |
- run: tools/build.sh ${{ matrix.target || 'host' }} | |
env: | |
SKIP_DEFAULT_TARGET: 1 | |
- run: TESTS=1 tools/build.sh ${{ matrix.target || 'host' }} | |
env: | |
SKIP_DEFAULT_TARGET: 1 | |
- run: cargo minimal-versions build --workspace --no-private --detach-path-deps=skip-exact --features "${TEST_FEATURES}" --ignore-unknown-features ${TARGET:-} ${BUILD_STD:-} ${RELEASE:-} | |
if: matrix.rust != 'nightly-2021-08-21' | |
- run: cargo minimal-versions build --workspace --no-private --detach-path-deps=skip-exact --features "${TEST_FEATURES}" --ignore-unknown-features ${TARGET:-} ${BUILD_STD:-} ${RELEASE:-} --direct | |
# -Z direct-minimal-versions requires Cargo 1.70. | |
if: (!(startsWith(matrix.rust, '1.5') || startsWith(matrix.rust, '1.6') || startsWith(matrix.rust, 'nightly-2021') || startsWith(matrix.rust, 'nightly-2022') || startsWith(matrix.rust, 'nightly-2023'))) | |
test-bsd: | |
needs: tidy | |
name: test (${{ matrix.target }}${{ matrix.version }}) | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- target: aarch64-unknown-freebsd | |
os: freebsd | |
version: '13.4' | |
- target: aarch64-unknown-freebsd | |
os: freebsd | |
version: '14.1' | |
- target: aarch64-unknown-netbsd | |
os: netbsd | |
version: '10.0' | |
- target: aarch64-unknown-openbsd | |
os: openbsd | |
version: '7.6' | |
runs-on: ubuntu-latest | |
timeout-minutes: 60 | |
steps: | |
- uses: taiki-e/checkout-action@v1 | |
- uses: taiki-e/cross-platform-actions-action@neoverse-v1 | |
with: | |
environment_variables: CARGO_INCREMENTAL CARGO_NET_RETRY CARGO_TERM_COLOR RUST_BACKTRACE RUST_TEST_THREADS RUSTDOCFLAGS RUSTFLAGS RUSTUP_MAX_RETRIES PORTABLE_ATOMIC_DENY_WARNINGS TEST_FEATURES | |
operating_system: ${{ matrix.os }} | |
# We don't test x86_64 here because there is no OS-specific code on x86_64. | |
architecture: aarch64 | |
version: ${{ matrix.version }} | |
shell: bash | |
sync_files: runner-to-vm | |
run: | | |
set -CeEuxo pipefail | |
retry() { | |
for i in {1..10}; do | |
if "$@"; then | |
return 0 | |
else | |
sleep "${i}" | |
fi | |
done | |
"$@" | |
} | |
export CI=true | |
export RUSTFLAGS="${RUSTFLAGS} --cfg qemu" | |
# AArch64 FreeBSD/NetBSD/OpenBSD are tier 3 targets, so install Rust from package manager instead of rustup. | |
case "$(uname -s)" in | |
FreeBSD) retry sudo pkg install -y rust ;; | |
NetBSD) retry sudo pkgin -y install rust ;; | |
OpenBSD) retry sudo pkg_add rust ;; | |
esac | |
rustc -vV | |
# VM is very slow, so only test OS-specific code and code using them. | |
cargo test --features std --tests -- aarch64 | |
build: | |
needs: tidy | |
name: build (${{ matrix.name || matrix.rust }}) | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- rust: '1.34' | |
- rust: '1.36' | |
- rust: '1.59' | |
- rust: stable | |
- rust: beta | |
- rust: nightly | |
# The oldest nightly that can compile this crate is nightly-2019-01-27 | |
# which Atomic{I,U}{8,16,32,64} stabilized. | |
# https://github.com/rust-lang/rust/pull/57425 | |
# Note: Old nightly compilers are essentially fragile, so support for | |
# them is on a best-effort basis. | |
- rust: nightly-2019-01-27 | |
# https://github.com/taiki-e/portable-atomic/pull/52 | |
- rust: nightly-2020-06-21 | |
# for AVR: https://github.com/rust-lang/compiler-builtins/issues/400 | |
- rust: nightly-2020-12-26 | |
# Check that test suite can be built | |
- name: nightly, --tests | |
rust: nightly | |
tests: 1 | |
# Check that this crate can be built for all builtin targets | |
- name: stable, all tier1/tier2 | |
rust: stable | |
target-group: tier1/tier2 | |
# Skip targets that also checked by other matrix. | |
skip-default-target: 1 | |
- name: nightly, all tier1/tier2 | |
rust: nightly | |
target-group: tier1/tier2 | |
skip-default-target: 1 | |
- name: nightly, all tier3 | |
rust: nightly | |
target-group: tier3 | |
skip-default-target: 1 | |
runs-on: ubuntu-latest | |
timeout-minutes: 120 # TODO: reduce | |
steps: | |
- uses: taiki-e/checkout-action@v1 | |
- uses: taiki-e/github-actions/free-device-space@main | |
if: matrix.target-group == '' | |
- uses: taiki-e/github-actions/install-rust@main | |
with: | |
toolchain: ${{ matrix.rust }} | |
- uses: taiki-e/install-action@cargo-hack | |
- run: tools/build.sh | |
env: | |
TESTS: ${{ matrix.tests }} | |
TARGET_GROUP: ${{ matrix.target-group }} | |
SKIP_DEFAULT_TARGET: ${{ matrix.skip-default-target }} | |
no-std: | |
needs: tidy | |
strategy: | |
fail-fast: false | |
matrix: | |
rust: | |
- '1.64' # LLVM 14 | |
# - '1.69' # LLVM 15 | |
- '1.72' # LLVM 16 | |
# - '1.77' # LLVM 17 | |
# - '1.81' # LLVM 18 | |
- stable | |
- nightly | |
runs-on: ubuntu-latest | |
timeout-minutes: 60 | |
steps: | |
- uses: taiki-e/checkout-action@v1 | |
- uses: taiki-e/github-actions/install-rust@main | |
with: | |
toolchain: ${{ matrix.rust }} | |
- uses: taiki-e/install-action@cargo-hack | |
if: matrix.rust == 'stable' | |
- uses: taiki-e/install-action@espup | |
if: matrix.rust == 'stable' | |
- run: | | |
retry() { | |
for i in {1..10}; do | |
if "$@"; then | |
return 0 | |
else | |
sleep "${i}" | |
fi | |
done | |
"$@" | |
} | |
apt_packages=( | |
qemu-system-arm | |
qemu-system-misc | |
) | |
if [[ "${{ matrix.rust }}" == "nightly"* ]]; then | |
apt_packages+=( | |
avr-libc | |
gcc-avr | |
libelf-dev | |
mspdebug | |
simavr | |
) | |
fi | |
retry sudo apt-get -o Acquire::Retries=10 -qq update | |
retry sudo apt-get -o Acquire::Retries=10 -o Dpkg::Use-Pty=0 install -y --no-install-recommends "${apt_packages[@]}" | |
# APT's qemu package doesn't provide firmware for riscv32: https://packages.ubuntu.com/en/jammy/all/qemu-system-data/filelist | |
opensbi_version=1.5.1 # https://github.com/riscv-software-src/opensbi/releases | |
retry curl --proto '=https' --tlsv1.2 -fsSL --retry 10 --retry-connrefused "https://github.com/riscv-software-src/opensbi/releases/download/v${opensbi_version}/opensbi-${opensbi_version}-rv-bin.tar.xz" \ | |
| tar xJf - | |
sudo mv -- "opensbi-${opensbi_version}-rv-bin/share/opensbi/ilp32/generic/firmware/fw_dynamic.bin" /usr/share/qemu/opensbi-riscv32-generic-fw_dynamic.bin | |
sudo mv -- "opensbi-${opensbi_version}-rv-bin/share/opensbi/ilp32/generic/firmware/fw_dynamic.elf" /usr/share/qemu/opensbi-riscv32-generic-fw_dynamic.elf | |
rm -rf -- "opensbi-${opensbi_version}-rv-bin" | |
if [[ "${{ matrix.rust }}" == "nightly"* ]]; then | |
mkdir -p -- "${HOME}"/msp430-gcc | |
# https://www.ti.com/tool/MSP430-GCC-OPENSOURCE | |
retry curl --proto '=https' --tlsv1.2 -fsSL --retry 10 --retry-connrefused https://dr-download.ti.com/software-development/ide-configuration-compiler-or-debugger/MD-LlCjWuAbzH/9.3.1.2/msp430-gcc-9.3.1.11_linux64.tar.bz2 \ | |
| tar xjf - --strip-components 1 -C "${HOME}"/msp430-gcc | |
printf '%s\n' "${HOME}"/msp430-gcc/bin >>"${GITHUB_PATH}" | |
elif [[ "${{ matrix.rust }}" == "stable" ]]; then | |
retry espup install --targets esp32s2 | |
fi | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
- uses: taiki-e/cache-cargo-install-action@v2 | |
with: | |
# https://github.com/agbrs/agb/tree/5fb928a/mgba-test-runner | |
# To install locally: | |
# apt install libelf-dev | |
# cargo install mgba-test-runner --git https://github.com/agbrs/agb.git --rev 5fb928a | |
tool: mgba-test-runner | |
git: https://github.com/agbrs/agb.git | |
rev: 5fb928a | |
env: | |
RUSTFLAGS: -W warnings | |
if: startsWith(matrix.rust, 'nightly') | |
- run: rm -- tests/avr/rust-toolchain.toml | |
if: startsWith(matrix.rust, 'nightly-') | |
- run: tools/no-std.sh | |
- run: tools/build.sh +esp xtensa-esp32s2-none-elf | |
if: matrix.rust == 'stable' | |
- run: tools/no-std.sh +esp xtensa-esp32s2-none-elf | |
if: matrix.rust == 'stable' | |
miri: | |
needs: tidy | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- target: x86_64-unknown-linux-gnu | |
- target: x86_64-unknown-linux-gnu | |
flags: -C target-feature=+cmpxchg16b | |
- target: aarch64-unknown-linux-gnu | |
- target: i686-unknown-linux-gnu | |
- target: powerpc64le-unknown-linux-gnu | |
- target: s390x-unknown-linux-gnu | |
runs-on: ubuntu-latest | |
timeout-minutes: 60 | |
steps: | |
- uses: taiki-e/checkout-action@v1 | |
- uses: taiki-e/github-actions/install-rust@nightly | |
- uses: taiki-e/install-action@cargo-hack | |
# - run: sudo apt-get -o Acquire::Retries=10 -qq update && sudo apt-get -o Acquire::Retries=10 -o Dpkg::Use-Pty=0 install -y --no-install-recommends moreutils | |
- run: printf '%s\n' "TARGET=--target=${{ matrix.target }}" >>"${GITHUB_ENV}" | |
if: matrix.target != 'x86_64-unknown-linux-gnu' | |
- run: tools/test.sh miri ${TARGET:-} | |
env: | |
RUSTDOCFLAGS: ${{ env.RUSTDOCFLAGS }} ${{ matrix.flags }} | |
RUSTFLAGS: ${{ env.RUSTFLAGS }} ${{ matrix.flags }} | |
san: | |
needs: tidy | |
strategy: | |
fail-fast: false | |
matrix: | |
sanitizer: | |
- address | |
- memory | |
- thread | |
runs-on: ubuntu-latest | |
timeout-minutes: 60 | |
steps: | |
- uses: taiki-e/checkout-action@v1 | |
- uses: taiki-e/github-actions/install-rust@nightly | |
# https://github.com/google/sanitizers/issues/1716 / https://github.com/actions/runner-images/issues/9491 | |
- run: sudo sysctl vm.mmap_rnd_bits=28 | |
- uses: taiki-e/install-action@cargo-hack | |
# - run: sudo apt-get -o Acquire::Retries=10 -qq update && sudo apt-get -o Acquire::Retries=10 -o Dpkg::Use-Pty=0 install -y --no-install-recommends moreutils | |
- run: | | |
printf 'ASAN_OPTIONS=detect_stack_use_after_return=1\n' >>"${GITHUB_ENV}" | |
printf '%s\n' "RUSTFLAGS=${RUSTFLAGS} -Z sanitizer=address" >>"${GITHUB_ENV}" | |
printf '%s\n' "RUSTDOCFLAGS=${RUSTDOCFLAGS} -Z sanitizer=address" >>"${GITHUB_ENV}" | |
if: matrix.sanitizer == 'address' | |
- run: | | |
printf 'MSAN_OPTIONS=verbosity=2\n' >>"${GITHUB_ENV}" | |
printf '%s\n' "RUSTFLAGS=${RUSTFLAGS} -Z sanitizer=memory -Z sanitizer-memory-track-origins" >>"${GITHUB_ENV}" | |
printf '%s\n' "RUSTDOCFLAGS=${RUSTDOCFLAGS} -Z sanitizer=memory -Z sanitizer-memory-track-origins" >>"${GITHUB_ENV}" | |
if: matrix.sanitizer == 'memory' | |
- run: | | |
printf '%s\n' "RUSTFLAGS=${RUSTFLAGS} -Z sanitizer=thread" >>"${GITHUB_ENV}" | |
printf '%s\n' "RUSTDOCFLAGS=${RUSTDOCFLAGS} -Z sanitizer=thread" >>"${GITHUB_ENV}" | |
if: matrix.sanitizer == 'thread' | |
- run: tools/test.sh -Z build-std -vv | |
# We test doctest only once with the default build conditions because doctest is slow. Both api-test | |
# and src/tests have extended copies of doctest, so this will not reduce test coverage. | |
# +cmpxchg16b | |
- run: tools/test.sh -Z build-std -vv --tests | |
env: | |
RUSTDOCFLAGS: ${{ env.RUSTDOCFLAGS }} -C target-feature=+cmpxchg16b --cfg portable_atomic_no_outline_atomics | |
RUSTFLAGS: ${{ env.RUSTFLAGS }} -C target-feature=+cmpxchg16b --cfg portable_atomic_no_outline_atomics | |
valgrind: | |
needs: tidy | |
runs-on: ubuntu-latest | |
timeout-minutes: 60 | |
steps: | |
- uses: taiki-e/checkout-action@v1 | |
- uses: taiki-e/github-actions/install-rust@nightly | |
- uses: taiki-e/install-action@cargo-hack | |
# - run: sudo apt-get -o Acquire::Retries=10 -qq update && sudo apt-get -o Acquire::Retries=10 -o Dpkg::Use-Pty=0 install -y --no-install-recommends moreutils | |
- uses: taiki-e/install-action@valgrind | |
- run: tools/test.sh valgrind -vv | |
# +cmpxchg16b | |
- run: tools/test.sh valgrind -vv | |
env: | |
# vmovdqa load/store path has been tested above, disable outline-atomics and test cmpxchg16b load/store path. | |
RUSTDOCFLAGS: ${{ env.RUSTDOCFLAGS }} -C target-feature=+cmpxchg16b --cfg portable_atomic_no_outline_atomics | |
RUSTFLAGS: ${{ env.RUSTFLAGS }} -C target-feature=+cmpxchg16b --cfg portable_atomic_no_outline_atomics | |
codegen: | |
runs-on: ubuntu-latest | |
timeout-minutes: 60 | |
permissions: | |
contents: read | |
pull-requests: write # for gh pr edit --add-assignee | |
repository-projects: read # for gh pr edit --add-assignee | |
steps: | |
- uses: taiki-e/checkout-action@v1 | |
- uses: taiki-e/github-actions/install-rust@nightly | |
- run: tools/no_atomic.sh | |
- run: tools/gen.sh | |
- id: diff | |
run: tools/ci/gen.sh | |
if: github.repository_owner == 'taiki-e' && (github.event_name == 'schedule' || github.event_name == 'push' && github.ref == 'refs/heads/main') | |
- id: create-pull-request | |
uses: peter-evans/create-pull-request@v7 | |
with: | |
title: Update generated code | |
body: | | |
Auto-generated by CI using [create-pull-request](https://github.com/peter-evans/create-pull-request). | |
branch: update-generated-code | |
token: ${{ secrets.CREATE_PR_TOKEN }} | |
if: github.repository_owner == 'taiki-e' && (github.event_name == 'schedule' || github.event_name == 'push' && github.ref == 'refs/heads/main') && steps.diff.outputs.success == 'false' | |
- name: Notify PR author by assigning PR | |
run: gh pr edit --add-assignee taiki-e "${PR_NUMBER:?}" | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
PR_NUMBER: ${{ steps.create-pull-request.outputs.pull-request-number }} | |
if: github.repository_owner == 'taiki-e' && (github.event_name == 'schedule' || github.event_name == 'push' && github.ref == 'refs/heads/main') && steps.diff.outputs.success == 'false' | |
- run: git add -N . && git diff --exit-code |