name: CI
on:
  push:
    branches:
    - auto
    - try
  pull_request:
    branches:
    - master

jobs:
  style:
    name: Check Style
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@master
    - name: Install Rust
      run: rustup update nightly && rustup default nightly
    - run: ci/style.sh

  docs:
    name: Build Documentation
    needs: [style]
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@master
    - name: Install Rust
      run: rustup update nightly && rustup default nightly
    - run: ci/dox.sh
      env:
        CI: 1
    - name: Publish documentation
      run: |
        cd target/doc
        git init
        git add .
        git -c user.name='ci' -c user.email='ci' commit -m init
        git push -f -q https://git:${{ secrets.github_token }}@github.com/${{ github.repository }} HEAD:gh-pages
      if: github.event_name == 'push' && github.event.ref == 'refs/heads/master'

  verify:
    name: Automatic intrinsic verification
    needs: [style]
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@master
    - name: Install Rust
      run: rustup update nightly && rustup default nightly
    - run: cargo test --manifest-path crates/stdarch-verify/Cargo.toml

  env_override:
    name: Env Override
    needs: [style]
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@master
    - name: Install Rust
      run: rustup update nightly && rustup default nightly
    - run: RUST_STD_DETECT_UNSTABLE=avx cargo test --features=std_detect_env_override --manifest-path crates/std_detect/Cargo.toml env_override_no_avx

  test:
    needs: [style]
    name: Test
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        target:
        # Dockers that are run through docker on linux
        - i686-unknown-linux-gnu
        - x86_64-unknown-linux-gnu
        - x86_64-unknown-linux-gnu-emulated
        - arm-unknown-linux-gnueabihf
        - armv7-unknown-linux-gnueabihf
        - aarch64-unknown-linux-gnu
        - riscv64gc-unknown-linux-gnu
        - powerpc64le-unknown-linux-gnu
        - mips-unknown-linux-gnu
        - mips64-unknown-linux-gnuabi64
        - mips64el-unknown-linux-gnuabi64
        - s390x-unknown-linux-gnu
        - wasm32-wasi
        - i586-unknown-linux-gnu
        - x86_64-linux-android
        - arm-linux-androideabi
        - mipsel-unknown-linux-musl
        - aarch64-linux-android
        - nvptx64-nvidia-cuda
        - thumbv6m-none-eabi
        - thumbv7m-none-eabi
        - thumbv7em-none-eabi
        - thumbv7em-none-eabihf

        # macOS targets
        #- x86_64-apple-darwin
        - aarch64-apple-darwin
        # FIXME: gh-actions build environment doesn't have linker support
        # - i686-apple-darwin

        # Windows targets
        - x86_64-pc-windows-msvc
        - i686-pc-windows-msvc
        # FIXME: Disassembly not implemented for the # following targets:
        # - x86_64-pc-windows-gnu:
        # - i686-pc-windows-gnu:
        # - aarch64-pc-windows-msvc:

        include:
        - target: i686-unknown-linux-gnu
          os: ubuntu-latest
        - target: x86_64-unknown-linux-gnu
          os: ubuntu-latest
        - target: x86_64-unknown-linux-gnu-emulated
          os: ubuntu-latest
          test_everything: true
          rustflags: --cfg stdarch_intel_sde
        - target: arm-unknown-linux-gnueabihf
          os: ubuntu-latest
        - target: armv7-unknown-linux-gnueabihf
          os: ubuntu-latest
        - target: mips-unknown-linux-gnu
          os: ubuntu-latest
          norun: true
        - target: mips64-unknown-linux-gnuabi64
          os: ubuntu-latest
          norun: true
        - target: mips64el-unknown-linux-gnuabi64
          os: ubuntu-latest
          norun: true
        - target: powerpc64le-unknown-linux-gnu
          os: ubuntu-latest
          disable_assert_instr: true
        - target: s390x-unknown-linux-gnu
          os: ubuntu-latest
        - target: wasm32-wasi
          os: ubuntu-latest
        - target: aarch64-apple-darwin
          os: macos-latest
          norun: true
        - target: aarch64-unknown-linux-gnu
          os: ubuntu-latest
        - target: x86_64-apple-darwin
          os: macos-11
        - target: x86_64-pc-windows-msvc
          os: windows-latest
        - target: i686-pc-windows-msvc
          os: windows-latest
        - target: i586-unknown-linux-gnu
          os: ubuntu-latest
        - target: x86_64-linux-android
          os: ubuntu-latest
          disable_assert_instr: 1
        - target: arm-linux-androideabi
          os: ubuntu-latest
          disable_assert_instr: 1
        - target: mipsel-unknown-linux-musl
          os: ubuntu-latest
          norun: 1
        - target: aarch64-linux-android
          os: ubuntu-latest
          disable_assert_instr: 1
        - target: nvptx64-nvidia-cuda
          os: ubuntu-latest
        - target: thumbv6m-none-eabi
          os: ubuntu-latest
        - target: thumbv7m-none-eabi
          os: ubuntu-latest
        - target: thumbv7em-none-eabi
          os: ubuntu-latest
        - target: thumbv7em-none-eabihf
          os: ubuntu-latest
        - target: riscv64gc-unknown-linux-gnu
          os: ubuntu-latest

    steps:
    - uses: actions/checkout@master
      with:
        submodules: recursive
    - name: Install Rust (rustup)
      run: |
        rustup update nightly --no-self-update
        rustup default nightly
      if: matrix.os != 'macos-latest'
    - name: Install Rust (macos)
      run: |
        curl https://sh.rustup.rs | sh -s -- -y --default-toolchain nightly
        echo "$HOME/.cargo/bin" >> $GITHUB_PATH
        rustup update nightly --no-self-update
        rustup default nightly
      if: matrix.os == 'macos-latest'
    - run: |
        rustup default nightly
        rustup target add ${{ matrix.target }}
      if: "!endsWith(matrix.target, 'emulated')"
    - name: Setup (aarch64-apple-darwin)
      run: |
        echo "SDKROOT=$(xcrun -sdk macosx11.0 --show-sdk-path)" >> $GITHUB_ENV
        echo "MACOS_DEPLOYMENT_TARGET=$(xcrun -sdk macosx11.0 --show-sdk-platform-version)" >> $GITHUB_ENV
      if: matrix.target == 'aarch64-apple-darwin'
    - run: cargo generate-lockfile

    # Configure some env vars based on matrix configuration
    - run: echo "NORUN=1" >> $GITHUB_ENV
      if: matrix.norun != '' || startsWith(matrix.target, 'thumb') || matrix.target == 'nvptx64-nvidia-cuda'
    - run: echo "STDARCH_TEST_EVERYTHING=1" >> $GITHUB_ENV
      if: matrix.test_everything != ''
    - run: echo "RUSTFLAGS=${{ matrix.rustflags }}" >> $GITHUB_ENV
      if: matrix.rustflags != ''
    - run: echo "STDARCH_DISABLE_ASSERT_INSTR=1" >> $GITHUB_ENV
      if: matrix.disable_assert_instr != ''
    - run: echo "NOSTD=1" >> $GITHUB_ENV
      if: startsWith(matrix.target, 'thumb') || matrix.target == 'nvptx64-nvidia-cuda'

    # Windows & OSX go straight to `run.sh` ...
    - run: ./ci/run.sh
      shell: bash
      if: matrix.os != 'ubuntu-latest' || startsWith(matrix.target, 'thumb')
      env:
        TARGET: ${{ matrix.target }}

    # ... while Linux goes to `run-docker.sh`
    - run: ./ci/run-docker.sh ${{ matrix.target }}
      shell: bash
      if: "matrix.os == 'ubuntu-latest' && !startsWith(matrix.target, 'thumb')"
      env:
        TARGET: ${{ matrix.target }}
