Skip to content

Commit a38a1ad

Browse files
authored
Merge pull request #63 from LebedevRI/cross
CI: move windows x86 gnu jobs over to linux via cross-compilation
2 parents f47e142 + e77b737 commit a38a1ad

File tree

3 files changed

+212
-119
lines changed

3 files changed

+212
-119
lines changed

.github/workflows/CI-linux.yml

Lines changed: 160 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,15 @@ on:
1313
builder-target:
1414
required: true
1515
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
1625
distro-image:
1726
required: true
1827
type: string
@@ -36,6 +45,7 @@ env:
3645
RUSTFLAGS: "-Dwarnings"
3746
SRC_DIR: ${{ github.workspace }}/rawspeed.rs
3847
CODECOV_TOKEN_EXISTS: ${{ secrets.CODECOV_TOKEN != '' }}
48+
CODE_COVERAGE_SUPPORTED: ${{ inputs.flavor != 'RustFmt' && inputs.flavor != 'doc' && inputs.target-os != 'windows' }}
3949

4050
jobs:
4151
linux:
@@ -47,52 +57,6 @@ jobs:
4757
outputs:
4858
rustfmt-artifact-url: ${{ steps.rustfmt-upload.outputs.artifact-url }}
4959
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
9660
- name: Configure necessary env variables
9761
timeout-minutes: 1
9862
run: |
@@ -105,14 +69,16 @@ jobs:
10569
|| [ "${{ inputs.builder-target }}" = "s390x" ] \
10670
|| [ "${{ inputs.builder-target }}" = "armv7" ];
10771
then
108-
RUST_TARGET=${{ inputs.builder-target }}
72+
RUST_TARGET_ARCH=${{ inputs.builder-target }}
10973
elif [ "${{ inputs.builder-target }}" = "armv6" ]; then
110-
RUST_TARGET=arm
74+
RUST_TARGET_ARCH=arm
11175
elif [ "${{ inputs.builder-target }}" = "riscv64" ]; then
112-
RUST_TARGET=riscv64gc
76+
RUST_TARGET_ARCH=riscv64gc
11377
else
11478
exit 1
11579
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 }}
11682
echo "RUST_TARGET=$(echo ${RUST_TARGET})" >> $GITHUB_ENV
11783
if [ "${{ inputs.builder-target }}" = "i686" ]; then
11884
LIBC6_ARCH=i386
@@ -136,14 +102,6 @@ jobs:
136102
GCC_ARCH=${{ inputs.builder-target }}
137103
fi
138104
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
147105
if [ "${{ inputs.builder-target }}" = "s390x" ] \
148106
|| [ "${{ inputs.builder-target }}" = "powerpc64" ];
149107
then
@@ -152,30 +110,69 @@ jobs:
152110
ENDIANNESS=little
153111
fi
154112
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
157116
run: |
158117
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} \
160166
ca-certificates \
161167
curl \
162168
git \
163169
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} \
176173
clang-${{ inputs.distro-LLVM }} \
177174
lld-${{ inputs.distro-LLVM }} \
178-
;
175+
"
179176
dpkg-divert --add --rename --divert /usr/bin/cc.original /usr/bin/cc
180177
dpkg-divert --add --rename --divert /usr/bin/gcc.original /usr/bin/gcc
181178
dpkg-divert --add --rename --divert /usr/bin/g++.original /usr/bin/g++
@@ -188,38 +185,97 @@ jobs:
188185
ln -s /usr/local/bin/clang++ /usr/local/bin/c++
189186
ln -s /usr/local/bin/clang++ /usr/local/bin/g++
190187
ln -s /usr/local/bin/ld.lld /usr/local/bin/ld
191-
else
192-
exit 1
193188
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
197193
run: |
198194
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 }} \
203198
libc6-dev-${{ env.LIBC6_ARCH }}-cross \
204199
qemu-user \
205200
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"
212206
if [ "${{ inputs.builder-target }}" = "powerpc64" ]; then
213207
# 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"
215209
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 }}]
218212
linker = "${LINKER}"
219-
runner = "qemu-${{ env.LIBC6_ARCH }} -L /usr/${{ env.GCC_ARCH }}-linux-${{ env.ABI }}"
220213
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')
223279
timeout-minutes: 2
224280
run: |
225281
set -xe
@@ -272,59 +328,59 @@ jobs:
272328
set -xe
273329
. "$HOME/.cargo/env"
274330
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
276332
- name: Run Clippy
277333
timeout-minutes: 1
278334
if: inputs.flavor != 'RustFmt' && inputs.flavor != 'doc'
279335
run: |
280336
set -xe
281337
. "$HOME/.cargo/env"
282338
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
284340
- name: Build
285341
timeout-minutes: 1
286342
if: inputs.flavor != 'RustFmt' && inputs.flavor != 'doc'
287343
run: |
288344
set -xe
289345
. "$HOME/.cargo/env"
290346
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 }}
292348
- name: Run tests
293349
timeout-minutes: 2
294350
if: inputs.flavor != 'RustFmt' && inputs.flavor != 'doc'
295351
run: |
296352
set -xe
297353
. "$HOME/.cargo/env"
298354
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 }}
300356
- name: Run tests to collect code coverage
301357
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')
303359
env:
304360
RUSTFLAGS: "-C instrument-coverage"
305361
run: |
306362
set -xe
307363
. "$HOME/.cargo/env"
308364
cd "$SRC_DIR"
309365
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 }}
311367
- name: Aggregate code coverage
312368
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')
314370
run: |
315371
set -xe
316372
. "$HOME/.cargo/env"
317373
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 }}
319375
- name: Upload coverage reports to Codecov
320376
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')
322378
uses: codecov/codecov-action@v5
323379
env:
324380
OS: ${{ inputs.os }}
325381
BUILDER_HOST: ${{ inputs.builder-host }}
326382
BUILDER_TARGET: ${{ inputs.builder-target }}
327-
RUST_TOOLCHAIN: ${{ inputs.rust-toolchain-name }}
383+
RUST_TOOLCHAIN: ${{ env.RUST_TARGET }}
328384
LLVM_VER: ${{ inputs.distro-LLVM }}
329385
RUST_PROFILE: ${{ inputs.flavor }}
330386
with:

0 commit comments

Comments
 (0)