# Copyright 2022 The IREE Authors
#
# Licensed under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

name: CI

# A few notes:
#
# Variables:
# GitHub actions don't have variables or even support normal yaml anchors (they
# are specially disabled because...reasons?):
# See https://github.com/github-community/community/discussions/4501
# https://github.community/t/support-for-yaml-anchors/16128/92
# https://github.com/actions/runner/issues/1182
# Neither does it have any contexts that are available everywhere. The
# top-level `env` field is available in many places, but not all. We already
# have a "setup" job that every other job depends on, so we leverage that
# for variables that every other job can use, since that *is* available in all
# sub-fields of the job.
# See https://docs.github.com/en/actions/learn-github-actions/contexts#context-availability
# and https://github.com/community/community/discussions/27370
#
# Runner label ordering:
# - self-hosted always has to be listed first in a runs-on block:
# https://docs.github.com/en/actions/hosting-your-own-runners/using-self-hosted-runners-in-a-workflow

on:
  workflow_dispatch:
  pull_request:
  push:
    branches:
      - main

concurrency:
  # A PR number if a pull request and otherwise the commit hash. This cancels
  # queued and in-progress runs for the same PR (presubmit) or commit
  # (postsubmit). The workflow name is prepended to avoid conflicts between
  # different workflows.
  group: ${{ github.workflow }}-${{ github.event.number || github.sha }}
  cancel-in-progress: true

