tools/corrosion/.github/workflows/test.yaml
author unC0Rr
Wed, 20 Nov 2024 21:37:47 +0100
branchtransitional_engine
changeset 16038 d903f8d2395a
parent 16021 6a3dc15b78b9
permissions -rw-r--r--
- Update corrosion - Implement installation of targets imported with corrosion

name: Tests
on:
  push:
    branches:
      - master
  pull_request:
    branches:
      - 'master'
      - 'stable/**'
jobs:

  visual_studio_base:
    name: Test Visual Studio (base)
    uses: ./.github/workflows/visual_studio.yaml
    with:
      vs_version: "2022"
      rust: 1.46.0

  visual_studio_stage2:
    name: Test Visual Studio
    uses: ./.github/workflows/visual_studio.yaml
    needs:
      - visual_studio_base
    strategy:
      matrix:
        vs_version:
          - "2019"
          - "2022"
        arch:
          - x86_64
          - i686
          - aarch64
        rust:
          - "1.54.0"
        include:
          - arch: x86_64
            vs_version: 2022
            rust: stable
          - arch: x86_64
            vs_version: 2022
            rust: nightly
    with:
      vs_version: "${{ matrix.vs_version}}"
      rust: 1.54.0
      target_arch: "${{ matrix.arch}}"

  windows_ninja_cl:
    name: Test Windows Ninja MSVC
    runs-on: ${{ matrix.os }}
    needs:
      - visual_studio_base
    strategy:
      fail-fast: false
      matrix:
        os:
          - windows-2022
        arch:
          - x86_64
          - i686
          - aarch64
        compiler:
          - cl
          - clang-cl
          - clang
        include:
          - os: windows-2022
            vs_version: vs-2022
            cmake: 3.22.6
          - rust: 1.54.0
          # Add variable mapping for ilammy/msvc-dev-cmd action
          - arch: x86_64
            msvc_dev_arch: amd64
          - arch: i686
            msvc_dev_arch: amd64_x86
          - arch: aarch64
            msvc_dev_arch: amd64_arm64
        exclude:
          # Not sure what parameters CMake needs when cross-compiling with clang-cl, so exclude for now
          - compiler: clang-cl
            arch: i686
          - compiler: clang-cl
            arch: aarch64
          - compiler: clang
            arch: i686
          - compiler: clang
            arch: aarch64

    steps:
      - uses: actions/checkout@v4
      - name: Install CMake
        uses: lukka/get-cmake@519de0c7b4812477d74976b2523a9417f552d126
        with:
          cmakeVersion: "${{ matrix.cmake }}"
          ninjaVersion: "~1.10.0"
      - name: Install Rust
        id: install_rust
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{matrix.rust}}
          targets: ${{matrix.arch}}-pc-windows-msvc
      - name: Setup MSVC Development Environment
        uses: ilammy/msvc-dev-cmd@v1
        with:
          arch: ${{ matrix.msvc_dev_arch }}
      - name: Configure
        run: cmake -S. -Bbuild "-DRust_TOOLCHAIN=${{steps.install_rust.outputs.name}}" --preset "ninja-${{ matrix.arch }}-pc-windows-msvc-${{ matrix.compiler }}"
      - name: Run Tests
        working-directory: build
        run: ctest --output-on-failure --build-config Debug -j 3

  windows_gnu:
    name: Test Windows GNU
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os:
          - windows-2022
        arch:
          - x86_64
          # - i686
          # - aarch64
        compiler:
          - gcc # Clang only has experimental support for Cygwin / MinGW, so we don't test it
        generator:
          - ninja
          - make
        include:
          - cmake: 3.22.6
          - rust: 1.54.0

    steps:
      - uses: actions/checkout@v4
      - name: Install CMake
        uses: lukka/get-cmake@519de0c7b4812477d74976b2523a9417f552d126
        with:
          cmakeVersion: "${{ matrix.cmake }}"
          ninjaVersion: "~1.10.0"
      - name: Install Rust
        id: install_rust
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{matrix.rust}}
          targets: ${{matrix.arch}}-pc-windows-gnu
      - name: Configure
        run: cmake -S. -Bbuild "-DRust_TOOLCHAIN=${{steps.install_rust.outputs.name}}" --preset "${{ matrix.generator }}-${{ matrix.arch }}-pc-windows-gnu-${{ matrix.compiler }}"
      - name: Run Tests
        working-directory: build
        run: ctest --output-on-failure --build-config Debug -j 3

  windows_gnullvm_msys2:
    name: Test Windows gnullvm on msys2
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os:
          - windows-2022
        arch:
          - x86_64
          # - i686
          # - aarch64
        generator:
          - Ninja
          - MSYS Makefiles
        include:
          - arch: x86_64
            msystem: CLANG64
