summaryrefslogtreecommitdiff
path: root/.cirrus.yml
blob: 1ffe4611f4d42403f0eb1ca2007930eb28ea5435 (plain)
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
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
cargo_cache:
  folder: $CARGO_HOME/registry
  fingerprint_script: cat Cargo.lock || echo ""

env:
  # Build by default; don't just check
  BUILD: build
  RUSTFLAGS: -D warnings
  RUSTDOCFLAGS: -D warnings
  TOOL: cargo
  # The MSRV
  TOOLCHAIN: 1.63.0
  ZFLAGS:

# Tests that don't require executing the build binaries
build: &BUILD
  build_script:
    - . $HOME/.cargo/env || true
    - $TOOL +$TOOLCHAIN -Vv
    - rustc +$TOOLCHAIN -Vv
    - $TOOL +$TOOLCHAIN $BUILD $ZFLAGS --target $TARGET --all-targets
    - $TOOL +$TOOLCHAIN doc $ZFLAGS --no-deps --target $TARGET
    - $TOOL +$TOOLCHAIN clippy $ZFLAGS --target $TARGET --all-targets -- -D warnings
    - if [ -z "$NOHACK" ]; then mkdir -p $HOME/.cargo/bin; export PATH=$HOME/.cargo/bin:$PATH; fi
    - if [ -z "$NOHACK" ]; then curl -LsSf https://github.com/taiki-e/cargo-hack/releases/latest/download/cargo-hack-${HOST:-$TARGET}.tar.gz | tar xzf - -C ~/.cargo/bin; fi
    - if [ -z "$NOHACK" ]; then $TOOL +$TOOLCHAIN hack $ZFLAGS check --target $TARGET --each-feature; fi

# Tests that do require executing the binaries
test: &TEST
  << : *BUILD
  test_script:
    - . $HOME/.cargo/env || true
    - $TOOL +$TOOLCHAIN test --target $TARGET

# Test FreeBSD in a full VM.  Test the i686 target too, in the
# same VM.  The binary will be built in 32-bit mode, but will execute on a
# 64-bit kernel and in a 64-bit environment.  Our tests don't execute any of
# the system's binaries, so the environment shouldn't matter.
task:
  env:
    TARGET: x86_64-unknown-freebsd
  matrix:
    - name: FreeBSD 12 amd64 & i686
      freebsd_instance:
        image: freebsd-12-4-release-amd64
    - name: FreeBSD 14 amd64 & i686
      freebsd_instance:
        image_family: freebsd-14-0-snap
      # Enable tests that would fail on FreeBSD 12
      RUSTFLAGS: --cfg fbsd14 -D warnings
      RUSTDOCFLAGS: --cfg fbsd14
  setup_script:
    - kldload mqueuefs
    - fetch https://sh.rustup.rs -o rustup.sh
    - sh rustup.sh -y --profile=minimal --default-toolchain $TOOLCHAIN
    - . $HOME/.cargo/env
    - rustup target add i686-unknown-freebsd
    - rustup component add --toolchain $TOOLCHAIN clippy
  << : *TEST
  i386_test_script:
    - . $HOME/.cargo/env
    - cargo build --target i686-unknown-freebsd
    - cargo doc --no-deps --target i686-unknown-freebsd
    - cargo test --target i686-unknown-freebsd
  i386_feature_script:
    - . $HOME/.cargo/env
    - if [ -z "$NOHACK" ]; then cargo hack check --each-feature --target i686-unknown-freebsd; fi
  before_cache_script: rm -rf $CARGO_HOME/registry/index

# Test macOS aarch64 in a full VM
task:
  name: macOS aarch64
  env:
    TARGET: aarch64-apple-darwin
  macos_instance:
    image: ghcr.io/cirruslabs/macos-ventura-base:latest
  setup_script:
    - curl --proto '=https' --tlsv1.2 -sSf -o rustup.sh https://sh.rustup.rs
    - sh rustup.sh -y --profile=minimal --default-toolchain $TOOLCHAIN
    - . $HOME/.cargo/env
    - rustup component add --toolchain $TOOLCHAIN clippy
  << : *TEST
  before_cache_script: rm -rf $CARGO_HOME/registry/index

