-
-
Notifications
You must be signed in to change notification settings - Fork 1
178 lines (171 loc) · 6.93 KB
/
ci.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
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/test/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 --noprofile --norc -CeEuxo pipefail {0}
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
cancel-in-progress: true
jobs:
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:
# 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
# We have some platform-independent code, so test them.
test:
uses: taiki-e/github-actions/.github/workflows/test.yml@main
with:
# We don't support x86_64, so use aarch64-unknown-linux-gnu instead.
target: aarch64-unknown-linux-gnu,mips64-unknown-linux-gnuabi64
# NB: sync with env.TEST_FEATURES
features: --features alloc,stdio,fs,args,time
optional-deps: ''
build-args: --depth 2 --exclude-features panic-unwind,backtrace,trap-hlt,openocd-semihosting
no-std: false # covered by no-std job
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:
# We don't support x86_64, so use aarch64-unknown-linux-gnu instead.
clippy-target: aarch64-unknown-linux-gnu,armv7-unknown-linux-gnueabihf,riscv64gc-unknown-linux-gnu,mips64-unknown-linux-gnuabi64
# NB: sync with env.TEST_FEATURES
clippy-args: --features alloc,stdio,fs,args,time
no-std:
strategy:
fail-fast: false
matrix:
include:
- rust: '1.64'
- rust: stable
- rust: beta
# Test pre-8.0 QEMU for mips
- rust: nightly
os: ubuntu-22.04 # QEMU 6.2
- rust: nightly
os: ubuntu-24.04 # QEMU 8.2
# The behavior of semihosting somewhat depends on the behavior of the host system.
- rust: nightly
os: ubuntu-24.04-arm # QEMU 8.2
- 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
- uses: taiki-e/github-actions/install-rust@main
with:
toolchain: ${{ matrix.rust }}
- uses: taiki-e/install-action@espup
if: matrix.rust == 'stable' && (startsWith(matrix.os, 'ubuntu') || matrix.os == '')
- 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+=(
qemu-system-mips
)
fi
if [[ "${{ matrix.rust }}" == "1.64" ]]; then
# pre-17 LLD doesn't support big-endian arm
apt_packages+=(
binutils-arm-none-eabi
)
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 and mips:
# https://packages.ubuntu.com/en/jammy/all/qemu-system-data/filelist
opensbi_version=1.6 # 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"
retry git clone --depth 1 --filter=tree:0 --no-checkout https://github.com/qemu/qemu.git
cd -- qemu
git sparse-checkout init
printf '!/*\n' >>.git/info/sparse-checkout
printf '/pc-bios/\n' >>.git/info/sparse-checkout
git checkout
sudo mv -- pc-bios/{efi-pcnet.rom,vgabios-cirrus.bin} /usr/share/qemu/
cd -- ..
rm -rf -- qemu
# https://github.com/taiki-e/dockerfiles/pkgs/container/qemu-user
retry 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.1
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
if [[ "${{ matrix.rust }}" == "stable" ]]; then
retry espup install --targets esp32
fi
qemu-system-arm --version
qemu-arm --version
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
if: startsWith(matrix.os, 'ubuntu') || matrix.os == ''
- run: |
brew install qemu
qemu-system-arm --version
if: startsWith(matrix.os, 'macos')
- run: |
C:/msys64/usr/bin/pacman -S --noconfirm mingw-w64-ucrt-x86_64-qemu
printf '%s\n' 'C:\msys64\ucrt64\bin' >>"${GITHUB_PATH}"
C:/msys64/ucrt64/bin/qemu-system-arm --version
if: startsWith(matrix.os, 'windows')
- 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: matrix.rust == 'stable' && (startsWith(matrix.os, 'ubuntu') || matrix.os == '')