#          - arch: i686
#            msystem: CLANG32
#          - arch: aarch64
#            msystem: CLANGARM64
    defaults:
      run:
        shell: msys2 {0}
    steps:
      - uses: actions/checkout@v4
      - name: Install Rust
        id: install_rust
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: stable
          targets: ${{matrix.arch}}-pc-windows-gnullvm
      - uses: msys2/setup-msys2@v2
        with:
          msystem: ${{matrix.msystem}}
          path-type: inherit
          install: >-
            git
            make
          pacboy: >-
            toolchain:p
            cmake:p
            ninja:p
      - name: Configure
        run: cmake -S. -Bbuild -G "${{matrix.generator}}" --toolchain=.github/scripts/toolchains/${{matrix.arch}}-pc-windows-gnullvm.cmake
      - name: Run Tests
        working-directory: build
        run: ctest --output-on-failure --build-config Debug -j 3

# For now just test if hostbuild works when cross-compiling on windows.
# For testing everything we would also need to install a cross-compiler first.
  windows_cross_hostbuild:
    name: Test Windows Cross
    runs-on: windows-2022
    steps:
      - uses: actions/checkout@v4
      - name: Install CMake
        uses: lukka/get-cmake@519de0c7b4812477d74976b2523a9417f552d126
        with:
          cmakeVersion: "~3.22.0"
          ninjaVersion: "~1.10.0"
      - name: Install Rust
        id: install_rust
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: stable
          targets: aarch64-unknown-linux-gnu
      - name: Configure
        run: cmake -S. -Bbuild "-DRust_TOOLCHAIN=${{steps.install_rust.outputs.name}}" -DRust_CARGO_TARGET=aarch64-unknown-linux-gnu
      - name: Run Tests
        working-directory: build
        run: ctest --output-on-failure --build-config Debug -R hostbuild

  linux_base:
    name: Test Linux (base)
    uses: ./.github/workflows/linux.yaml
    with:
      c_compiler: "gcc"
      generator: "Ninja"

  linux_stage2:
    name: Test Linux
    needs:
      - linux_base
    uses: ./.github/workflows/linux.yaml
    with:
      target_arch: "${{ matrix.arch }}"
      c_compiler: "${{ matrix.compiler }}"
      generator: "${{ matrix.generator }}"
    strategy:
      fail-fast: false
      matrix:
        arch:
          - x86_64
          - i686
          - aarch64
        compiler:
          - gcc
        generator:
          - "Ninja"
          - "Unix Makefiles"
        include:
          # rustc doesn't support cross-compiling with clang out of the box, since
          # clang requires a --target parameter. Corrosion currently can only pass
          # this for the top-level crate, so linking of cdylibs that are built as
          # dependencies of this crate will fail if they exist.
          # Solutions would be to make cross-compiling with clang work out-of-the-box
          # in rustc, or working around it in corrosion by adding a linker-wrapper.
          # For this reason we only test clang with the host target for now.
          - arch: x86_64
            compiler: clang
            generator: "Ninja"
          - arch: x86_64
            generator: "Ninja Multi-Config"
            compiler: gcc

  darwin:
    name: Test MacOS
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        arch:
          - x86_64
          - aarch64
        compiler:
          - clang
        generator:
          - "Ninja"
          - "Xcode"
        include:
          - os: macos-latest
          - cmake: 3.22.6
          - rust: 1.54.0

    steps:
      - uses: actions/checkout@v4
      - name: Install CMake
        uses: lukka/get-cmake@519de0c7b4812477d74976b2523a9417f552d126
        with:
          cmakeVersion: "${{ matrix.cmake }}"
          ninjaVersion: "~1.10.0"
      # Install cbindgen before Rust to use recent default Rust version.
      - name: Install cbindgen
        run: cargo install cbindgen
      - name: Install Rust
        id: install_rust
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{matrix.rust}}
          targets: ${{matrix.arch}}-apple-darwin
      - name: Configure
        run: cmake -S. -Bbuild --log-level=DEBUG -G "${{ matrix.generator }}" "-DRust_TOOLCHAIN=${{steps.install_rust.outputs.name}}" --preset "${{ matrix.arch }}-apple-darwin-${{ matrix.compiler }}"
      - name: Run Tests
        working-directory: build
        run: ctest --output-on-failure --build-config Debug -j 3


  test_cxxbridge:
    name: Test cxxbridge integration
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os:
          - windows-2022
          - ubuntu-latest
          - macos-13
        include:
          # Should be in sync with the `cxx` version the Carg.lock of the cxxbridge tests,
          # otherwise the caching will not work and the cmd will be built from source.
          - cxxbridge_version: "1.0.86"
    steps:
      - uses: actions/checkout@v4
      - uses: actions/cache@v4
        id: cache_cxxbridge
        with:
          path: "~/.cargo/bin/cxxbridge*"
          key: ${{ runner.os }}-cxxbridge_${{ matrix.cxxbridge_version }}
      - name: Install cxxbridge
        if: steps.cache_cxxbridge.outputs.cache-hit != 'true'
        run: cargo install cxxbridge-cmd@${{ matrix.cxxbridge_version }}
      - name: Install lld
        run: sudo apt update && sudo apt install -y lld
        if: ${{ 'Linux' == runner.os }}
      - name: Setup MSVC Development Environment
        uses: ilammy/msvc-dev-cmd@v1
        if: runner.os == 'Windows'
      - name: Install CMake
        uses: lukka/get-cmake@519de0c7b4812477d74976b2523a9417f552d126
        with:
          cmakeVersion: "~3.22.0"
          ninjaVersion: "~1.10.0"
      - name: Install Rust
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: stable minus 2 releases
      - name: Configure
        run: >
          cmake
          -S.
          -Bbuild
          -GNinja
          -DCORROSION_VERBOSE_OUTPUT=ON
          -DCORROSION_TESTS_CXXBRIDGE=ON
      - name: Run Tests
        working-directory: build
        run: ctest --output-on-failure --build-config Debug -j 3 -R "^cxxbridge"

  autoinstall_cargo_target:
    name: Test Auto-installing Cargo target via rustup
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v4
      - name: Install CMake
        uses: lukka/get-cmake@519de0c7b4812477d74976b2523a9417f552d126
      - name: Install Rust
        id: install_rust
        uses: dtolnay/rust-toolchain@stable
      - name: Install Cross Compiler
        shell: bash
        run: |
          echo "::group::apt-install"
          sudo apt-get update
          sudo apt-get install -y gcc-aarch64-linux-gnu
          echo "::endgroup::"
      - name: Assert rustup target is not installed
        run: rustup show | ( ! grep aarch64)
      - name: Configure Corrosion
        run: cmake -S. -Bbuild -GNinja -DRust_RUSTUP_INSTALL_MISSING_TARGET=ON --preset "aarch64-unknown-linux-gnu-gcc"
      - name: Check rustup target is installed after configuring
        run: rustup show | grep aarch64

  install:
    name: Test Corrosion as a Library
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os:
          - windows-2022
          - ubuntu-latest
          - macos-13
        include:
          - rust: 1.54.0

    steps:
      - uses: actions/checkout@v4
      - name: Setup MSVC Development Environment
        uses: ilammy/msvc-dev-cmd@v1
        if: runner.os == 'Windows'
      - name: Install CMake
        uses: lukka/get-cmake@519de0c7b4812477d74976b2523a9417f552d126
        with:
          cmakeVersion: "~3.22.0"
          ninjaVersion: "~1.10.0"
      # Install cbindgen before Rust to use recent default Rust version.
      - name: Install cbindgen
        run: cargo install cbindgen
      - name: Install Rust
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{matrix.rust}}
      - name: Test Corrosion as installed module
        run: >
          cmake
          -S.
          -Bbuild
          -GNinja
          -DCORROSION_VERBOSE_OUTPUT=ON
          -DCMAKE_BUILD_TYPE=Release
          -DCORROSION_TESTS_INSTALL_CORROSION=ON
          &&
          cd build
          &&
          ctest --output-on-failure -C Release -j 3

  # We want an "accumulation" job here because it is easier to specify required
  # jobs here via needs, then in the github UI, since we use matrix jobs.
  ci-success:
    name: bors-ci-status
    if: ${{ always() }}
    needs:
      - visual_studio_stage2
      - windows_ninja_cl
      - windows_gnu
      - windows_gnullvm_msys2
      - linux_stage2
      - darwin
      - test_cxxbridge
      - autoinstall_cargo_target
      - install
    runs-on: ubuntu-latest
    # Step copied from: https://github.com/cross-rs/cross/blob/80c9f9109a719ffb0f694060ddc6e371d5b3a540/.github/workflows/ci.yml#L361
    steps:
      - name: Result
        run: |
          jq -C <<< "${needs}"
          # Check if all needs were successful or skipped.
          "$(jq -r 'all(.result as $result | (["success", "skipped"] | contains([$result])))' <<< "${needs}")"
        env:
          needs: ${{ toJson(needs) }}