From 049e8f2d2b084abb24129675ab4c0434736fc0a3 Mon Sep 17 00:00:00 2001 From: Roman Lebedev Date: Sun, 10 Aug 2025 22:59:18 +0300 Subject: [PATCH 1/4] CI: move windows x86 gnu jobs over to linux via cross-compilation --- .github/workflows/CI-linux.yml | 95 ++++++++++++++++++++++------------ .github/workflows/CI.yml | 64 +++++++++++++++++------ .github/workflows/rustfmt.yml | 3 ++ 3 files changed, 114 insertions(+), 48 deletions(-) diff --git a/.github/workflows/CI-linux.yml b/.github/workflows/CI-linux.yml index bd19d425..25963425 100644 --- a/.github/workflows/CI-linux.yml +++ b/.github/workflows/CI-linux.yml @@ -13,6 +13,15 @@ on: builder-target: required: true type: string + target-vendor: + required: true + type: string + target-os: + required: true + type: string + rust-toolchain-abi: + required: true + type: string distro-image: required: true type: string @@ -36,6 +45,7 @@ env: RUSTFLAGS: "-Dwarnings" SRC_DIR: ${{ github.workspace }}/rawspeed.rs CODECOV_TOKEN_EXISTS: ${{ secrets.CODECOV_TOKEN != '' }} + CODE_COVERAGE_SUPPORTED: ${{ inputs.flavor != 'RustFmt' && inputs.flavor != 'doc' && inputs.target-os != 'windows' }} jobs: linux: @@ -47,6 +57,8 @@ jobs: outputs: rustfmt-artifact-url: ${{ steps.rustfmt-upload.outputs.artifact-url }} steps: + - name: Preserve $HOME set in the container + run: echo HOME=/root >> "$GITHUB_ENV" - name: Configure APT timeout-minutes: 1 run: | @@ -105,14 +117,16 @@ jobs: || [ "${{ inputs.builder-target }}" = "s390x" ] \ || [ "${{ inputs.builder-target }}" = "armv7" ]; then - RUST_TARGET=${{ inputs.builder-target }} + RUST_TARGET_ARCH=${{ inputs.builder-target }} elif [ "${{ inputs.builder-target }}" = "armv6" ]; then - RUST_TARGET=arm + RUST_TARGET_ARCH=arm elif [ "${{ inputs.builder-target }}" = "riscv64" ]; then - RUST_TARGET=riscv64gc + RUST_TARGET_ARCH=riscv64gc else exit 1 fi + echo "RUST_TARGET_ARCH=$(echo ${RUST_TARGET_ARCH})" >> $GITHUB_ENV + RUST_TARGET=${RUST_TARGET_ARCH}-${{ inputs.target-vendor }}-${{ inputs.target-os }}-${{ inputs.rust-toolchain-abi }} echo "RUST_TARGET=$(echo ${RUST_TARGET})" >> $GITHUB_ENV if [ "${{ inputs.builder-target }}" = "i686" ]; then LIBC6_ARCH=i386 @@ -136,14 +150,6 @@ jobs: GCC_ARCH=${{ inputs.builder-target }} fi echo "GCC_ARCH=$(echo ${GCC_ARCH})" >> $GITHUB_ENV - if [ "${{ inputs.builder-target }}" = "armv6" ]; then - ABI=gnueabi - elif [ "${{ inputs.builder-target }}" = "armv7" ]; then - ABI=gnueabihf - else - ABI=gnu - fi - echo "ABI=$(echo ${ABI})" >> $GITHUB_ENV if [ "${{ inputs.builder-target }}" = "s390x" ] \ || [ "${{ inputs.builder-target }}" = "powerpc64" ]; then @@ -166,6 +172,7 @@ jobs: . "$HOME/.cargo/env" eatmydata rustup toolchain install ${{ inputs.rust-toolchain-name }} --allow-downgrade --profile minimal eatmydata rustup default ${{ inputs.rust-toolchain-name }} + eatmydata rustup target add ${{ env.RUST_TARGET }} if [ "${{ inputs.flavor }}" = "RustFmt" ]; then eatmydata rustup component add rustfmt elif [ "${{ inputs.flavor }}" = "doc" ]; then @@ -191,35 +198,57 @@ jobs: else exit 1 fi - - name: Install necessary packages for cross-compilation + - name: Install necessary packages for same-os cross-arch compilation timeout-minutes: 2 - if: (inputs.flavor == 'dev' || inputs.flavor == 'release') && inputs.builder-host != inputs.builder-target + if: (inputs.flavor == 'dev' || inputs.flavor == 'release') && inputs.target-os == 'linux' && inputs.builder-host != inputs.builder-target run: | set -xe . "$HOME/.cargo/env" eatmydata apt install \ - gcc-${{ env.GCC_ARCH }}-linux-${{ env.ABI }} \ + gcc-${{ env.GCC_ARCH }}-${{ inputs.target-os }}-${{ inputs.rust-toolchain-abi }} \ libc6-dev-${{ env.LIBC6_ARCH }}-cross \ qemu-user \ qemu-user-binfmt \ ; - ln -s /usr/local/bin/clang /usr/local/bin/${{ inputs.builder-target }}-unknown-linux-${{ env.ABI }}-clang - ln -s /usr/local/bin/clang++ /usr/local/bin/${{ inputs.builder-target }}-unknown-linux-${{ env.ABI }}-clang++ - ln -s /usr/local/bin/ld /usr/local/bin/${{ inputs.builder-target }}-unknown-linux-${{ env.ABI }}-ld - rustup target add ${{ env.RUST_TARGET }}-unknown-linux-${{ env.ABI }} - LINKER="${{ inputs.builder-target }}-unknown-linux-${{ env.ABI }}-clang" + ln -s /usr/local/bin/clang /usr/local/bin/${{ inputs.builder-target }}-${{ inputs.target-vendor }}-${{ inputs.target-os }}-${{ inputs.rust-toolchain-abi }}-clang + ln -s /usr/local/bin/clang++ /usr/local/bin/${{ inputs.builder-target }}-${{ inputs.target-vendor }}-${{ inputs.target-os }}-${{ inputs.rust-toolchain-abi }}-clang++ + ln -s /usr/local/bin/ld /usr/local/bin/${{ inputs.builder-target }}-${{ inputs.target-vendor }}-${{ inputs.target-os }}-${{ inputs.rust-toolchain-abi }}-ld + LINKER="${{ inputs.builder-target }}-${{ inputs.target-vendor }}-${{ inputs.target-os }}-${{ inputs.rust-toolchain-abi }}-clang" if [ "${{ inputs.builder-target }}" = "powerpc64" ]; then # LLD/clang does not support powerpc64 ELFv1 ABI - LINKER="${{ env.GCC_ARCH }}-linux-${{ env.ABI }}-gcc" + LINKER="${{ env.GCC_ARCH }}-${{ inputs.target-os }}-${{ inputs.rust-toolchain-abi }}-gcc" fi tee -a "$HOME/.cargo/config.toml" > /dev/null < /dev/null < Date: Tue, 12 Aug 2025 01:27:01 +0300 Subject: [PATCH 2/4] CI: don't use qemu for i686 --- .github/workflows/CI-linux.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/workflows/CI-linux.yml b/.github/workflows/CI-linux.yml index 25963425..46f1cfdf 100644 --- a/.github/workflows/CI-linux.yml +++ b/.github/workflows/CI-linux.yml @@ -222,8 +222,19 @@ jobs: tee -a "$HOME/.cargo/config.toml" > /dev/null < /dev/null < Date: Tue, 12 Aug 2025 02:11:39 +0300 Subject: [PATCH 3/4] CI: linux: collect the needed packages and install them all at once --- .github/workflows/CI-linux.yml | 192 ++++++++++++++++++--------------- 1 file changed, 104 insertions(+), 88 deletions(-) diff --git a/.github/workflows/CI-linux.yml b/.github/workflows/CI-linux.yml index 46f1cfdf..8a9002d6 100644 --- a/.github/workflows/CI-linux.yml +++ b/.github/workflows/CI-linux.yml @@ -57,54 +57,6 @@ jobs: outputs: rustfmt-artifact-url: ${{ steps.rustfmt-upload.outputs.artifact-url }} steps: - - name: Preserve $HOME set in the container - run: echo HOME=/root >> "$GITHUB_ENV" - - name: Configure APT - timeout-minutes: 1 - run: | - set -xe - tee /etc/dpkg/dpkg.cfg.d/force-unsafe-io > /dev/null < /dev/null < /dev/null < /dev/null < /dev/null < /dev/null < /dev/null < /dev/null <> $GITHUB_ENV - - name: Install necessary packages - timeout-minutes: 2 + echo HOME=/root >> "$GITHUB_ENV" + - name: Configure APT + timeout-minutes: 1 + run: | + set -xe + tee /etc/dpkg/dpkg.cfg.d/force-unsafe-io > /dev/null < /dev/null < /dev/null < /dev/null < /dev/null < /dev/null < /dev/null < /dev/null <> $GITHUB_ENV + - name: Configure for same-os cross-arch compilation + timeout-minutes: 1 if: (inputs.flavor == 'dev' || inputs.flavor == 'release') && inputs.target-os == 'linux' && inputs.builder-host != inputs.builder-target run: | set -xe - . "$HOME/.cargo/env" - - eatmydata apt install \ + PACKAGES="${{ env.PACKAGES }}" + PACKAGES="${PACKAGES} \ gcc-${{ env.GCC_ARCH }}-${{ inputs.target-os }}-${{ inputs.rust-toolchain-abi }} \ libc6-dev-${{ env.LIBC6_ARCH }}-cross \ qemu-user \ qemu-user-binfmt \ - ; + " ln -s /usr/local/bin/clang /usr/local/bin/${{ inputs.builder-target }}-${{ inputs.target-vendor }}-${{ inputs.target-os }}-${{ inputs.rust-toolchain-abi }}-clang ln -s /usr/local/bin/clang++ /usr/local/bin/${{ inputs.builder-target }}-${{ inputs.target-vendor }}-${{ inputs.target-os }}-${{ inputs.rust-toolchain-abi }}-clang++ ln -s /usr/local/bin/ld /usr/local/bin/${{ inputs.builder-target }}-${{ inputs.target-vendor }}-${{ inputs.target-os }}-${{ inputs.rust-toolchain-abi }}-ld @@ -219,46 +207,74 @@ jobs: # LLD/clang does not support powerpc64 ELFv1 ABI LINKER="${{ env.GCC_ARCH }}-${{ inputs.target-os }}-${{ inputs.rust-toolchain-abi }}-gcc" fi - tee -a "$HOME/.cargo/config.toml" > /dev/null < /dev/null < /dev/null < /dev/null <> $GITHUB_ENV + - name: Configure for cross-os same-arch compilation + timeout-minutes: 1 if: (inputs.flavor == 'dev' || inputs.flavor == 'release') && inputs.target-os == 'windows' run: | set -xe - . "$HOME/.cargo/env" + PACKAGES="${{ env.PACKAGES }}" if [ "${{ inputs.builder-target }}" = "i686" ]; then eatmydata dpkg --add-architecture i386 - eatmydata apt update fi - eatmydata apt install \ + PACKAGES="${PACKAGES} \ mingw-w64 \ wine \ - ; + " if [ "${{ inputs.builder-target }}" = "i686" ]; then - eatmydata apt install \ + PACKAGES="${PACKAGES} \ wine32:i386 \ - ; + " fi - tee -a "$HOME/.cargo/config.toml" > /dev/null < /dev/null <> $GITHUB_ENV + - name: Install the packages + timeout-minutes: 2 + run: | + set -xe + rm -rf /var/lib/apt/lists/* + apt update + eatmydata apt upgrade + eatmydata apt install ${{ env.PACKAGES }} + eatmydata apt clean + rm -rf /var/lib/apt/lists/* + - name: Install Rust toolchain and targets + timeout-minutes: 1 + run: | + set -xe + eatmydata curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- --default-toolchain none -y + . "$HOME/.cargo/env" + eatmydata rustup toolchain install ${{ inputs.rust-toolchain-name }} --allow-downgrade --profile minimal + eatmydata rustup default ${{ inputs.rust-toolchain-name }} + eatmydata rustup target add ${{ env.RUST_TARGET }} + if [ "${{ inputs.flavor }}" = "RustFmt" ]; then + eatmydata rustup component add rustfmt + elif [ "${{ inputs.flavor }}" = "doc" ]; then + /bin/true + elif [ "${{ inputs.flavor }}" = "dev" ] || [ "${{ inputs.flavor }}" = "release" ]; then + eatmydata rustup component add clippy + else + exit 1 + fi + - name: Install necessary Rust packages for code coverage 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') timeout-minutes: 2 run: | From e77b7377f5caa0550344691d019310741f445bb7 Mon Sep 17 00:00:00 2001 From: Roman Lebedev Date: Tue, 12 Aug 2025 02:32:10 +0300 Subject: [PATCH 4/4] CI: switch to deb.debian.org Every once in a while, trafficmanager just hangs, which is quite unfortunate, since it is rather fast otherwise... --- .github/workflows/CI-linux.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/CI-linux.yml b/.github/workflows/CI-linux.yml index 8a9002d6..16d82fd0 100644 --- a/.github/workflows/CI-linux.yml +++ b/.github/workflows/CI-linux.yml @@ -141,10 +141,10 @@ jobs: rm -rf /etc/apt/sources.list* if [ "${{ inputs.distro-image }}" = "debian:trixie-slim" ]; then tee /etc/apt/sources.list > /dev/null <> $GITHUB_ENV - name: Install the packages - timeout-minutes: 2 + timeout-minutes: 1 run: | set -xe rm -rf /var/lib/apt/lists/*