CI #724
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 | |
RUSTDOCFLAGS: -D warnings | |
RUSTFLAGS: -D warnings | |
RUSTUP_MAX_RETRIES: 10 | |
SEMIHOSTING_DENY_WARNINGS: 1 | |
# NB: sync with miri/msrv/tidy jobs' --features option and package.metadata.docs.rs.features field in Cargo.toml | |
TEST_FEATURES: alloc,stdio,fs,args,time | |
defaults: | |
run: | |
shell: bash | |
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 | |
miri: | |
uses: taiki-e/github-actions/.github/workflows/miri.yml@main | |
with: | |
# We don't support x86_64, so use aarch64-unknown-linux-gnu instead. | |
target: aarch64-unknown-linux-gnu | |
# NB: sync with env.TEST_FEATURES | |
args: --features alloc,stdio,fs,args,time | |
msrv: | |
uses: taiki-e/github-actions/.github/workflows/msrv.yml@main | |
with: | |
event_name: ${{ github.event_name }} | |
# We don't support x86_64, so use aarch64-unknown-linux-gnu instead. | |
target: aarch64-unknown-linux-gnu | |
# NB: sync with env.TEST_FEATURES | |
args: --features alloc,stdio,fs,args,time | |
tidy: | |
uses: taiki-e/github-actions/.github/workflows/tidy.yml@main | |
with: | |
# We don't support x86_64, so use aarch64-unknown-linux-gnu instead. | |
target: aarch64-unknown-linux-gnu #,mips64-unknown-linux-muslabi64 # TODO: there is no tier 2 MIPS targets | |
# NB: sync with env.TEST_FEATURES | |
args: --features alloc,stdio,fs,args,time | |
# We have some platform-independent code, so test them. | |
test: | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
# We don't support x86_64, so use aarch64-unknown-linux-gnu instead. | |
- rust: nightly | |
target: aarch64-unknown-linux-gnu | |
- rust: nightly | |
target: mips64-unknown-linux-gnuabi64 | |
runs-on: ubuntu-latest | |
timeout-minutes: 60 | |
steps: | |
- uses: taiki-e/checkout-action@v1 | |
- name: Install Rust | |
run: rustup toolchain add ${{ matrix.rust }} --no-self-update && rustup default ${{ matrix.rust }} | |
- run: rustup toolchain add nightly --no-self-update | |
- 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 }} | |
- run: cargo test --workspace --features $TEST_FEATURES --target ${{ matrix.target }} $DOCTEST_XCOMPILE $BUILD_STD | |
- run: cargo test --workspace --features $TEST_FEATURES --release --target ${{ matrix.target }} $DOCTEST_XCOMPILE $BUILD_STD | |
- run: cargo careful test --workspace --features $TEST_FEATURES --target ${{ matrix.target }} $DOCTEST_XCOMPILE $BUILD_STD | |
if: startsWith(matrix.rust, 'nightly') | |
- run: cargo hack build --workspace --no-private --feature-powerset --depth 2 --optional-deps=portable-atomic --exclude-features panic-unwind,backtrace,trap-hlt,openocd-semihosting --target ${{ matrix.target }} $BUILD_STD | |
- run: cargo minimal-versions build --workspace --no-private --detach-path-deps=skip-exact --features $TEST_FEATURES --target ${{ matrix.target }} $BUILD_STD | |
- run: cargo minimal-versions build --workspace --no-private --detach-path-deps=skip-exact --features $TEST_FEATURES --target ${{ matrix.target }} $BUILD_STD --direct | |
no-std: | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- rust: '1.64' | |
- rust: stable | |
- rust: beta | |
- rust: nightly | |
# The behavior of semihosting somewhat depends on the behavior of the host system. | |
- rust: nightly | |
os: macos-latest | |
- rust: nightly | |
os: windows-latest | |
runs-on: ${{ matrix.os || 'ubuntu-latest' }} | |
timeout-minutes: 60 | |
steps: | |
- uses: taiki-e/checkout-action@v1 | |
- run: | | |
set -eEuxo pipefail | |
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 \ | |
qemu-system-arm \ | |
qemu-system-mips \ | |
qemu-system-misc | |
if [[ "${{ matrix.rust }}" == "1.64" ]]; then | |
# pre-17 LLD doesn't support big-endian arm | |
sudo apt-get -o Acquire::Retries=10 -o Dpkg::Use-Pty=0 install -y --no-install-recommends \ | |
binutils-arm-none-eabi | |
fi | |
# APT's qemu package doesn't provide firmware for riscv32 and mips: | |
# https://packages.ubuntu.com/en/jammy/all/qemu-system-data/filelist | |
OPENSBI_VERSION=1.4 # https://github.com/riscv-software-src/opensbi/releases | |
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" | |
git clone --depth 1 --filter=tree:0 --no-checkout https://github.com/qemu/qemu.git | |
cd qemu | |
git sparse-checkout init | |
echo '!/*' >> .git/info/sparse-checkout | |
echo '/pc-bios/' >> .git/info/sparse-checkout | |
git checkout | |
sudo mv pc-bios/{efi-pcnet.rom,vgabios-cirrus.bin} /usr/share/qemu/ | |
cd .. | |
rm -rf qemu | |
# TODO: retry on failure | |
# https://github.com/taiki-e/dockerfiles/pkgs/container/qemu-user | |
docker create --name qemu-user ghcr.io/taiki-e/qemu-user:8.1 # TODO: "qemu-armeb: Error mapping file: Operation not permitted" error in 8.2/9.0 | |
mkdir -p qemu-user | |
docker cp qemu-user:/usr/bin qemu-user/bin | |
docker rm -f qemu-user >/dev/null | |
sudo mv qemu-user/bin/qemu-* /usr/bin/ | |
rm -rf ./qemu-user | |
qemu-system-arm --version | |
qemu-arm --version | |
if: startsWith(matrix.os, 'ubuntu') || matrix.os == '' | |
- run: | | |
set -eEuxo pipefail | |
brew install qemu | |
qemu-system-arm --version | |
if: startsWith(matrix.os, 'macos') | |
- run: | | |
set -eEuxo pipefail | |
C:/msys64/usr/bin/pacman -S --noconfirm mingw-w64-ucrt-x86_64-qemu | |
echo "C:\msys64\ucrt64\bin" >>"${GITHUB_PATH}" | |
C:/msys64/ucrt64/bin/qemu-system-arm --version | |
if: startsWith(matrix.os, 'windows') | |
- name: Install Rust | |
run: rustup toolchain add ${{ matrix.rust }} --no-self-update && rustup default ${{ matrix.rust }} | |
- uses: taiki-e/install-action@espup | |
if: startsWith(matrix.rust, 'nightly') && (startsWith(matrix.os, 'ubuntu') || matrix.os == '') | |
- run: espup install --targets esp32 | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
if: startsWith(matrix.rust, 'nightly') && (startsWith(matrix.os, 'ubuntu') || matrix.os == '') | |
- run: tools/no-std.sh | |
- run: TEST_RUNNER=qemu-user tools/no-std.sh | |
if: startsWith(matrix.os, 'ubuntu') || matrix.os == '' | |
- run: cargo +esp build --target xtensa-esp32-none-elf -Z build-std=core,alloc --features $TEST_FEATURES,openocd-semihosting | |
if: startsWith(matrix.rust, 'nightly') && (startsWith(matrix.os, 'ubuntu') || matrix.os == '') |