# Part of the Carbon Language project, under the Apache License v2.0 with LLVM
# Exceptions. See /LICENSE for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

name: Setup build environment (Ubuntu)
runs:
  using: composite
  steps:
    # Ubuntu images start with ~23GB available; this takes a few seconds to add
    # ~22GB more.
    #
    # Although we could delete more, if we run into a limit, not deleting
    # everything provides a little flexibility to get space while trying
    # to shrink the build.
    - name: Free up disk space
      uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1
      with:
        android: true
        dotnet: true
        haskell: true
        # Enabling large-packages adds ~3 minutes to save ~4GB, so turn it off
        # to save time.
        large-packages: false

    # Cache and install a recent version of LLVM. This uses the GitHub action
    # cache to avoid directly downloading on each iteration and improve
    # reliability.
    - name: Cache LLVM and Clang installation
      id: cache-llvm-ubuntu
      uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4.2.0
      with:
        path: ~/llvm
        key: LLVM-19.1.7-Cache-ubuntu-${{ runner.arch }}

    - name: Download LLVM and Clang installation
      if: steps.cache-llvm-ubuntu.outputs.cache-hit != 'true'
      shell: bash
      run: |
        cd ~
        LLVM_RELEASE=19.1.7
        LLVM_TARBALL_NAME=LLVM-$LLVM_RELEASE-Linux-X64
        LLVM_PATH=~/llvm
        echo "*** Downloading $LLVM_RELEASE"
        wget --show-progress=off "https://github.com/llvm/llvm-project/releases/download/llvmorg-$LLVM_RELEASE/$LLVM_TARBALL_NAME.tar.xz"
        echo "*** Extracting $LLVM_TARBALL_NAME.tar.xz"
        mkdir $LLVM_PATH
        tar -xJf $LLVM_TARBALL_NAME.tar.xz --strip-components=1 -C $LLVM_PATH
        echo "*** Deleting $LLVM_TARBALL_NAME.tar.xz"
        rm $LLVM_TARBALL_NAME.tar.xz
        echo "*** Testing `clang++ --version`"
        $LLVM_PATH/bin/clang++ --version
        # The installation contains *huge* parts of LLVM we don't need for the
        # toolchain. Prune them here to keep our cache small.
        echo "*** Cleaning the 'llvm' directory"
        rm $LLVM_PATH/lib/{*.a,*.so,*.so.*}
        rm $LLVM_PATH/bin/{flang-*,mlir-*,clang-{scan-deps,check,repl},*-test,llvm-{lto*,reduce,bolt*,exegesis,jitlink},bugpoint,opt,llc}
        echo "*** Size of the 'llvm' directory"
        du -hs $LLVM_PATH

    - name: Setup LLVM and Clang paths
      shell: bash
      run: |
        LLVM_PATH=~/llvm
        echo "Using ${LLVM_PATH}"
        echo "${LLVM_PATH}/bin" >> $GITHUB_PATH
        echo '*** ls "${LLVM_PATH}"'
        ls "${LLVM_PATH}"
        echo '*** ls "${LLVM_PATH}/bin"'
        ls "${LLVM_PATH}/bin"
