summaryrefslogtreecommitdiff
path: root/.cirrus.yml
blob: bc8f21de5434d2935df000b32e6fbad1599c74d2 (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
cargo_cache:
  folder: $CARGO_HOME/registry
  fingerprint_script: cat Cargo.lock || echo ""

# 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:
  name: FreeBSD amd64 & i686
  freebsd_instance:
    image: freebsd-11-4-release-amd64
  setup_script:
    - fetch https://sh.rustup.rs -o rustup.sh
    - sh rustup.sh -y --profile=minimal --default-toolchain 1.46.0
    - $HOME/.cargo/bin/rustup target add i686-unknown-freebsd
  amd64_test_script:
    - . $HOME/.cargo/env
    - cargo test
  i386_test_script:
    - . $HOME/.cargo/env
    - cargo test --target i686-unknown-freebsd
  before_cache_script: rm -rf $CARGO_HOME/registry/index

# Test OSX and iOS in a full VM
task:
  matrix:
    - name: OSX x86_64
      env:
        TARGET: x86_64-apple-darwin
  osx_instance:
    image: catalina-xcode
  setup_script:
    - curl --proto '=https' --tlsv1.2 -sSf -o rustup.sh https://sh.rustup.rs
    - sh rustup.sh -y --profile=minimal --default-toolchain 1.46.0
    - . $HOME/.cargo/env
    - cargo install cross
  script:
    - . $HOME/.cargo/env
    - cross build --target $TARGET
    - cross test --target $TARGET
  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
    PATH: $HOME/.cargo/bin:$PATH
    RUSTFLAGS: --cfg qemu
  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 1.46.0
    - . $HOME/.cargo/env
    - cargo install cross
  script:
    - . $HOME/.cargo/env || true
    - cross build --target $TARGET
    - cross test --target $TARGET
  before_cache_script: rm -rf $CARGO_HOME/registry/index

# Tasks for Linux native builds
task:
  matrix:
    - name: Rust Stable
      container:
        image: rust:latest
      env:
        TARGET: x86_64-unknown-linux-gnu
    - name: Linux aarch64
      arm_container:
        image: rust:1.46
      env:
        RUSTFLAGS: --cfg graviton
        TARGET: aarch64-unknown-linux-gnu
    - name: Linux x86_64
      container:
        image: rust:1.46
      env:
        TARGET: x86_64-unknown-linux-gnu
    - name: Linux x86_64 musl
      container:
        image: rust:1.46
      env:
        TARGET: x86_64-unknown-linux-musl
  setup_script:
    - rustup target add $TARGET
    - uname -a
  script:
    - cargo build --target $TARGET --all-targets
    - cargo test --target $TARGET
  before_cache_script: rm -rf $CARGO_HOME/registry/index

# Tasks for cross-compiling, but no testing
task:
  container:
    image: rust:1.46
  env:
    TOOLCHAIN: 1.46.0
  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
        # illumos toolchain isn't available via rustup until 1.50
        TOOLCHAIN: 1.50.0
      container:
        image: rust:1.50
    # 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:
        TARGET: aarch64-apple-ios
        # Rustup only supports cross-building from arbitrary hosts for iOS at
        # 1.49.0 and above.  Below that it's possible to cross-build from an OSX
        # host, but OSX VMs
        # are more expensive than Linux VMs.
        TOOLCHAIN: 1.49.0
    - name: iOS x86_64
      env:
        TARGET: x86_64-apple-ios
        TOOLCHAIN: 1.49.0
    # 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: NetBSD x86_64
      env:
        TARGET: x86_64-unknown-netbsd
    - name: Redox x86_64
      env:
        TARGET: x86_64-unknown-redox
        # Redox requires a nightly compiler.
        # If stuff breaks, change nightly to the date in the toolchain_*
        # directory at https://static.redox-os.org
        TOOLCHAIN: nightly-2020-08-04
  setup_script:
    - rustup target add $TARGET
    - rustup toolchain install $TOOLCHAIN --profile minimal --target $TARGET
  script:
    - cargo +$TOOLCHAIN check --target $TARGET
    - cargo +$TOOLCHAIN check --all-targets --target $TARGET
  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
  container:
    image: rustlang/rust:nightly
  setup_script:
    - cargo update -Zminimal-versions
  script:
    - cargo check
  before_cache_script: rm -rf $CARGO_HOME/registry/index