# Builds release packages on supported platforms:
#   * main-dist-linux (CMake 'install')
#   * py-compiler-pkg (`iree-base-compiler` Python package)
#     * Linux, macOS, Windows
#     * All supported Python versions (e.g. 3.9, 3.10, 3.11)
#   * py-runtime-pkg (`iree-base-runtime` Python package)
#     * Linux, macOS, Windows
#     * All supported Python versions (e.g. 3.9, 3.10, 3.11)
#   * py-tf-compiler-tools-pkg (`iree-tools-[tf, tflite]`, pure Python packages)

name: Build Release Packages

# Note: this workflow is typically invoked by schedule_candidate_release.yml.
on:
  workflow_dispatch:
    inputs:
      package_suffix:
        description: "Suffix to append to package names"
        required: false
        default: ""
      legacy_package_version:
        description: "Version of the package"
        required: true
        default: "0.1a1"
      package_version:
        description: "Version of the package"
        required: true
      compiler_package_version:
        description: "Version of the iree-base-compiler package"
        required: true
      runtime_package_version:
        description: "Version of the iree-base-runtime package"
        required: true
      release_id:
        description: "Release id to upload artifacts to"
        default: ""
      commit:
        description: "Commit to check out"
        default: ""

jobs:
  # Note: For cross platform builds, it's useful to just generate the
  # metadata on Linux and pass that to later jobs using artifacts. The
  # metadata generation could also happen in a separate workflow and
  # might be moved.
  setup_metadata:
    runs-on: ubuntu-24.04
    steps:
      - name: Checkout repository
        uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
        with:
          path: "c" # Windows can hit path length limits, so use a short path.
          submodules: false
          ref: ${{ github.event.inputs.commit }}

      - name: Write version info (release)
        id: version_local
        shell: bash
        run: |
          # Note: `version_info.json` holds the CalVer version and is still used
          # for iree-tools-tf and iree-tools-tflite.
          cat << EOF > ./c/version_info.json
          {
            "package-suffix": "${{ github.event.inputs.package_suffix }}",
            "package-version": "${{ github.event.inputs.legacy_package_version }}",
            "iree-revision": "$(cd ./c && git rev-parse HEAD)"
          }
          EOF
          cat ./c/version_info.json

          echo "iree-dist"
          cat << EOF > ./c/version_local.json
          {
            "package-suffix": "${{ github.event.inputs.package_suffix }}",
            "package-version": "${{ github.event.inputs.package_version }}",
            "iree-revision": "$(cd ./c && git rev-parse HEAD)"
          }
          EOF
          cat ./c/version_local.json

          echo "iree-base-compiler"
          cat << EOF > ./c/compiler/version_local.json
          {
            "package-suffix": "${{ github.event.inputs.package_suffix }}",
            "package-version": "${{ github.event.inputs.compiler_package_version }}",
            "iree-revision": "$(cd ./c && git rev-parse HEAD)"
          }
          EOF
          cat ./c/compiler/version_local.json

          echo "iree-base-runtime"
          cat << EOF > ./c/runtime/version_local.json
          {
            "package-suffix": "${{ github.event.inputs.package_suffix }}",
            "package-version": "${{ github.event.inputs.runtime_package_version }}",
            "iree-revision": "$(cd ./c && git rev-parse HEAD)"
          }
          EOF
          cat ./c/runtime/version_local.json

      - name: Upload version_local.json
        uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0
        with:
          name: version_local
          path: |
            ./c/version_info.json
            ./c/version_local.json
            ./c/compiler/version_local.json
            ./c/runtime/version_local.json

  build_packages:
    name: "${{ matrix.build-family }} :: Build ${{ matrix.build-package }} Package"
    needs: setup_metadata
    runs-on: ${{ matrix.runs-on }}
    continue-on-error: ${{ matrix.experimental }}
    strategy:
      fail-fast: false
      matrix:
        include:
          # Ubuntu packages.
          - runs-on: ubuntu-20.04
            build-family: linux-x86_64
            build-package: main-dist-linux
            experimental: false
          - runs-on: ah-ubuntu_22_04-c7g_4x-50
            build-family: linux-aarch64
            build-package: main-dist-linux
            experimental: true
          - runs-on: ubuntu-20.04
            build-family: linux-x86_64
            build-package: py-compiler-pkg
            experimental: false
          - runs-on: ah-ubuntu_22_04-c7g_4x-50
            build-family: linux-aarch64
            build-package: py-compiler-pkg
            experimental: true
          - runs-on: ubuntu-20.04
            build-family: linux-x86_64
            build-package: py-runtime-pkg
            experimental: false
          - runs-on: ah-ubuntu_22_04-c7g_4x-50
            build-family: linux-aarch64
            build-package: py-runtime-pkg
            experimental: true
          - runs-on: ubuntu-20.04
            build-family: linux-x86_64
            build-package: py-tf-compiler-tools-pkg
            experimental: false

          # MacOS packages.
          # TODO(scotttodd): build on larger runner when available (self-hosted or GitHub)
          # - runs-on:
          #     - ${{ github.repository == 'iree-org/iree' && 'self-hosted' || 'macos-14' }}
          #     - os-family=macOS
          #     - runner-group=postsubmit
          - runs-on: macos-14
            build-family: macos
            build-package: py-compiler-pkg
            experimental: true
          - runs-on: macos-14
            build-family: macos
            build-package: py-runtime-pkg
            experimental: true

          # Windows packages.
          # TODO(scotttodd): build on larger runner when available (self-hosted or GitHub)
          # - runs-on:
          #     - ${{ github.repository == 'iree-org/iree' && 'windows-2022-64core' || 'windows-2022'}}
          - runs-on: windows-2022
            build-family: windows
            build-package: py-compiler-pkg
            experimental: true
          - runs-on: windows-2022
            build-family: windows
            build-package: py-runtime-pkg
            experimental: true

    env:
      # These are also set in: build_tools/python_deploy/build_linux_packages.sh
      MANYLINUX_X86_64_IMAGE: ghcr.io/iree-org/manylinux_x86_64@sha256:2e0246137819cf10ed84240a971f9dd75cc3eb62dc6907dfd2080ee966b3c9f4
      MANYLINUX_AARCH64_IMAGE: quay.io/pypa/manylinux_2_28_aarch64

    steps:
      - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
        with:
          path: "c" # Windows can hit path length limits, so use a short path.
          submodules: true
          ref: ${{ github.event.inputs.commit }}

      ##########################################################################
      # OS specific setup
      ##########################################################################

      - name: Install dependencies (Windows)
        if: "matrix.build-family == 'windows'"
        shell: powershell
        run: ./c/build_tools/python_deploy/install_windows_deps.ps1
      - name: "Configure MSVC (Windows)"
        if: "matrix.build-family == 'windows'"
        uses: ilammy/msvc-dev-cmd@0b201ec74fa43914dc39ae48a89fd1d8cb592756 # v1.13.0
      - name: Install dependencies (macOS)
        if: "matrix.build-family == 'macos'"
        run: sudo ./c/build_tools/python_deploy/install_macos_deps.sh

      ##########################################################################
      # Download version_info.json
      # Various tools will read this in order to embed release information.
      ##########################################################################

      - name: Download version_local.json
        uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
        with:
          name: version_local
          path: ./c/
          merge-multiple: true

      ##########################################################################
      # Build the main distribution tarball.
      # The main distribution consists of the project being built, installed
      # and archived. We have to split it per operating system, and Linux
      # is special because we build under a manylinux container which gives
      # broad compatibility. We use the Python based manylinux containers
      # since they come packaged with all dev tools we need. Note that the
      # manylinux containers have a default python 2.x with all supported
      # python versions under /opt/python (need to add one to the path). It
      # is not enough to just invoke it directly because then pip managed
      # console scripts (like cmake, ninja) will not be on the path.
      ##########################################################################
      - name: Main distribution (Linux for x86_64)
        if: "matrix.build-package == 'main-dist-linux' && matrix.build-family == 'linux-x86_64'"
        shell: bash
        run: |
          docker run --rm -w=/work \
            -v $PWD:/work \
            "${MANYLINUX_X86_64_IMAGE}" \
            bash -c 'export PATH=/opt/python/cp39-cp39/bin:$PATH; python ./c/build_tools/github_actions/build_dist.py main-dist'

      - name: Main distribution (Linux for Arm64)
        if: "matrix.build-package == 'main-dist-linux' && matrix.build-family == 'linux-aarch64'"
        shell: bash
        run: |
          docker run --rm -w=/work \
            -v $PWD:/work \
            "${MANYLINUX_AARCH64_IMAGE}" \
            bash -c 'export PATH=/opt/python/cp39-cp39/bin:$PATH; python ./c/build_tools/github_actions/build_dist.py main-dist'

      ##########################################################################
      # py-runtime-pkg
      # Builds the iree-base-runtime wheels.
      # One step per OS.
      ##########################################################################

      - name: Build runtime wheels (Linux, x86_64 and Arm64)
        if: "matrix.build-package == 'py-runtime-pkg' && contains(matrix.build-family, 'linux')"
        shell: bash
        env:
          package_suffix: ${{ github.event.inputs.package_suffix }}
          packages: "iree-base-runtime"
          output_dir: "${{ github.workspace }}/bindist"
        run: |
          [ -e ./bindist/* ] && rm ./bindist/*
          ./c/build_tools/python_deploy/build_linux_packages.sh

      - name: Build runtime wheels (MacOS)
        if: "matrix.build-package == 'py-runtime-pkg' && matrix.build-family == 'macos'"
        shell: bash
        env:
          package_suffix: ${{ github.event.inputs.package_suffix }}
          packages: "iree-base-runtime"
          output_dir: "${{ github.workspace }}/bindist"
          override_python_versions: "3.11 3.12 3.13"
        run: |
          [ -e ./bindist/* ] && rm ./bindist/*
          ./c/build_tools/python_deploy/build_macos_packages.sh

      - name: Build runtime wheels (Windows)
        if: "matrix.build-package == 'py-runtime-pkg' && matrix.build-family == 'windows'"
        shell: powershell
        env:
          package_suffix: ${{ github.event.inputs.package_suffix }}
          packages: "iree-base-runtime"
          output_dir: "${{ github.workspace }}/bindist"
          override_python_versions: "3.11 3.12 3.13"
        run: |
          if (Test-Path -Path "${{ github.workspace }}/bindist") {
            Remove-Item -Path "${{ github.workspace }}/bindist" -Recurse -Force
          }
          ./c/build_tools/python_deploy/build_windows_packages.ps1

      ##########################################################################
      # py-compiler-pkg
      # Builds the iree-base-compiler wheel.
      # One step per OS.
      ##########################################################################
      - name: Build compiler wheels (Linux, x86_64 and Arm64)
        if: "matrix.build-package == 'py-compiler-pkg' && contains(matrix.build-family, 'linux')"
        shell: bash
        env:
          package_suffix: ${{ github.event.inputs.package_suffix }}
          packages: "iree-base-compiler"
          output_dir: "${{ github.workspace }}/bindist"
        run: |
          [ -e ./bindist/* ] && rm ./bindist/*
          ./c/build_tools/python_deploy/build_linux_packages.sh

      - name: Build compiler wheels (MacOS)
        if: "matrix.build-package == 'py-compiler-pkg' && matrix.build-family == 'macos'"
        shell: bash
        env:
          package_suffix: ${{ github.event.inputs.package_suffix }}
          packages: "iree-base-compiler"
          output_dir: "${{ github.workspace }}/bindist"
          override_python_versions: "3.11 3.12 3.13"
        run: |
          [ -e ./bindist/* ] && rm ./bindist/*
          ./c/build_tools/python_deploy/build_macos_packages.sh

      - name: Build compiler wheels (Windows)
        if: "matrix.build-package == 'py-compiler-pkg' && matrix.build-family == 'windows'"
        shell: powershell
        env:
          package_suffix: ${{ github.event.inputs.package_suffix }}
          packages: "iree-base-compiler"
          output_dir: "${{ github.workspace }}/bindist"
          override_python_versions: "3.11 3.12 3.13"
        run: |
          if (Test-Path -Path "${{ github.workspace }}/bindist") {
            Remove-Item -Path "${{ github.workspace }}/bindist" -Recurse -Force
          }
          ./c/build_tools/python_deploy/build_windows_packages.ps1

      ##########################################################################
      # TF Compiler Tools
      # These wheels are not Python version specific and include only Python
      # code (no C/C++), so just build for one examplar python version on Linux.
      ##########################################################################

      - name: Build TF Compiler Tools wheels
        if: "matrix.build-package == 'py-tf-compiler-tools-pkg'"
        shell: bash
        run: |
          docker run --rm -w=/work \
            -v $PWD:/work \
            "${MANYLINUX_X86_64_IMAGE}" \
            bash -c 'export PATH=/opt/python/cp39-cp39/bin:$PATH; python ./c/build_tools/github_actions/build_dist.py py-tf-compiler-tools-pkg'

      - uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0
        with:
          name: wheels-${{ matrix.build-family }}-${{ matrix.build-package }}
          # We upload all wheels (which includes deps so that subsequent
          # steps can run without further fetching).
          path: ./bindist/*
          retention-days: 5

      # TODO: Upload the tar.bz2 files too when ready
      - name: Upload Release Assets
        if: github.event.inputs.release_id != ''
        id: upload-release-assets
        uses: dwenegar/upload-release-assets@5bc3024cf83521df8ebfadf00ad0c4614fd59148 # v1
        env:
          GITHUB_TOKEN: ${{ secrets.WRITE_ACCESS_TOKEN }}
        with:
          release_id: ${{ github.event.inputs.release_id }}
          # Only upload iree artifacts.
          assets_path: ./bindist/iree*.*

  validate_and_publish:
    name: "Trigger validate and publish release"
    needs: build_packages
    if: github.event.inputs.release_id != ''
    runs-on: ubuntu-20.04
    steps:
      - name: "Invoke workflow :: Validate and Publish Release"
        uses: benc-uk/workflow-dispatch@e2e5e9a103e331dad343f381a29e654aea3cf8fc # v1.2.4
        with:
          workflow: Validate and Publish Release
          token: ${{ secrets.WRITE_ACCESS_TOKEN }}
          ref: "${{ env.tag_name }}"
          inputs: '{"release_id": "${{ github.event.inputs.release_id }}", "package_version": "${{ github.event.inputs.package_version }}", "build_run_id": "${{ github.run_id }}"}'
