diff --git a/.github/workflows/CI-linux.yml b/.github/workflows/CI-linux.yml index bd19d425..16d82fd0 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,52 +57,6 @@ jobs: outputs: rustfmt-artifact-url: ${{ steps.rustfmt-upload.outputs.artifact-url }} steps: - - 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 + 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 +102,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 @@ -152,30 +110,69 @@ jobs: ENDIANNESS=little fi echo "ENDIANNESS=$(echo ${ENDIANNESS})" >> $GITHUB_ENV - - name: Install necessary packages - timeout-minutes: 2 + echo HOME=/root >> "$GITHUB_ENV" + - name: Configure APT + timeout-minutes: 1 run: | set -xe - eatmydata apt install \ + 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 \ - gcc-${{ env.GCC_ARCH }}-linux-${{ env.ABI }} \ + 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 }}-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 < /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 + PACKAGES="${{ env.PACKAGES }}" + if [ "${{ inputs.builder-target }}" = "i686" ]; then + eatmydata dpkg --add-architecture i386 + fi + PACKAGES="${PACKAGES} \ + mingw-w64 \ + wine \ + " + if [ "${{ inputs.builder-target }}" = "i686" ]; then + PACKAGES="${PACKAGES} \ + wine32:i386 \ + " + fi + mkdir -p "$HOME/.cargo" && tee -a "$HOME/.cargo/config.toml" > /dev/null <> $GITHUB_ENV + - name: Install the packages + timeout-minutes: 1 + 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: | set -xe @@ -272,7 +328,7 @@ jobs: set -xe . "$HOME/.cargo/env" cd "$SRC_DIR" - cargo check --target ${{ env.RUST_TARGET }}-unknown-linux-${{ env.ABI }} --profile ${{ inputs.flavor }} --all-targets --all-features + cargo check --target ${{ env.RUST_TARGET }} --profile ${{ inputs.flavor }} --all-targets --all-features - name: Run Clippy timeout-minutes: 1 if: inputs.flavor != 'RustFmt' && inputs.flavor != 'doc' @@ -280,7 +336,7 @@ jobs: set -xe . "$HOME/.cargo/env" cd "$SRC_DIR" - cargo clippy --target ${{ env.RUST_TARGET }}-unknown-linux-${{ env.ABI }} --profile ${{ inputs.flavor }} --all-targets --all-features + cargo clippy --target ${{ env.RUST_TARGET }} --profile ${{ inputs.flavor }} --all-targets --all-features - name: Build timeout-minutes: 1 if: inputs.flavor != 'RustFmt' && inputs.flavor != 'doc' @@ -288,7 +344,7 @@ jobs: set -xe . "$HOME/.cargo/env" cd "$SRC_DIR" - cargo build --target ${{ env.RUST_TARGET }}-unknown-linux-${{ env.ABI }} --profile ${{ inputs.flavor }} + cargo build --target ${{ env.RUST_TARGET }} --profile ${{ inputs.flavor }} - name: Run tests timeout-minutes: 2 if: inputs.flavor != 'RustFmt' && inputs.flavor != 'doc' @@ -296,10 +352,10 @@ jobs: set -xe . "$HOME/.cargo/env" cd "$SRC_DIR" - cargo test --target ${{ env.RUST_TARGET }}-unknown-linux-${{ env.ABI }} --profile ${{ inputs.flavor }} + cargo test --target ${{ env.RUST_TARGET }} --profile ${{ inputs.flavor }} - name: Run tests to collect code coverage timeout-minutes: 2 - 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') + 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') env: RUSTFLAGS: "-C instrument-coverage" run: | @@ -307,24 +363,24 @@ jobs: . "$HOME/.cargo/env" cd "$SRC_DIR" cargo clean - cargo llvm-cov --no-report --target ${{ env.RUST_TARGET }}-unknown-linux-${{ env.ABI }} --profile ${{ inputs.flavor }} + cargo llvm-cov --no-report --target ${{ env.RUST_TARGET }} --profile ${{ inputs.flavor }} - name: Aggregate code coverage timeout-minutes: 1 - 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') + 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') run: | set -xe . "$HOME/.cargo/env" cd "$SRC_DIR" - cargo llvm-cov report --codecov --output-path $SRC_DIR/codecov.json --target ${{ env.RUST_TARGET }}-unknown-linux-${{ env.ABI }} --profile ${{ inputs.flavor }} + cargo llvm-cov report --codecov --output-path $SRC_DIR/codecov.json --target ${{ env.RUST_TARGET }} --profile ${{ inputs.flavor }} - name: Upload coverage reports to Codecov timeout-minutes: 1 - 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') + 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') uses: codecov/codecov-action@v5 env: OS: ${{ inputs.os }} BUILDER_HOST: ${{ inputs.builder-host }} BUILDER_TARGET: ${{ inputs.builder-target }} - RUST_TOOLCHAIN: ${{ inputs.rust-toolchain-name }} + RUST_TOOLCHAIN: ${{ env.RUST_TARGET }} LLVM_VER: ${{ inputs.distro-LLVM }} RUST_PROFILE: ${{ inputs.flavor }} with: diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 8ed20b7e..6955bd32 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -17,8 +17,8 @@ jobs: matrix: os: [ linux ] stack: - - { runs-on: "ubuntu-latest", host: "x86_64", target: "x86_64" } - - { runs-on: "ubuntu-24.04-arm", host: "aarch64", target: "aarch64" } + - { runs-on: "ubuntu-latest", host: "x86_64", target: "x86_64", vendor: "unknown", os: "linux", abi: "gnu" } + - { runs-on: "ubuntu-24.04-arm", host: "aarch64", target: "aarch64", vendor: "unknown", os: "linux", abi: "gnu" } distro: - { image: "debian:trixie-slim", LLVM: 19 } rust-toolchain-name: [ stable, nightly ] @@ -29,6 +29,37 @@ jobs: runs-on: ${{ matrix.stack.runs-on }} builder-host: ${{ matrix.stack.host }} builder-target: ${{ matrix.stack.target }} + target-vendor: ${{ matrix.stack.vendor }} + target-os: ${{ matrix.stack.os }} + rust-toolchain-abi: ${{ matrix.stack.abi }} + distro-image: ${{ matrix.distro.image }} + distro-LLVM: ${{ matrix.distro.LLVM }} + rust-toolchain-name: ${{ matrix.rust-toolchain-name }} + flavor: ${{ matrix.flavor }} + secrets: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + windows-cross: + strategy: + fail-fast: false + matrix: + os: [ linux ] + stack: + - { runs-on: "ubuntu-latest", host: "x86_64", target: "x86_64", vendor: "pc", os: "windows" } + - { runs-on: "ubuntu-latest", host: "x86_64", target: "i686", vendor: "pc", os: "windows" } + distro: + - { image: "debian:trixie-slim", LLVM: 19 } + abi: [ gnu ] + rust-toolchain-name: [ stable, nightly ] + flavor: [ dev, release ] + uses: ./.github/workflows/CI-linux.yml + with: + os: ${{ matrix.os }} + runs-on: ${{ matrix.stack.runs-on }} + builder-host: ${{ matrix.stack.host }} + builder-target: ${{ matrix.stack.target }} + target-vendor: ${{ matrix.stack.vendor }} + target-os: ${{ matrix.stack.os }} + rust-toolchain-abi: ${{ matrix.abi }} distro-image: ${{ matrix.distro.image }} distro-LLVM: ${{ matrix.distro.LLVM }} rust-toolchain-name: ${{ matrix.rust-toolchain-name }} @@ -36,19 +67,19 @@ jobs: secrets: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} linux-cross: - needs: [ linux-fast, windows-msys2-fast, macOS-fast ] + needs: [ linux-fast, windows-cross, windows-msys2-fast, macOS-fast ] strategy: fail-fast: false matrix: os: [ linux ] stack: - - { runs-on: "ubuntu-latest", host: "x86_64", target: "i686" } - - { runs-on: "ubuntu-24.04-arm", host: "aarch64", target: "armv6" } - - { runs-on: "ubuntu-24.04-arm", host: "aarch64", target: "armv7" } - - { runs-on: "ubuntu-latest", host: "x86_64", target: "powerpc64" } - - { runs-on: "ubuntu-latest", host: "x86_64", target: "powerpc64le" } - - { runs-on: "ubuntu-latest", host: "x86_64", target: "s390x" } - - { runs-on: "ubuntu-latest", host: "x86_64", target: "riscv64" } + - { runs-on: "ubuntu-latest", host: "x86_64", target: "i686", vendor: "unknown", os: "linux", abi: "gnu" } + - { runs-on: "ubuntu-24.04-arm", host: "aarch64", target: "armv6", vendor: "unknown", os: "linux", abi: "gnueabi" } + - { runs-on: "ubuntu-24.04-arm", host: "aarch64", target: "armv7", vendor: "unknown", os: "linux", abi: "gnueabihf" } + - { runs-on: "ubuntu-latest", host: "x86_64", target: "powerpc64", vendor: "unknown", os: "linux", abi: "gnu" } + - { runs-on: "ubuntu-latest", host: "x86_64", target: "powerpc64le", vendor: "unknown", os: "linux", abi: "gnu" } + - { runs-on: "ubuntu-latest", host: "x86_64", target: "s390x", vendor: "unknown", os: "linux", abi: "gnu" } + - { runs-on: "ubuntu-latest", host: "x86_64", target: "riscv64", vendor: "unknown", os: "linux", abi: "gnu" } distro: - { image: "debian:trixie-slim", LLVM: 19 } rust-toolchain-name: [ stable, nightly ] @@ -59,6 +90,9 @@ jobs: runs-on: ${{ matrix.stack.runs-on }} builder-host: ${{ matrix.stack.host }} builder-target: ${{ matrix.stack.target }} + target-vendor: ${{ matrix.stack.vendor }} + target-os: ${{ matrix.stack.os }} + rust-toolchain-abi: ${{ matrix.stack.abi }} distro-image: ${{ matrix.distro.image }} distro-LLVM: ${{ matrix.distro.LLVM }} rust-toolchain-name: ${{ matrix.rust-toolchain-name }} @@ -73,11 +107,8 @@ jobs: - { os: windows, os-ver: latest, host: "x86_64", target: "x86_64", msystem: CLANG64 } - { os: windows, os-ver: 11-arm, host: "aarch64", target: "aarch64", msystem: CLANGARM64 } rust-toolchain-version: [ stable, nightly ] - rust-toolchain-abi: [ gnu, msvc ] + rust-toolchain-abi: [ msvc ] flavor: [ dev, release ] - exclude: - - stack: { os: windows, os-ver: 11-arm, host: "aarch64", target: "aarch64", msystem: CLANGARM64 } - rust-toolchain-abi: gnu uses: ./.github/workflows/CI-windows-msys2.yml with: os: ${{ matrix.stack.os }} @@ -112,13 +143,16 @@ jobs: secrets: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} build-docs: - needs: [ linux-fast, linux-cross, windows-msys2-fast, macOS-fast ] + needs: [ linux-fast, windows-cross, linux-cross, windows-msys2-fast, macOS-fast ] uses: ./.github/workflows/CI-linux.yml with: os: linux runs-on: ubuntu-latest builder-host: x86_64 builder-target: x86_64 + target-vendor: "unknown" + target-os: "linux" + rust-toolchain-abi: "gnu" distro-image: "debian:trixie-slim" distro-LLVM: 19 rust-toolchain-name: stable diff --git a/.github/workflows/rustfmt.yml b/.github/workflows/rustfmt.yml index 71bf6441..e4168402 100644 --- a/.github/workflows/rustfmt.yml +++ b/.github/workflows/rustfmt.yml @@ -19,6 +19,9 @@ jobs: runs-on: "ubuntu-latest" builder-host: x86_64 builder-target: x86_64 + target-vendor: "unknown" + target-os: "linux" + rust-toolchain-abi: "gnu" distro-image: "debian:trixie-slim" distro-LLVM: 19 rust-toolchain-name: stable