jobs:

  #######
  # Linux
  #######

  - job: Linux
    pool:
      vmImage: 'ubuntu-latest'

    strategy:
      matrix:
        py39-170:
          python.version: '3.9'
          ort.version: '1.7.0'
          ortlib.version: '38443267'
        py37-160:
          python.version: '3.7'
          ort.version: '1.6.0'
          ortlib.version: '34858191'
      maxParallel: 2

    steps:
      - task: DownloadGitHubRelease@0
        inputs:
          connection: 'microsoft'
          userRepository: 'microsoft/onnxruntime'
          defaultVersionType: 'specificVersion'
          version: '$(ortlib.version)'
          itemPattern: '*-linux-x64-$(ort.version)*'
          downloadPath: '$(Build.sourcesdirectory)'
        displayName: Download the ONNXRuntime prebuilt package.

      - task: ExtractFiles@1
        inputs:
          archiveFilePatterns: '**/*.tgz'
          destinationFolder: '$(Build.sourcesdirectory)'
          cleanDestinationFolder: false
          overwriteExistingFiles: true
        displayName: Unpack ONNXRuntime package.

      - script: |
          sh ./build.sh -DONNXRUNTIME_LIB_DIR=onnxruntime-linux-x64-$(ort.version)/lib -DOCOS_ENABLE_CTEST=ON
        displayName: build the customop library with onnxruntime

      - script: |
          cd out/Linux
          ctest -C RelWithDebInfo
        displayName: Run C++ native tests

      - task: UsePythonVersion@0
        inputs:
          versionSpec: '$(python.version)'
          addToPath: true

      - script: |
          python -m pip install --upgrade pip
          python -m pip install --upgrade setuptools
          python -m pip install -r requirements.txt
        displayName: Install requirements.txt

      - script: |
          python setup.py develop
        displayName: Build the library and tests

      - script: python -m pip install torch==1.7.1+cpu torchvision==0.8.2+cpu torchaudio==0.7.2 -f https://download.pytorch.org/whl/torch_stable.html
        displayName: Install pytorch

      - script: python -m pip install -r requirements-dev.txt
        displayName: Install requirements-dev.txt

      - script: python -m pytest test --verbose
        displayName: Run python test


  ###########
  # macOS C++
  ###########

  - job: MacOSC
    pool:
      vmImage: 'macOS-latest'

    strategy:
      matrix:
        ort-170:
          ort.version: '1.7.0'
          ortlib.version: '38443267'
        ort-160:
          ort.version: '1.6.0'
          ortlib.version: '34858191'
      maxParallel: 2

    steps:
      # needed for onnxruntime
      - script: brew install libomp
        displayName: 'Install omp'

      - task: DownloadGitHubRelease@0
        inputs:
          connection: 'microsoft'
          userRepository: 'microsoft/onnxruntime'
          defaultVersionType: 'specificVersion'
          version: '$(ortlib.version)'
          itemPattern: '*-osx-x64-$(ort.version)*'
          downloadPath: '$(Build.sourcesdirectory)'
        displayName: Download the ONNXRuntime prebuilt package.

      - task: ExtractFiles@1
        inputs:
          archiveFilePatterns: '**/*.tgz'
          destinationFolder: '$(Build.sourcesdirectory)'
          cleanDestinationFolder: false
          overwriteExistingFiles: true
        displayName: Unpack ONNXRuntime package.

      - script: |
          sh ./build.sh -DONNXRUNTIME_LIB_DIR=onnxruntime-osx-x64-$(ort.version)/lib -DOCOS_ENABLE_CTEST=ON
        displayName: build the customop library with onnxruntime

      - script: |
          cd out/Darwin
          ctest -C RelWithDebInfo
        displayName: Run C++ native tests

  #############
  # macOS Wheel
  #############

  - job: MacOSWheel
    pool:
      vmImage: 'macOS-latest'

    strategy:
      matrix:
        py39-170:
          python.version: '3.9'
          ort.version: '1.7.0'
        py38-170:
          python.version: '3.8'
          ort.version: '1.7.0'
        py37-170:
          python.version: '3.7'
          ort.version: '1.7.0'
        py36-170:
          python.version: '3.6'
          ort.version: '1.7.0'
      maxParallel: 1

    steps:
      # needed for onnxruntime
      - script: brew install libomp
        displayName: 'Install omp'

      - task: UsePythonVersion@0
        inputs:
          versionSpec: '$(python.version)'
          addToPath: true

      - script: |
          python -m pip install --upgrade pip
          python -m pip install --upgrade setuptools
          python -m pip install --upgrade wheel
          python -m pip install -r requirements.txt
        displayName: Install requirements.txt

      - script: python -c "import onnxruntime;print(onnxruntime.__version__)"
        displayName: Check installation

      - script: |
          python setup.py bdist_wheel
          for file in dist/*.whl; do python -m pip install --upgrade $file; done
        displayName: Build and install the wheel

      - script: python -m pip install -r requirements-dev.txt
        displayName: Install requirements-dev.txt

      - script: python -m pip install torch torchvision torchaudio
        displayName: Install pytorch

      - script: cd test && python -m pytest . --verbose
        displayName: Run python test

      - task: PublishPipelineArtifact@0
        inputs:
          artifactName: 'wheel-macos-$(python.version)'
          targetPath: 'dist'

  #########
  # Windows C++
  #########

  - job: WindowsC
    pool:
      vmImage: 'windows-latest'

    strategy:
      matrix:
        ort-170:
          ort.version: '1.7.0'
          ortlib.version: '38443267'
        ort-160:
          ort.version: '1.6.0'
          ortlib.version: '34858191'
      maxParallel: 2

    steps:
      - task: DownloadGitHubRelease@0
        inputs:
          connection: 'microsoft'
          userRepository: 'microsoft/onnxruntime'
          defaultVersionType: 'specificVersion'
          version: '$(ortlib.version)'
          itemPattern: '*-win-x64-$(ort.version)*'
          downloadPath: '$(Build.sourcesdirectory)'
        displayName: Download the ONNXRuntime prebuilt package.

      - task: ExtractFiles@1
        inputs:
          archiveFilePatterns: '**/*.zip'
          destinationFolder: '$(Build.sourcesdirectory)'
          cleanDestinationFolder: false
          overwriteExistingFiles: true
        displayName: Unpack ONNXRuntime package.

      - script: |
          call .\build.bat -DONNXRUNTIME_LIB_DIR=.\onnxruntime-win-x64-$(ort.version)\lib -DOCOS_ENABLE_CTEST=ON
        displayName: build the customop library with onnxruntime

      - script: |
          cd out/Windows
          ctest -C RelWithDebInfo
        displayName: Run C++ native tests

  ################
  # Windows wheels
  ################

  - job: WindowsWheel
    pool:
      vmImage: 'windows-latest'

    strategy:
      matrix:
        py39-170:
          python.version: '3.9'
          ort.version: '1.7.0'
        py38-170:
          python.version: '3.8'
          ort.version: '1.7.0'
        py37-170:
          python.version: '3.7'
          ort.version: '1.7.0'
        py36-170:
          python.version: '3.6'
          ort.version: '1.6.0'
      maxParallel: 1

    steps:
      - powershell: Write-Host "##vso[task.prependpath]$env:CONDA\Scripts"
        displayName: Add conda to PATH

      - script: conda create --yes --quiet --name pyenv -c conda-forge python=$(python.version) numpy
        displayName: Create Anaconda environment

      - script: |
          call activate pyenv
          python -m pip install --upgrade pip
          python -m pip install -r requirements.txt
          python -m pip install -r requirements-dev.txt
        displayName: Install requirements.txt

      - script: |
          call activate pyenv
          python setup.py bdist_wheel
        displayName: Build the wheel

      - script: |
          call activate pyenv
          python -m pip install --find-links=dist\ onnxruntime-extensions
        displayName: Install the wheel

      - script: |
          call activate pyenv
          python -m pip install torch==1.7.1+cpu torchvision==0.8.2+cpu torchaudio===0.7.2 -f https://download.pytorch.org/whl/torch_stable.html
        displayName: Install pytorch

      - script: |
          call activate pyenv
          python -m pytest test
        displayName: Run python test

      - task: PublishPipelineArtifact@0
        inputs:
          artifactName: 'wheel-window-$(python.version)'
          targetPath: 'dist'

  #############
  # WebAssembly
  #############

  - job: WebAssembly
    pool:
      vmImage: 'ubuntu-latest'

    steps:
      - script: |
          cd $(Build.BinariesDirectory)
          git clone https://github.com/emscripten-core/emsdk
          emsdk/emsdk install latest
          emsdk/emsdk activate latest
        displayName: Setup emscripten pipeline

      - script: |
          sh ./build.sh -DCMAKE_TOOLCHAIN_FILE=$(Build.BinariesDirectory)/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake -DOCOS_ENABLE_SPM_TOKENIZER=OFF -DOCOS_ENABLE_PYTHON=OFF
        displayName: build the customop library with onnxruntime
    # TODO add unittest for webassembly