# Use cross for QEMU-based testing
# cross needs to execute Docker, so we must use Cirrus's Docker Builder task.
task:
  env:
    RUST_TEST_THREADS: 1            # QEMU works best with 1 thread
    HOME: /tmp/home
    HOST: x86_64-unknown-linux-gnu
    PATH: $HOME/.cargo/bin:$PATH
    RUSTFLAGS: --cfg qemu -D warnings
    TOOL: cross
  matrix:
    - name: Linux arm gnueabi
      env:
        TARGET: arm-unknown-linux-gnueabi
    - name: Linux armv7 gnueabihf
      env:
        TARGET: armv7-unknown-linux-gnueabihf
    - name: Linux i686
      env:
        TARGET: i686-unknown-linux-gnu
    - name: Linux i686 musl
      env:
        TARGET: i686-unknown-linux-musl
    - name: Linux MIPS
      env:
        TARGET: mips-unknown-linux-gnu
    - name: Linux MIPS64
      env:
        TARGET: mips64-unknown-linux-gnuabi64
    - name: Linux MIPS64 el
      env:
        TARGET: mips64el-unknown-linux-gnuabi64
    - name: Linux mipsel
      env:
        TARGET: mipsel-unknown-linux-gnu
    - name: Linux powerpc64le
      env:
        TARGET: powerpc64le-unknown-linux-gnu
  compute_engine_instance:
    image_project: cirrus-images
    image: family/docker-builder
    platform: linux
    cpu: 1                          # Since QEMU will only use 1 thread
    memory: 4G
  setup_script:
    - mkdir /tmp/home
    - curl --proto '=https' --tlsv1.2 -sSf -o rustup.sh https://sh.rustup.rs
    - sh rustup.sh -y --profile=minimal --default-toolchain $TOOLCHAIN
    - . $HOME/.cargo/env
    - cargo install cross --version 0.2.1 # cross 0.2.2 bumped the MSRV to 1.58.1
  << : *TEST
  before_cache_script: rm -rf $CARGO_HOME/registry/index

# Tasks for Linux native builds
task:
  matrix:
    - name: Linux aarch64
      arm_container:
        image: rust:1.63.0
      env:
        TARGET: aarch64-unknown-linux-gnu
    - name: Linux x86_64
      container:
        image: rust:1.63.0
      env:
        TARGET: x86_64-unknown-linux-gnu
    - name: Linux x86_64 musl
      container:
        image: rust:1.63.0
      env:
        TARGET: x86_64-unknown-linux-musl
  setup_script:
    - rustup target add $TARGET
    - rustup component add clippy
  << : *TEST
  before_cache_script: rm -rf $CARGO_HOME/registry/index

task:
  name: Rust Stable
  container:
    image: rust:latest
  env:
    TARGET: x86_64-unknown-linux-gnu
    TOOLCHAIN:
  setup_script:
    - rustup target add $TARGET
    - rustup component add clippy
  << : *TEST
  before_cache_script: rm -rf $CARGO_HOME/registry/index

