name: Build on M1
on:
  pull_request:
    paths:
      - .github/workflows/build-m1-binaries.yml
  push:
    branches:
      - nightly
      - release/*
    tags:
      # NOTE: Binary build pipelines should only get triggered on release candidate builds
      # Release candidate tags look like: v1.11.0-rc1
      - v[0-9]+.[0-9]+.[0-9]+-rc[0-9]+
  workflow_dispatch:
env:
  CHANNEL: "nightly"
jobs:
  build_wheels:
    name: "Build TorchAudio M1 wheels"
    runs-on: macos-m1-12
    strategy:
      matrix:
        py_vers: [ "3.8", "3.9", "3.10" ]
    steps:
      - name: Checkout repository
        uses: actions/checkout@v2
      - name: Set CHANNEL (only for tagged pushes)
        if: ${{ github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags/') }}
        run: |
          # reference ends with an RC suffix
          if [[ ${GITHUB_REF_NAME} = *-rc[0-9]* ]]; then
            echo "CHANNEL=test" >> "$GITHUB_ENV"
          fi
      - name: Set Release CHANNEL (for release)
        if: ${{ (github.event_name == 'pull_request' && startsWith(github.base_ref, 'release')) || startsWith(github.ref, 'refs/heads/release') }}
        run: |
          echo "CHANNEL=test" >> "$GITHUB_ENV"
      - name: Build TorchAudio M1 wheel
        shell: arch -arch arm64 bash {0}
        env:
          ENV_NAME: conda-env-${{ github.run_id }}
          PY_VERS: ${{ matrix.py_vers }}
          CU_VERSION: cpu
          USE_FFMPEG: true
          USE_OPENMP: false
          USE_CUDA: false
          # Needed so that delocate puts files in places it can actually modify
          TMPDIR: ${{ runner.temp }}
        run: |
          echo $PATH
          . ~/miniconda3/etc/profile.d/conda.sh
          set -ex
          . packaging/pkg_helpers.bash
          # if we are uploading to test channell, our version consist only of the base: 0.x.x - no date string or suffix added
          if [[ $CHANNEL == "test" ]]; then
            setup_base_build_version
          else
            setup_build_version
          fi
          git submodule update --init --recursive
          export SOURCE_ROOT_DIR=$(pwd)
          export FFMPEG_ROOT="${SOURCE_ROOT_DIR}/third_party/ffmpeg"
          . packaging/ffmpeg/build.sh
          conda create -yp ${ENV_NAME} python=${PY_VERS} numpy cmake ninja wheel pkg-config
          conda run -p ${ENV_NAME} python3 -mpip install torch --pre --extra-index-url=https://download.pytorch.org/whl/${CHANNEL}
          conda run -p ${ENV_NAME} python3 -mpip install delocate
          conda run -p ${ENV_NAME} python3 setup.py bdist_wheel
          export PYTORCH_VERSION="$(conda run -p ${ENV_NAME} python3 -mpip show torch | grep ^Version: | sed 's/Version: *//')"
          conda run -p ${ENV_NAME} DYLD_FALLBACK_LIBRARY_PATH="${ENV_NAME}/lib" delocate-wheel -v --ignore-missing-dependencies dist/*.whl
          conda env remove -p ${ENV_NAME}
      - name: Test wheel
        shell: arch -arch arm64 bash {0}
        env:
          ENV_NAME: conda-test-env-${{ github.run_id }}
          PY_VERS: ${{ matrix.py_vers }}
        run: |
          . ~/miniconda3/etc/profile.d/conda.sh
          set -ex
          conda create -yp ${ENV_NAME} python=${PY_VERS} numpy
          conda run -p ${ENV_NAME} python3 -mpip install torch --pre --extra-index-url=https://download.pytorch.org/whl/${CHANNEL}
          conda run -p ${ENV_NAME} python3 -mpip install dist/*.whl
          # Test torch is importable, by changing cwd and running import commands
          conda run --cwd /tmp -p ${ENV_NAME} python3 -c "import torchaudio;print('torchaudio version is ', torchaudio.__version__)"
          conda run --cwd /tmp -p ${ENV_NAME} python3 -c "import torch;import torchaudio;torchaudio.set_audio_backend('sox_io')"
          conda env remove -p ${ENV_NAME}
      - name: Upload wheel to GitHub
        uses: actions/upload-artifact@v3
        with:
          name: torchaudio-py${{ matrix.py_vers }}-macos11-m1
          path: dist/
      - name: Upload wheel to S3
        if: ${{ github.event_name == 'push' && (github.event.ref == 'refs/heads/nightly' || startsWith(github.event.ref, 'refs/tags/')) }}
        shell: arch -arch arm64 bash {0}
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_PYTORCH_UPLOADER_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_PYTORCH_UPLOADER_SECRET_ACCESS_KEY }}
        run: |
          for pkg in dist/*; do
            aws s3 cp "$pkg" "s3://pytorch/whl/${CHANNEL}/cpu/" --acl public-read
          done
  build_conda:
    name: "Build TorchAudio M1 conda packages"
    runs-on: macos-m1-12
    strategy:
      matrix:
        py_vers: [ "3.8", "3.9", "3.10" ]
    steps:
      - name: Checkout repository
        uses: actions/checkout@v2
      - name: Set CHANNEL (only for tagged pushes)
        if: ${{ github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags/') }}
        run: |
          # reference ends with an RC suffix
          if [[ ${GITHUB_REF_NAME} = *-rc[0-9]* ]]; then
            echo "CHANNEL=test" >> "$GITHUB_ENV"
          fi
      - name: Set Release CHANNEL (for release)
        if: ${{ (github.event_name == 'pull_request' && startsWith(github.base_ref, 'release')) || startsWith(github.ref, 'refs/heads/release') }}
        run: |
          echo "CHANNEL=test" >> "$GITHUB_ENV"
      - name: Install conda-build and purge previous artifacts
        shell: arch -arch arm64 bash {0}
        run: |
          conda install -yq conda-build
          conda build purge-all
      - name: Build TorchAudio M1 conda package
        shell: arch -arch arm64 bash {0}
        env:
          ENV_NAME: conda-env-${{ github.run_id }}
          PY_VERS: ${{ matrix.py_vers }}
          CU_VERSION: cpu
          USE_FFMPEG: true
          USE_OPENMP: false
          USE_CUDA: false
        run: |
          set -ex
          . packaging/pkg_helpers.bash

          export CONDA_CHANNEL_FLAGS=""
          if [[ $CHANNEL == "test" ]]; then
            setup_cuda
            setup_base_build_version
            export CONDA_CHANNEL_FLAGS="-c pytorch-test"
            setup_macos
          else
            setup_cuda
            setup_build_version
            setup_macos
          fi
          export PYTORCH_VERSION="$(conda run -p ${ENV_NAME} python3 -mpip show torch | grep ^Version: | sed 's/Version: *//')"
          git submodule update --init --recursive
          export SOURCE_ROOT_DIR=$(pwd)
          export FFMPEG_ROOT="${SOURCE_ROOT_DIR}/third_party/ffmpeg"
          . packaging/ffmpeg/build.sh
          setup_conda_pytorch_constraint
          setup_conda_cudatoolkit_constraint
          setup_visual_studio_constraint
          conda build \
            -c defaults \
            $CONDA_CHANNEL_FLAGS \
            --no-anaconda-upload \
            --python "$PY_VERS" \
            --output-folder=dist/ \
            packaging/torchaudio
      - name: Upload package to GitHub
        uses: actions/upload-artifact@v3
        with:
          name: torchaudio-py${{ matrix.py_vers }}-macos11-m1-conda
          path: dist/
      - name: Upload package to conda
        if: ${{ github.event_name == 'push' && (github.event.ref == 'refs/heads/nightly' || startsWith(github.event.ref, 'refs/tags/')) }}
        shell: arch -arch arm64 bash {0}
        env:
          CONDA_PYTORCHBOT_TOKEN: ${{ secrets.CONDA_PYTORCHBOT_TOKEN }}
        run: |
          conda install -yq anaconda-client
          set -x
          export ANACONDA_PATH=$(conda info --base)/bin
          $ANACONDA_PATH/anaconda  -t "${CONDA_PYTORCHBOT_TOKEN}" upload dist/osx-arm64/*.tar.bz2 -u "pytorch-${CHANNEL}" --label main --no-progress --force

concurrency:
  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}-${{ github.event_name == 'workflow_dispatch' }}
  cancel-in-progress: true