# Jobs are organized into groups and topologically sorted by dependencies
jobs:
  setup:
    uses: ./.github/workflows/setup.yml

  runtime:
    needs: setup
    name: "runtime :: ${{ matrix.name }}"
    if: contains(fromJson(needs.setup.outputs.enabled-jobs), 'runtime')
    runs-on: ${{ matrix.runs-on }}
    defaults:
      run:
        shell: bash
    strategy:
      fail-fast: false
      matrix:
        include:
          - name: ubuntu-20.04
            runs-on: ubuntu-20.04
            driver-options: -DIREE_HAL_DRIVER_CUDA=ON -DIREE_HAL_DRIVER_HIP=ON -DIREE_HAL_DRIVER_VULKAN=ON
          - name: windows-2022
            runs-on: windows-2022
            driver-options: -DIREE_HAL_DRIVER_CUDA=ON -DIREE_HAL_DRIVER_HIP=ON -DIREE_HAL_DRIVER_VULKAN=ON
          - name: macos-14
            runs-on: macos-14
            driver-options: -DIREE_HAL_DRIVER_METAL=ON -DIREE_HAL_DRIVER_VULKAN=OFF
    env:
      BUILD_DIR: build-runtime
    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
      - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5.3.0
        with:
          python-version: "3.11"

      - name: (Linux) Install requirements
        if: contains(matrix.name, 'ubuntu')
        run: |
          sudo apt update
          sudo apt install -y ninja-build
          echo "CC=clang" >> $GITHUB_ENV
          echo "CXX=clang++" >> $GITHUB_ENV
      - name: (Windows) Configure MSVC
        if: contains(matrix.name, 'windows')
        uses: ilammy/msvc-dev-cmd@0b201ec74fa43914dc39ae48a89fd1d8cb592756 # v1.13.0
      - name: (macOS) Install requirements
        if: contains(matrix.name, 'macos')
        run: brew install ninja ccache coreutils bash

      - name: Checkout runtime submodules
        run: bash ./build_tools/scripts/git/update_runtime_submodules.sh
      - name: Install Python requirements
        run: pip install -r ./runtime/bindings/python/iree/runtime/build_requirements.txt
      - name: ccache
        uses: hendrikmuhs/ccache-action@ed74d11c0b343532753ecead8a951bb09bb34bc9 # v1.2.14
        with:
          key: ${{ github.job }}-${{ matrix.name }}
          save: ${{ needs.setup.outputs.write-caches == 1 }}
      - name: CMake - configure
        run: |
          cmake \
            -G Ninja \
            -B ${BUILD_DIR} \
            -DCMAKE_BUILD_TYPE=RelWithDebInfo \
            -DCMAKE_C_COMPILER_LAUNCHER=ccache \
            -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
            -DIREE_BUILD_COMPILER=OFF \
            -DIREE_BUILD_PYTHON_BINDINGS=ON \
            -DIREE_BUILD_SAMPLES=ON \
            -DIREE_ENABLE_LLD=ON \
            -DIREE_ENABLE_ASSERTIONS=ON \
            ${{matrix.driver-options}}
      - name: CMake - build
        run: cmake --build ${BUILD_DIR} -- -k 0
      - name: CTest
        run: bash ./build_tools/cmake/ctest_all.sh "${BUILD_DIR}"

  runtime_small:
    needs: setup
    if: contains(fromJson(needs.setup.outputs.enabled-jobs), 'runtime_small')
    runs-on: ubuntu-20.04
    env:
      BUILD_DIR: build-runtime
      CC: clang
      CXX: clang++
    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
      - name: Install requirements
        run: sudo apt update && sudo apt install -y ninja-build
      - name: Checkout runtime submodules
        run: bash ./build_tools/scripts/git/update_runtime_submodules.sh
      - name: ccache
        uses: hendrikmuhs/ccache-action@ed74d11c0b343532753ecead8a951bb09bb34bc9 # v1.2.14
        with:
          key: ${{ github.job }}
          save: ${{ needs.setup.outputs.write-caches == 1 }}
      - name: CMake - configure
        run: |
          cmake \
            -G Ninja \
            -B ${BUILD_DIR} \
            -DCMAKE_BUILD_TYPE=MinSizeRel \
            -DCMAKE_C_COMPILER_LAUNCHER=ccache \
            -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
            -DIREE_BUILD_COMPILER=OFF \
            -DIREE_RUNTIME_OPTIMIZATION_PROFILE=size \
            -DIREE_ENABLE_LLD=ON
      - name: CMake - build
        run: cmake --build ${BUILD_DIR} -- -k 0
      - name: CTest
        run: bash ./build_tools/cmake/ctest_all.sh "${BUILD_DIR}"

  runtime_tracing:
    needs: setup
    name: "runtime_tracing :: ${{ matrix.provider }} provider"
    if: contains(fromJson(needs.setup.outputs.enabled-jobs), 'runtime_tracing')
    runs-on: ubuntu-20.04
    strategy:
      fail-fast: false
      matrix:
        include:
          - provider: tracy
          - provider: console
    env:
      BUILD_DIR: build-tracing
      CC: clang
      CXX: clang++
      TRACING_PROVIDER: ${{ matrix.provider }}
    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
      - name: Install requirements
        run: sudo apt update && sudo apt install -y ninja-build
      - name: Checkout runtime submodules
        run: bash ./build_tools/scripts/git/update_runtime_submodules.sh
      - name: ccache
        uses: hendrikmuhs/ccache-action@ed74d11c0b343532753ecead8a951bb09bb34bc9 # v1.2.14
        with:
          key: ${{ github.job }}-${{ matrix.provider }}
          save: ${{ needs.setup.outputs.write-caches == 1 }}
      - name: CMake - configure
        run: |
          cmake \
            -G Ninja \
            -B ${BUILD_DIR} \
            -DCMAKE_BUILD_TYPE=RelWithDebInfo \
            -DCMAKE_C_COMPILER_LAUNCHER=ccache \
            -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
            -DIREE_BUILD_COMPILER=OFF \
            -DIREE_ENABLE_LLD=ON \
            -DIREE_ENABLE_RUNTIME_TRACING=ON \
            -DIREE_TRACING_PROVIDER=${TRACING_PROVIDER} \
            -DIREE_HAL_DRIVER_CUDA=ON \
            -DIREE_HAL_DRIVER_HIP=ON
      - name: CMake - build
        run: cmake --build ${BUILD_DIR} -- -k 0

  ##############################################################################

  # Aggregate job status and alerting on failures.
  ci_summary:
    if: always()
    needs:
      - setup
      - runtime
      - runtime_small
      - runtime_tracing
    uses: ./.github/workflows/workflow_summary.yml
    secrets: inherit
    with:
      jobs-json: ${{ toJson(needs) }}
