# 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
      echo rsync >> 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'
