13
13
builder-target :
14
14
required : true
15
15
type : string
16
+ target-vendor :
17
+ required : true
18
+ type : string
19
+ target-os :
20
+ required : true
21
+ type : string
22
+ rust-toolchain-abi :
23
+ required : true
24
+ type : string
16
25
distro-image :
17
26
required : true
18
27
type : string
36
45
RUSTFLAGS : " -Dwarnings"
37
46
SRC_DIR : ${{ github.workspace }}/rawspeed.rs
38
47
CODECOV_TOKEN_EXISTS : ${{ secrets.CODECOV_TOKEN != '' }}
48
+ CODE_COVERAGE_SUPPORTED : ${{ inputs.flavor != 'RustFmt' && inputs.flavor != 'doc' && inputs.target-os != 'windows' }}
39
49
40
50
jobs :
41
51
linux :
47
57
outputs :
48
58
rustfmt-artifact-url : ${{ steps.rustfmt-upload.outputs.artifact-url }}
49
59
steps :
50
- - name : Configure APT
51
- timeout-minutes : 1
52
- run : |
53
- set -xe
54
- tee /etc/dpkg/dpkg.cfg.d/force-unsafe-io > /dev/null <<EOT
55
- force-unsafe-io
56
- EOT
57
- tee /etc/apt/apt.conf.d/tmpfs > /dev/null <<EOT
58
- Dir::Cache::Archives "/tmp/apt/archives";
59
- APT::ExtractTemplates::TempDir "/tmp/apt/temp";
60
- EOT
61
- mkdir -p /tmp/apt/archives
62
- tee /etc/apt/apt.conf.d/80retry > /dev/null <<EOT
63
- Acquire::Retries "10";
64
- EOT
65
- tee /etc/apt/apt.conf.d/80recommends > /dev/null <<EOT
66
- APT::Install-Recommends "false";
67
- EOT
68
- tee /etc/apt/apt.conf.d/80suggests > /dev/null <<EOT
69
- APT::Install-Suggests "false";
70
- EOT
71
- tee /etc/apt/apt.conf.d/80forceyes > /dev/null <<EOT
72
- APT::Get::Assume-Yes "true";
73
- EOT
74
- tee /etc/apt/apt.conf.d/80fixmissing > /dev/null <<EOT
75
- APT::Get::Fix-Missing "true";
76
- EOT
77
- rm -rf /etc/apt/sources.list*
78
- if [ "${{ inputs.distro-image }}" = "debian:trixie-slim" ]; then
79
- tee /etc/apt/sources.list > /dev/null <<EOT
80
- deb http://debian-archive.trafficmanager.net/debian trixie main
81
- deb http://debian-archive.trafficmanager.net/debian trixie-updates main
82
- deb http://debian-archive.trafficmanager.net/debian-security trixie-security main
83
- deb http://debian-archive.trafficmanager.net/debian trixie-backports main
84
- EOT
85
- else
86
- exit 1
87
- fi
88
- - name : Update base packages
89
- timeout-minutes : 1
90
- run : |
91
- set -xe
92
- rm -rf /var/lib/apt/lists/*
93
- apt update
94
- apt install eatmydata
95
- eatmydata apt upgrade
96
60
- name : Configure necessary env variables
97
61
timeout-minutes : 1
98
62
run : |
@@ -105,14 +69,16 @@ jobs:
105
69
|| [ "${{ inputs.builder-target }}" = "s390x" ] \
106
70
|| [ "${{ inputs.builder-target }}" = "armv7" ];
107
71
then
108
- RUST_TARGET =${{ inputs.builder-target }}
72
+ RUST_TARGET_ARCH =${{ inputs.builder-target }}
109
73
elif [ "${{ inputs.builder-target }}" = "armv6" ]; then
110
- RUST_TARGET =arm
74
+ RUST_TARGET_ARCH =arm
111
75
elif [ "${{ inputs.builder-target }}" = "riscv64" ]; then
112
- RUST_TARGET =riscv64gc
76
+ RUST_TARGET_ARCH =riscv64gc
113
77
else
114
78
exit 1
115
79
fi
80
+ echo "RUST_TARGET_ARCH=$(echo ${RUST_TARGET_ARCH})" >> $GITHUB_ENV
81
+ RUST_TARGET=${RUST_TARGET_ARCH}-${{ inputs.target-vendor }}-${{ inputs.target-os }}-${{ inputs.rust-toolchain-abi }}
116
82
echo "RUST_TARGET=$(echo ${RUST_TARGET})" >> $GITHUB_ENV
117
83
if [ "${{ inputs.builder-target }}" = "i686" ]; then
118
84
LIBC6_ARCH=i386
@@ -136,14 +102,6 @@ jobs:
136
102
GCC_ARCH=${{ inputs.builder-target }}
137
103
fi
138
104
echo "GCC_ARCH=$(echo ${GCC_ARCH})" >> $GITHUB_ENV
139
- if [ "${{ inputs.builder-target }}" = "armv6" ]; then
140
- ABI=gnueabi
141
- elif [ "${{ inputs.builder-target }}" = "armv7" ]; then
142
- ABI=gnueabihf
143
- else
144
- ABI=gnu
145
- fi
146
- echo "ABI=$(echo ${ABI})" >> $GITHUB_ENV
147
105
if [ "${{ inputs.builder-target }}" = "s390x" ] \
148
106
|| [ "${{ inputs.builder-target }}" = "powerpc64" ];
149
107
then
@@ -152,30 +110,69 @@ jobs:
152
110
ENDIANNESS=little
153
111
fi
154
112
echo "ENDIANNESS=$(echo ${ENDIANNESS})" >> $GITHUB_ENV
155
- - name : Install necessary packages
156
- timeout-minutes : 2
113
+ echo HOME=/root >> "$GITHUB_ENV"
114
+ - name : Configure APT
115
+ timeout-minutes : 1
157
116
run : |
158
117
set -xe
159
- eatmydata apt install \
118
+ tee /etc/dpkg/dpkg.cfg.d/force-unsafe-io > /dev/null <<EOT
119
+ force-unsafe-io
120
+ EOT
121
+ tee /etc/apt/apt.conf.d/tmpfs > /dev/null <<EOT
122
+ Dir::Cache::Archives "/tmp/apt/archives";
123
+ APT::ExtractTemplates::TempDir "/tmp/apt/temp";
124
+ EOT
125
+ mkdir -p /tmp/apt/archives
126
+ tee /etc/apt/apt.conf.d/80retry > /dev/null <<EOT
127
+ Acquire::Retries "10";
128
+ EOT
129
+ tee /etc/apt/apt.conf.d/80recommends > /dev/null <<EOT
130
+ APT::Install-Recommends "false";
131
+ EOT
132
+ tee /etc/apt/apt.conf.d/80suggests > /dev/null <<EOT
133
+ APT::Install-Suggests "false";
134
+ EOT
135
+ tee /etc/apt/apt.conf.d/80forceyes > /dev/null <<EOT
136
+ APT::Get::Assume-Yes "true";
137
+ EOT
138
+ tee /etc/apt/apt.conf.d/80fixmissing > /dev/null <<EOT
139
+ APT::Get::Fix-Missing "true";
140
+ EOT
141
+ rm -rf /etc/apt/sources.list*
142
+ if [ "${{ inputs.distro-image }}" = "debian:trixie-slim" ]; then
143
+ tee /etc/apt/sources.list > /dev/null <<EOT
144
+ deb http://deb.debian.org/debian trixie main
145
+ deb http://deb.debian.org/debian trixie-updates main
146
+ deb http://deb.debian.org/debian-security trixie-security main
147
+ deb http://deb.debian.org/debian trixie-backports main
148
+ EOT
149
+ else
150
+ exit 1
151
+ fi
152
+ - name : Install eatmydata
153
+ timeout-minutes : 1
154
+ run : |
155
+ set -xe
156
+ rm -rf /var/lib/apt/lists/*
157
+ apt update
158
+ apt install eatmydata
159
+ rm -rf /var/lib/apt/lists/*
160
+ - name : Configure for native compilation
161
+ timeout-minutes : 1
162
+ run : |
163
+ set -xe
164
+ PACKAGES="${{ env.PACKAGES }}"
165
+ PACKAGES="${PACKAGES} \
160
166
ca-certificates \
161
167
curl \
162
168
git \
163
169
gpg \
164
- ;
165
- eatmydata curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- --default-toolchain none -y
166
- . "$HOME/.cargo/env"
167
- eatmydata rustup toolchain install ${{ inputs.rust-toolchain-name }} --allow-downgrade --profile minimal
168
- eatmydata rustup default ${{ inputs.rust-toolchain-name }}
169
- if [ "${{ inputs.flavor }}" = "RustFmt" ]; then
170
- eatmydata rustup component add rustfmt
171
- elif [ "${{ inputs.flavor }}" = "doc" ]; then
172
- /bin/true
173
- elif [ "${{ inputs.flavor }}" = "dev" ] || [ "${{ inputs.flavor }}" = "release" ]; then
174
- eatmydata rustup component add clippy
175
- eatmydata apt install \
170
+ "
171
+ if [ "${{ inputs.flavor }}" = "dev" ] || [ "${{ inputs.flavor }}" = "release" ]; then
172
+ PACKAGES="${PACKAGES} \
176
173
clang-${{ inputs.distro-LLVM }} \
177
174
lld-${{ inputs.distro-LLVM }} \
178
- ;
175
+ "
179
176
dpkg-divert --add --rename --divert /usr/bin/cc.original /usr/bin/cc
180
177
dpkg-divert --add --rename --divert /usr/bin/gcc.original /usr/bin/gcc
181
178
dpkg-divert --add --rename --divert /usr/bin/g++.original /usr/bin/g++
@@ -188,38 +185,97 @@ jobs:
188
185
ln -s /usr/local/bin/clang++ /usr/local/bin/c++
189
186
ln -s /usr/local/bin/clang++ /usr/local/bin/g++
190
187
ln -s /usr/local/bin/ld.lld /usr/local/bin/ld
191
- else
192
- exit 1
193
188
fi
194
- - name : Install necessary packages for cross-compilation
195
- timeout-minutes : 2
196
- if : (inputs.flavor == 'dev' || inputs.flavor == 'release') && inputs.builder-host != inputs.builder-target
189
+ echo "PACKAGES=$(echo ${PACKAGES})" >> $GITHUB_ENV
190
+ - name : Configure for same-os cross-arch compilation
191
+ timeout-minutes : 1
192
+ if : (inputs.flavor == 'dev' || inputs.flavor == 'release') && inputs.target-os == 'linux' && inputs.builder-host != inputs.builder-target
197
193
run : |
198
194
set -xe
199
- . "$HOME/.cargo/env"
200
-
201
- eatmydata apt install \
202
- gcc-${{ env.GCC_ARCH }}-linux-${{ env.ABI }} \
195
+ PACKAGES="${{ env.PACKAGES }}"
196
+ PACKAGES="${PACKAGES} \
197
+ gcc-${{ env.GCC_ARCH }}-${{ inputs.target-os }}-${{ inputs.rust-toolchain-abi }} \
203
198
libc6-dev-${{ env.LIBC6_ARCH }}-cross \
204
199
qemu-user \
205
200
qemu-user-binfmt \
206
- ;
207
- ln -s /usr/local/bin/clang /usr/local/bin/${{ inputs.builder-target }}-unknown-linux-${{ env.ABI }}-clang
208
- ln -s /usr/local/bin/clang++ /usr/local/bin/${{ inputs.builder-target }}-unknown-linux-${{ env.ABI }}-clang++
209
- ln -s /usr/local/bin/ld /usr/local/bin/${{ inputs.builder-target }}-unknown-linux-${{ env.ABI }}-ld
210
- rustup target add ${{ env.RUST_TARGET }}-unknown-linux-${{ env.ABI }}
211
- LINKER="${{ inputs.builder-target }}-unknown-linux-${{ env.ABI }}-clang"
201
+ "
202
+ ln -s /usr/local/bin/clang /usr/local/bin/${{ inputs.builder-target }}-${{ inputs.target-vendor }}-${{ inputs.target-os }}-${{ inputs.rust-toolchain-abi }}-clang
203
+ ln -s /usr/local/bin/clang++ /usr/local/bin/${{ inputs.builder-target }}-${{ inputs.target-vendor }}-${{ inputs.target-os }}-${{ inputs.rust-toolchain-abi }}-clang++
204
+ ln -s /usr/local/bin/ld /usr/local/bin/${{ inputs.builder-target }}-${{ inputs.target-vendor }}-${{ inputs.target-os }}-${{ inputs.rust-toolchain-abi }}-ld
205
+ LINKER="${{ inputs.builder-target }}-${{ inputs.target-vendor }}-${{ inputs.target-os }}-${{ inputs.rust-toolchain-abi }}-clang"
212
206
if [ "${{ inputs.builder-target }}" = "powerpc64" ]; then
213
207
# LLD/clang does not support powerpc64 ELFv1 ABI
214
- LINKER="${{ env.GCC_ARCH }}-linux- ${{ env.ABI }}-gcc"
208
+ LINKER="${{ env.GCC_ARCH }}-${{ inputs.target-os }}- ${{ inputs.rust-toolchain-abi }}-gcc"
215
209
fi
216
- tee -a "$HOME/.cargo/config.toml" > /dev/null <<EOT
217
- [target.${{ env.RUST_TARGET }}-unknown-linux-${{ env.ABI }} ]
210
+ mkdir -p "$HOME/.cargo" && tee -a "$HOME/.cargo/config.toml" > /dev/null <<EOT
211
+ [target.${{ env.RUST_TARGET }}]
218
212
linker = "${LINKER}"
219
- runner = "qemu-${{ env.LIBC6_ARCH }} -L /usr/${{ env.GCC_ARCH }}-linux-${{ env.ABI }}"
220
213
EOT
221
- - name : Install necessary packages for code coverage
222
- if : inputs.flavor != 'RustFmt' && inputs.flavor != 'doc' && (inputs.builder-host == inputs.builder-target || (env.ENDIANNESS == 'big' && inputs.builder-target != 's390x')) && (github.event_name == 'pull_request' || env.CODECOV_TOKEN_EXISTS == 'true')
214
+ if [ "${{ inputs.builder-target }}" != "i686" ]; then
215
+ mkdir -p "$HOME/.cargo" && tee -a "$HOME/.cargo/config.toml" > /dev/null <<EOT
216
+ runner = "qemu-${{ env.LIBC6_ARCH }} -L /usr/${{ env.GCC_ARCH }}-${{ inputs.target-os }}-${{ inputs.rust-toolchain-abi }}"
217
+ EOT
218
+ fi
219
+ if [ "${{ inputs.builder-target }}" = "i686" ]; then
220
+ eatmydata dpkg --add-architecture i386
221
+ PACKAGES="${PACKAGES} \
222
+ libc6:i386 \
223
+ "
224
+ fi
225
+ echo "PACKAGES=$(echo ${PACKAGES})" >> $GITHUB_ENV
226
+ - name : Configure for cross-os same-arch compilation
227
+ timeout-minutes : 1
228
+ if : (inputs.flavor == 'dev' || inputs.flavor == 'release') && inputs.target-os == 'windows'
229
+ run : |
230
+ set -xe
231
+ PACKAGES="${{ env.PACKAGES }}"
232
+ if [ "${{ inputs.builder-target }}" = "i686" ]; then
233
+ eatmydata dpkg --add-architecture i386
234
+ fi
235
+ PACKAGES="${PACKAGES} \
236
+ mingw-w64 \
237
+ wine \
238
+ "
239
+ if [ "${{ inputs.builder-target }}" = "i686" ]; then
240
+ PACKAGES="${PACKAGES} \
241
+ wine32:i386 \
242
+ "
243
+ fi
244
+ mkdir -p "$HOME/.cargo" && tee -a "$HOME/.cargo/config.toml" > /dev/null <<EOT
245
+ [target.${{ env.RUST_TARGET }}]
246
+ runner = "wine"
247
+ EOT
248
+ echo "PACKAGES=$(echo ${PACKAGES})" >> $GITHUB_ENV
249
+ - name : Install the packages
250
+ timeout-minutes : 1
251
+ run : |
252
+ set -xe
253
+ rm -rf /var/lib/apt/lists/*
254
+ apt update
255
+ eatmydata apt upgrade
256
+ eatmydata apt install ${{ env.PACKAGES }}
257
+ eatmydata apt clean
258
+ rm -rf /var/lib/apt/lists/*
259
+ - name : Install Rust toolchain and targets
260
+ timeout-minutes : 1
261
+ run : |
262
+ set -xe
263
+ eatmydata curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- --default-toolchain none -y
264
+ . "$HOME/.cargo/env"
265
+ eatmydata rustup toolchain install ${{ inputs.rust-toolchain-name }} --allow-downgrade --profile minimal
266
+ eatmydata rustup default ${{ inputs.rust-toolchain-name }}
267
+ eatmydata rustup target add ${{ env.RUST_TARGET }}
268
+ if [ "${{ inputs.flavor }}" = "RustFmt" ]; then
269
+ eatmydata rustup component add rustfmt
270
+ elif [ "${{ inputs.flavor }}" = "doc" ]; then
271
+ /bin/true
272
+ elif [ "${{ inputs.flavor }}" = "dev" ] || [ "${{ inputs.flavor }}" = "release" ]; then
273
+ eatmydata rustup component add clippy
274
+ else
275
+ exit 1
276
+ fi
277
+ - name : Install necessary Rust packages for code coverage
278
+ if : env.CODE_COVERAGE_SUPPORTED == 'true' && (inputs.builder-host == inputs.builder-target || (env.ENDIANNESS == 'big' && inputs.builder-target != 's390x')) && (github.event_name == 'pull_request' || env.CODECOV_TOKEN_EXISTS == 'true')
223
279
timeout-minutes : 2
224
280
run : |
225
281
set -xe
@@ -272,59 +328,59 @@ jobs:
272
328
set -xe
273
329
. "$HOME/.cargo/env"
274
330
cd "$SRC_DIR"
275
- cargo check --target ${{ env.RUST_TARGET }}-unknown-linux-${{ env.ABI }} --profile ${{ inputs.flavor }} --all-targets --all-features
331
+ cargo check --target ${{ env.RUST_TARGET }} --profile ${{ inputs.flavor }} --all-targets --all-features
276
332
- name : Run Clippy
277
333
timeout-minutes : 1
278
334
if : inputs.flavor != 'RustFmt' && inputs.flavor != 'doc'
279
335
run : |
280
336
set -xe
281
337
. "$HOME/.cargo/env"
282
338
cd "$SRC_DIR"
283
- cargo clippy --target ${{ env.RUST_TARGET }}-unknown-linux-${{ env.ABI }} --profile ${{ inputs.flavor }} --all-targets --all-features
339
+ cargo clippy --target ${{ env.RUST_TARGET }} --profile ${{ inputs.flavor }} --all-targets --all-features
284
340
- name : Build
285
341
timeout-minutes : 1
286
342
if : inputs.flavor != 'RustFmt' && inputs.flavor != 'doc'
287
343
run : |
288
344
set -xe
289
345
. "$HOME/.cargo/env"
290
346
cd "$SRC_DIR"
291
- cargo build --target ${{ env.RUST_TARGET }}-unknown-linux-${{ env.ABI }} --profile ${{ inputs.flavor }}
347
+ cargo build --target ${{ env.RUST_TARGET }} --profile ${{ inputs.flavor }}
292
348
- name : Run tests
293
349
timeout-minutes : 2
294
350
if : inputs.flavor != 'RustFmt' && inputs.flavor != 'doc'
295
351
run : |
296
352
set -xe
297
353
. "$HOME/.cargo/env"
298
354
cd "$SRC_DIR"
299
- cargo test --target ${{ env.RUST_TARGET }}-unknown-linux-${{ env.ABI }} --profile ${{ inputs.flavor }}
355
+ cargo test --target ${{ env.RUST_TARGET }} --profile ${{ inputs.flavor }}
300
356
- name : Run tests to collect code coverage
301
357
timeout-minutes : 2
302
- if : inputs.flavor != 'RustFmt' && inputs.flavor ! = 'doc ' && (inputs.builder-host == inputs.builder-target || (env.ENDIANNESS == 'big' && inputs.builder-target != 's390x')) && (github.event_name == 'pull_request' || env.CODECOV_TOKEN_EXISTS == 'true')
358
+ if : env.CODE_COVERAGE_SUPPORTED = = 'true ' && (inputs.builder-host == inputs.builder-target || (env.ENDIANNESS == 'big' && inputs.builder-target != 's390x')) && (github.event_name == 'pull_request' || env.CODECOV_TOKEN_EXISTS == 'true')
303
359
env :
304
360
RUSTFLAGS : " -C instrument-coverage"
305
361
run : |
306
362
set -xe
307
363
. "$HOME/.cargo/env"
308
364
cd "$SRC_DIR"
309
365
cargo clean
310
- cargo llvm-cov --no-report --target ${{ env.RUST_TARGET }}-unknown-linux-${{ env.ABI }} --profile ${{ inputs.flavor }}
366
+ cargo llvm-cov --no-report --target ${{ env.RUST_TARGET }} --profile ${{ inputs.flavor }}
311
367
- name : Aggregate code coverage
312
368
timeout-minutes : 1
313
- if : inputs.flavor != 'RustFmt' && inputs.flavor ! = 'doc ' && (inputs.builder-host == inputs.builder-target || (env.ENDIANNESS == 'big' && inputs.builder-target != 's390x')) && (github.event_name == 'pull_request' || env.CODECOV_TOKEN_EXISTS == 'true')
369
+ if : env.CODE_COVERAGE_SUPPORTED = = 'true ' && (inputs.builder-host == inputs.builder-target || (env.ENDIANNESS == 'big' && inputs.builder-target != 's390x')) && (github.event_name == 'pull_request' || env.CODECOV_TOKEN_EXISTS == 'true')
314
370
run : |
315
371
set -xe
316
372
. "$HOME/.cargo/env"
317
373
cd "$SRC_DIR"
318
- cargo llvm-cov report --codecov --output-path $SRC_DIR/codecov.json --target ${{ env.RUST_TARGET }}-unknown-linux-${{ env.ABI }} --profile ${{ inputs.flavor }}
374
+ cargo llvm-cov report --codecov --output-path $SRC_DIR/codecov.json --target ${{ env.RUST_TARGET }} --profile ${{ inputs.flavor }}
319
375
- name : Upload coverage reports to Codecov
320
376
timeout-minutes : 1
321
- if : inputs.flavor != 'RustFmt' && inputs.flavor ! = 'doc ' && (inputs.builder-host == inputs.builder-target || (env.ENDIANNESS == 'big' && inputs.builder-target != 's390x')) && (github.event_name == 'pull_request' || env.CODECOV_TOKEN_EXISTS == 'true')
377
+ if : env.CODE_COVERAGE_SUPPORTED = = 'true ' && (inputs.builder-host == inputs.builder-target || (env.ENDIANNESS == 'big' && inputs.builder-target != 's390x')) && (github.event_name == 'pull_request' || env.CODECOV_TOKEN_EXISTS == 'true')
322
378
uses : codecov/codecov-action@v5
323
379
env :
324
380
OS : ${{ inputs.os }}
325
381
BUILDER_HOST : ${{ inputs.builder-host }}
326
382
BUILDER_TARGET : ${{ inputs.builder-target }}
327
- RUST_TOOLCHAIN : ${{ inputs.rust-toolchain-name }}
383
+ RUST_TOOLCHAIN : ${{ env.RUST_TARGET }}
328
384
LLVM_VER : ${{ inputs.distro-LLVM }}
329
385
RUST_PROFILE : ${{ inputs.flavor }}
330
386
with :
0 commit comments