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) }}