| #!/bin/bash |
| # Copyright 2022 The IREE Authors |
| # |
| # Licensed under the Apache License v2.0 with LLVM Exceptions. |
| # See https://llvm.org/LICENSE.txt for license information. |
| # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| |
| # While IREE can be built with a normal CUDA Toolkit installation, the compiler |
| # and runtime only actually depend on a very thin (platform independent) slice |
| # of it. Since a full install is very high overhead, this script downloads |
| # official NVIDIA distribution zip artifacts and extracts what we need to |
| # a location that our build is setup to handle. This is intended for CI |
| # systems but can also be used by end users who would like a foolproof |
| # way to make IREE minimally buildable with CUDA support. |
| # |
| # See: https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#tarball-zipfile-overview |
| # |
| # Usage: |
| # |
| # For personal use, fetch to your home directory (the IREE CMake build is |
| # configured to probe for an installation here): |
| # ./fetch_cuda_deps.sh $HOME/.iree_cuda_deps |
| # |
| # For system-wide (i.e. docker images): |
| # ./fetch_cuda_deps.sh /usr/local/iree_cuda_deps |
| set -e |
| |
| ARCH="$(uname -m)" |
| if [[ "${ARCH}" == "aarch64" ]]; then |
| echo "ERROR: Script does not support ${ARCH}." |
| exit 1 |
| fi |
| |
| TARGET_DIR="$1" |
| if [ -z "$TARGET_DIR" ]; then |
| echo "ERROR: Expected target directory (typically /usr/local/iree_cuda_deps for CI or $HOME/.iree_cuda_deps for local)" |
| exit 1 |
| fi |
| |
| DOWNLOAD_SCRIPT_URL="https://raw.githubusercontent.com/NVIDIA/build-system-archive-import-examples/main/parse_redist.py" |
| DOWNLOAD_DIR="$TARGET_DIR/download" |
| DOWNLOAD_SCRIPT_PATH="$DOWNLOAD_DIR/parse_redist.py" |
| |
| # Parameters to the download script. |
| # Look for an appropriate redistrib_*.json here to verify: |
| # https://developer.download.nvidia.com/compute/cuda/redist/ |
| VERSION="12.2.1" |
| PRODUCT="cuda" |
| OS="linux" |
| ARCH="x86_64" |
| |
| # Components that we need to fetch. |
| COMPONENTS=( |
| cuda_cccl # CXX Core Compute Libraries |
| cuda_nvcc # CUDA NVCC |
| cuda_cudart # CUDA Runtime |
| ) |
| |
| # Paths within the arch specific installation that we want to retain. |
| RETAIN_PATHS=( |
| LICENSE |
| nvvm/libdevice/libdevice.10.bc |
| include |
| ) |
| |
| echo "Extracting to $TARGET_DIR" |
| mkdir -p "$TARGET_DIR" |
| mkdir -p "$DOWNLOAD_DIR" |
| |
| # First fetch the download script to the tmp dir. |
| cd "$DOWNLOAD_DIR" |
| echo "Fetching download script from $DOWNLOAD_SCRIPT_URL" |
| curl -L "$DOWNLOAD_SCRIPT_URL" > "$DOWNLOAD_SCRIPT_PATH" |
| |
| # Then use the download script to fetch and flatten each component we want |
| # into the tmp dir. |
| # This will produce a unified directory tree under: |
| # flat/$OS-$ARCH |
| SRC_DIR="$DOWNLOAD_DIR/flat/${OS}-${ARCH}" |
| for component in ${COMPONENTS[@]}; do |
| echo "Downloading component $component" |
| python3 "$DOWNLOAD_SCRIPT_PATH" \ |
| --label "$VERSION" \ |
| --product "$PRODUCT" \ |
| --os "$OS" \ |
| --arch "$ARCH" \ |
| --component "$component" |
| |
| # Each component comes with a LICENSE file that we need to be able to |
| # overwrite. |
| chmod +w "${SRC_DIR}/LICENSE" |
| done |
| |
| if ! [ -d "$SRC_DIR" ]; then |
| echo "ERROR: Download did not produce expected source dir: $SRC_DIR" |
| exit 1 |
| fi |
| |
| for rel_path in ${RETAIN_PATHS[@]}; do |
| src_file="$SRC_DIR/$rel_path" |
| target_file="$TARGET_DIR/$rel_path" |
| echo "Copy $src_file -> $target_file" |
| mkdir -p "$(dirname $target_file)" |
| cp -Rf $src_file $target_file |
| done |
| |
| # Delete tmp directory (saves ~100MiB in docker images). |
| rm -Rf "$DOWNLOAD_DIR" |