# Tasks for cross-compiling, but no testing
task:
  container:
    image: rust:1.63.0
  env:
    BUILD: check
    HOST: x86_64-unknown-linux-gnu
  matrix:
    # Cross claims to support Android, but when it tries to run Nix's tests it
    # reports undefined symbol references.
    - name: Android aarch64
      env:
        TARGET: aarch64-linux-android
    - name: Android arm
      env:
        TARGET: arm-linux-androideabi
    - name: Android armv7
      env:
        TARGET: armv7-linux-androideabi
    - name: Android i686
      env:
        TARGET: i686-linux-android
    - name: Android x86_64
      env:
        TARGET: x86_64-linux-android
    - name: Linux arm-musleabi
      env:
        TARGET: arm-unknown-linux-musleabi
    - name: Fuchsia x86_64
      env:
        TARGET: x86_64-fuchsia
    - name: Illumos
      env:
        TARGET: x86_64-unknown-illumos
    # Cross claims to support running tests on iOS, but it actually doesn't.
    # https://github.com/rust-embedded/cross/issues/535
    - name: iOS aarch64
      env:
        # cargo hack tries to invoke the iphonesimulator SDK for iOS
        NOHACK: 1
        TARGET: aarch64-apple-ios
    - name: iOS x86_64
      env:
        # cargo hack tries to invoke the iphonesimulator SDK for iOS
        NOHACK: 1
        TARGET: x86_64-apple-ios
    # Cross testing on powerpc fails with "undefined reference to renameat2".
    # Perhaps cross is using too-old a version?
    - name: Linux powerpc
      env:
        TARGET: powerpc-unknown-linux-gnu
    # Cross claims to support Linux powerpc64, but it really doesn't.
    # https://github.com/rust-embedded/cross/issues/441
    - name: Linux powerpc64
      env:
        TARGET: powerpc64-unknown-linux-gnu
    - name: Linux s390x
      env:
        TARGET: s390x-unknown-linux-gnu
    - name: Linux x32
      env:
        TARGET: x86_64-unknown-linux-gnux32
    - name: macOS x86_64
      env:
        TARGET: x86_64-apple-darwin
    - name: NetBSD x86_64
      env:
        TARGET: x86_64-unknown-netbsd
  setup_script:
    - rustup target add $TARGET
    - rustup toolchain install $TOOLCHAIN --profile minimal --target $TARGET
    - rustup component add --toolchain $TOOLCHAIN clippy
  << : *BUILD
  before_cache_script: rm -rf $CARGO_HOME/registry/index

task:
  container:
    image: rust:1.63.0
  env:
    BUILD: check
  name: Redox x86_64
  env:
    HOST: x86_64-unknown-linux-gnu
    TARGET: x86_64-unknown-redox
    # Redox's MSRV policy is unclear.  Until they define it, use nightly.
    TOOLCHAIN: nightly
  setup_script:
    - rustup target add $TARGET
    - rustup toolchain install $TOOLCHAIN --profile minimal --target $TARGET
    - rustup component add --toolchain $TOOLCHAIN clippy
  << : *BUILD
  before_cache_script: rm -rf $CARGO_HOME/registry/index

# Rust Tier 3 targets can't use Rustup
task:
  container:
    image: rustlang/rust:nightly
  env:
    BUILD: check
    HOST: x86_64-unknown-linux-gnu
    TOOLCHAIN: nightly
    ZFLAGS: -Zbuild-std
  matrix:
    - name: DragonFly BSD x86_64
      env:
        TARGET: x86_64-unknown-dragonfly
    - name: OpenBSD x86_64
      env:
        TARGET: x86_64-unknown-openbsd
    - name: Linux armv7 uclibceabihf
      env:
        TARGET: armv7-unknown-linux-uclibceabihf
    - name: Haiku x86_64
      env:
        TARGET: x86_64-unknown-haiku
  setup_script:
    - rustup component add rust-src
  << : *BUILD
  before_cache_script: rm -rf $CARGO_HOME/registry/index

# Test that we can build with the lowest version of all dependencies.
# "cargo test" doesn't work because some of our dev-dependencies, like
# rand, can't build with their own minimal dependencies.
task:
  name: Minver
  env:
    HOST: x86_64-unknown-linux-gnu
    TOOLCHAIN: nightly
  container:
    image: rustlang/rust:nightly
  setup_script:
    - cargo update -Zminimal-versions
  check_script:
    - cargo check
  before_cache_script: rm -rf $CARGO_HOME/registry/index

# Tasks that checks if the code is formatted right using `cargo fmt` tool
task:
  name: Rust Formatter
  container:
    image: rust:latest
  setup_script: rustup +$TOOLCHAIN component add rustfmt
  test_script: $TOOL +$TOOLCHAIN fmt --all -- --check **/*.rs