# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0

# Azure template for installing dependencies from various package managers,
# necessary for building, testing, and packaging OpenTitan.
#
# This template can be included from pipelines in other repositories.
# In this case, set the the REPO_TOP parameter to point to the root of the
# checked out opentitan repository.
#
# This template executes:
# - apt-get (*) install for all packages listed in apt-requirements.txt
# - pip install for all packages listed in python-requirements.txt
#
# * As an optimization, apt-fast is used instead of apt-get if it is available.

parameters:
- name: REPO_TOP
  type: string
  default: .

steps:
  - bash: |
      set -e

      # Use apt-fast if available for faster installation.
      if command -v apt-fast >/dev/null; then
        APT_CMD=apt-fast
      else
        APT_CMD=apt-get
      fi

      cd "${{ parameters.REPO_TOP }}"

      # Install verilator from experimental OBS repository
      # apt-requirements.txt doesn't cover this dependency as we don't support
      # using the repository below for anything but our CI (yet).
      EDATOOLS_REPO_KEY="https://download.opensuse.org/repositories/home:phiwag:edatools/xUbuntu_$(lsb_release -sr)/Release.key"
      EDATOOLS_REPO="deb http://download.opensuse.org/repositories/home:/phiwag:/edatools/xUbuntu_$(lsb_release -sr)/ /"
      curl -sL "$EDATOOLS_REPO_KEY" | sudo apt-key add -
      sudo sh -c "echo \"$EDATOOLS_REPO\" > /etc/apt/sources.list.d/edatools.list"

      cp apt-requirements.txt apt-requirements-ci.txt
      echo "verilator-$(VERILATOR_VERSION)" >> apt-requirements-ci.txt
      cat apt-requirements-ci.txt

      # Ensure apt package index is up-to-date.
      sudo $APT_CMD update

      # NOTE: We use sed to remove all comments from apt-requirements-ci.txt,
      # since apt-get/apt-fast doesn't actually provide such a feature.
      sed 's/#.*//' apt-requirements-ci.txt \
        | xargs sudo $APT_CMD install -y

      # Python requirements are installed to the local user directory so prepend
      # appropriate bin directory to the PATH
      export PATH=$HOME/.local/bin:$PATH

      # Explicitly updating pip and setuptools is required to have these tools
      # properly parse Python-version metadata, which some packages uses to
      # specify that an older version of a package must be used for a certain
      # Python version. If that information is not read, pip installs the latest
      # version, which then fails to run.
      python3 -m pip install --user -U pip setuptools

      pip3 install --user -r python-requirements.txt

      # Install Verible
      mkdir -p build/verible
      cd build/verible
      curl -Ls -o verible.tar.gz "https://github.com/google/verible/releases/download/$(VERIBLE_VERSION)/verible-$(VERIBLE_VERSION)-Ubuntu-$(lsb_release -sr)-$(lsb_release -sc)-x86_64.tar.gz"
      sudo mkdir -p /tools/verible && sudo chmod 777 /tools/verible
      tar -C /tools/verible -xf verible.tar.gz --strip-components=1

      # Propagate PATH changes to all subsequent steps of the job
      echo "##vso[task.setvariable variable=PATH]/tools/verible/bin:$PATH"
    displayName: 'Install package dependencies'
