You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

926 lines
35 KiB

#!/bin/bash
set -e
echo "🚀 Installing G1 Deploy system dependencies..."
sudo apt-get update && sudo apt-get install -y libgtest-dev
# Detect system type and architecture
ARCH=$(uname -m)
OS_ID=$(lsb_release -si 2>/dev/null || echo "Unknown")
OS_VERSION=$(lsb_release -sr 2>/dev/null || echo "Unknown")
# Common CUDA installation paths (used by multiple functions)
CUDA_PATHS=(
"/usr/local/cuda"
"/usr/local/cuda-12.6" # CUDA 12.6 on newer Jetson
"/usr/local/cuda-12.5" # CUDA 12.5 variant
"/usr/local/cuda-12.4" # CUDA 12.4 variant
"/usr/local/cuda-12" # Generic CUDA 12.x
"/usr/local/cuda-11.4" # Common on older Jetson
"/usr/local/cuda-10.2" # Common on older Jetson
"/usr/local/cuda-11"
"/usr/local/cuda-10"
"/opt/cuda"
"/usr/cuda"
)
# Common CUDA runtime library paths (used by multiple functions)
CUDA_RUNTIME_PATHS=(
"/usr/local/cuda/lib64/libcudart.so"
"/usr/local/cuda-12.6/lib64/libcudart.so"
"/usr/local/cuda-12.5/lib64/libcudart.so"
"/usr/local/cuda-12.4/lib64/libcudart.so"
"/usr/local/cuda-12/lib64/libcudart.so"
"/usr/local/cuda-11.4/lib64/libcudart.so"
"/usr/local/cuda-10.2/lib64/libcudart.so"
"/usr/lib/aarch64-linux-gnu/libcudart.so"
"/usr/lib/x86_64-linux-gnu/libcudart.so"
"/usr/lib64/libcudart.so"
"/usr/lib/libcudart.so"
)
# Common CUDA header paths (used by multiple functions)
CUDA_HEADER_PATHS=(
"/usr/local/cuda/include/cuda_runtime.h"
"/usr/local/cuda-12.6/include/cuda_runtime.h"
"/usr/local/cuda-12.5/include/cuda_runtime.h"
"/usr/local/cuda-12.4/include/cuda_runtime.h"
"/usr/local/cuda-12/include/cuda_runtime.h"
"/usr/local/cuda-11.4/include/cuda_runtime.h"
"/usr/local/cuda-10.2/include/cuda_runtime.h"
"/usr/local/cuda-11/include/cuda_runtime.h"
"/usr/include/cuda_runtime.h"
"/usr/include/cuda/cuda_runtime.h"
)
# Common utility functions
has_cuda_in_ldconfig() {
ldconfig -p 2>/dev/null | grep -q "libcudart\|libcuda"
}
# Update package cache (with deduplication)
update_package_cache() {
if [ "$PACKAGE_MANAGER" = "apt" ] && [ "$APT_UPDATED" != "true" ]; then
sudo apt-get update
export APT_UPDATED="true"
fi
}
# Enhanced Jetson detection
IS_JETSON=false
JETSON_MODEL=""
if [[ "$ARCH" == "aarch64" ]]; then
# Check for Jetson-specific indicators
if [[ -f "/etc/nv_tegra_release" ]] || \
[[ -d "/usr/src/jetson_multimedia_api" ]] || \
ls /etc/apt/sources.list.d/ 2>/dev/null | grep -q jetson || \
[[ -f "/proc/device-tree/model" && $(cat /proc/device-tree/model 2>/dev/null) =~ "Jetson" ]]; then
IS_JETSON=true
# Detect Jetson model for optimized package selection
if [[ -f "/proc/device-tree/model" ]]; then
JETSON_MODEL=$(cat /proc/device-tree/model 2>/dev/null | tr -d '\0' | sed 's/NVIDIA //')
echo "🤖 Jetson system detected: $JETSON_MODEL"
else
echo "🤖 Jetson system detected (model unknown)"
fi
# Check JetPack version if available
if command -v jetson_release &> /dev/null; then
JETPACK_VERSION=$(jetson_release -v 2>/dev/null | grep "JETPACK" | cut -d' ' -f2 || echo "unknown")
echo "📦 JetPack version: $JETPACK_VERSION"
fi
fi
fi
echo "🔍 System: $OS_ID $OS_VERSION ($ARCH)$([ "$IS_JETSON" = true ] && echo " - Jetson")"
# Detect the operating system and package manager
if command -v apt-get &> /dev/null; then
PACKAGE_MANAGER="apt"
elif command -v yum &> /dev/null; then
PACKAGE_MANAGER="yum"
elif command -v pacman &> /dev/null; then
PACKAGE_MANAGER="pacman"
else
echo "❌ Unsupported package manager. This script supports apt, yum, and pacman."
exit 1
fi
# Function to install packages based on the package manager
install_packages() {
case $PACKAGE_MANAGER in
apt)
update_package_cache
sudo apt-get install -y "$@"
;;
yum)
sudo yum install -y "$@"
;;
pacman)
sudo pacman -S --noconfirm "$@"
;;
esac
}
echo "📦 Installing base development tools..."
case $PACKAGE_MANAGER in
apt)
if [ "$IS_JETSON" = true ]; then
echo "🤖 Installing packages optimized for Jetson system..."
# Jetson systems may have some tools pre-installed
JETSON_PACKAGES="build-essential clang cmake git git-lfs pkg-config patchelf zlib1g-dev curl wget"
# Add optional packages if available
if apt-cache show cmake-format &>/dev/null; then
JETSON_PACKAGES="$JETSON_PACKAGES cmake-format"
fi
if apt-cache show cppcheck &>/dev/null; then
JETSON_PACKAGES="$JETSON_PACKAGES cppcheck"
fi
install_packages $JETSON_PACKAGES
else
install_packages \
build-essential \
clang \
cmake \
cmake-format \
cppcheck \
git \
git-lfs \
pkg-config \
patchelf \
zlib1g-dev \
curl \
wget
fi
;;
yum)
install_packages \
gcc \
gcc-c++ \
clang \
cmake \
cppcheck \
git \
git-lfs \
pkgconfig \
patchelf \
zlib-devel \
curl \
wget
;;
pacman)
install_packages \
base-devel \
clang \
cmake \
cppcheck \
git \
git-lfs \
pkgconf \
patchelf \
zlib \
curl \
wget
;;
esac
echo "📚 Installing C++ libraries..."
case $PACKAGE_MANAGER in
apt)
install_packages \
libyaml-cpp-dev \
libeigen3-dev \
libmsgpack-dev \
libzmq3-dev \
nlohmann-json3-dev \
libgtest-dev
;;
yum)
install_packages \
yaml-cpp-devel \
eigen3-devel \
msgpack-devel \
zeromq-devel \
cppzmq-devel \
nlohmann-json-devel \
gtest-devel
;;
pacman)
install_packages \
yaml-cpp \
eigen \
msgpack-cxx \
zeromq \
cppzmq \
nlohmann-json \
gtest
;;
esac
# Ensure ZeroMQ C++ headers (cppzmq) are available.
# On some Ubuntu releases (e.g., 24.04), the 'cppzmq' or 'libcppzmq-dev' package may be missing.
# If not found, vendor the header-only repo to third_party/cppzmq.
echo "🧩 Ensuring ZeroMQ C++ headers (cppzmq)..."
# Resolve repository root relative to this script
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
THIRD_PARTY_DIR="$REPO_ROOT/third_party"
have_cppzmq_header=false
if [ -f "/usr/include/zmq.hpp" ]; then
have_cppzmq_header=true
fi
if [ "$have_cppzmq_header" = false ]; then
if [ "$PACKAGE_MANAGER" = "apt" ]; then
# Try distro packages if available
if apt-cache policy cppzmq 2>/dev/null | grep -q "Candidate:" && \
! apt-cache policy cppzmq 2>/dev/null | grep -q "(none)"; then
update_package_cache
if sudo apt-get install -y cppzmq; then
have_cppzmq_header=true
fi
elif apt-cache policy libcppzmq-dev 2>/dev/null | grep -q "Candidate:" && \
! apt-cache policy libcppzmq-dev 2>/dev/null | grep -q "(none)"; then
update_package_cache
if sudo apt-get install -y libcppzmq-dev; then
have_cppzmq_header=true
fi
fi
fi
fi
if [ "$have_cppzmq_header" = false ]; then
echo "📦 Vendoring header-only cppzmq into third_party..."
mkdir -p "$THIRD_PARTY_DIR"
if [ ! -d "$THIRD_PARTY_DIR/cppzmq/.git" ]; then
if git clone --depth 1 https://github.com/zeromq/cppzmq.git "$THIRD_PARTY_DIR/cppzmq"; then
echo "✅ cppzmq headers cloned to $THIRD_PARTY_DIR/cppzmq"
echo " Add include path: -I$THIRD_PARTY_DIR/cppzmq"
else
echo "❌ Failed to clone cppzmq repo. Please install headers manually."
fi
else
if git -C "$THIRD_PARTY_DIR/cppzmq" pull --ff-only; then
echo "✅ cppzmq headers updated in $THIRD_PARTY_DIR/cppzmq"
else
echo "⚠️ Failed to update cppzmq headers. Using existing copy."
fi
fi
else
echo "✅ ZeroMQ C++ headers found in system includes"
fi
# Ensure JSON headers (nlohmann/json) are available (similar to cppzmq ensure)
echo "🧩 Ensuring JSON headers (nlohmann/json)..."
have_json_header=false
if [ -f "/usr/include/nlohmann/json.hpp" ] || [ -f "/usr/local/include/nlohmann/json.hpp" ]; then
have_json_header=true
fi
if [ "$have_json_header" = false ]; then
case $PACKAGE_MANAGER in
apt)
update_package_cache
sudo apt-get install -y nlohmann-json3-dev || true
;;
yum)
sudo yum install -y nlohmann-json-devel || true
;;
pacman)
sudo pacman -S --noconfirm nlohmann-json || true
;;
esac
if [ -f "/usr/include/nlohmann/json.hpp" ] || [ -f "/usr/local/include/nlohmann/json.hpp" ]; then
have_json_header=true
fi
fi
if [ "$have_json_header" = false ]; then
echo "📦 Vendoring nlohmann/json into third_party..."
# Reuse THIRD_PARTY_DIR from earlier cppzmq ensure block if set; otherwise define
if [ -z "$THIRD_PARTY_DIR" ]; then
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
THIRD_PARTY_DIR="$REPO_ROOT/third_party"
fi
mkdir -p "$THIRD_PARTY_DIR"
if [ ! -d "$THIRD_PARTY_DIR/nlohmann_json/.git" ]; then
if git clone --depth 1 https://github.com/nlohmann/json.git "$THIRD_PARTY_DIR/nlohmann_json"; then
echo "✅ nlohmann/json cloned to $THIRD_PARTY_DIR/nlohmann_json"
echo " Add include path: -I$THIRD_PARTY_DIR/nlohmann_json/single_include"
else
echo "❌ Failed to clone nlohmann/json. Please install headers manually."
fi
else
if git -C "$THIRD_PARTY_DIR/nlohmann_json" pull --ff-only; then
echo "✅ nlohmann/json updated in $THIRD_PARTY_DIR/nlohmann_json"
else
echo "⚠️ Failed to update nlohmann/json. Using existing copy."
fi
fi
else
echo "✅ JSON headers found in system includes"
fi
# Install Just command runner
echo "⚡ Installing Just command runner..."
if ! command -v just &> /dev/null; then
case $PACKAGE_MANAGER in
apt|yum)
# Install Just from GitHub releases for Ubuntu/Debian and RHEL/CentOS
JUST_VERSION="1.43.0"
JUST_ARCH=$(uname -m)
# Map architecture names to just release naming
case $JUST_ARCH in
x86_64)
JUST_ARCH_NAME="x86_64-unknown-linux-musl"
;;
aarch64|arm64)
JUST_ARCH_NAME="aarch64-unknown-linux-musl"
;;
armv7l)
JUST_ARCH_NAME="armv7-unknown-linux-musleabihf"
;;
arm*)
JUST_ARCH_NAME="arm-unknown-linux-musleabihf"
;;
*)
echo "❌ Unsupported architecture for just: $JUST_ARCH"
echo " Supported architectures: x86_64, aarch64, armv7l, arm"
exit 1
;;
esac
echo "📥 Downloading Just ${JUST_VERSION} for ${JUST_ARCH}..."
JUST_URL="https://github.com/casey/just/releases/download/${JUST_VERSION}/just-${JUST_VERSION}-${JUST_ARCH_NAME}.tar.gz"
curl -L "$JUST_URL" | tar xz -C /tmp
sudo mv /tmp/just /usr/local/bin/
;;
pacman)
install_packages just
;;
esac
else
echo "✅ Just is already installed"
fi
# Install ONNX Runtime
echo "🧠 Setting up ONNX Runtime..."
# Allow configurable installation path
ONNX_INSTALL_PATH="${ONNX_INSTALL_PATH:-/opt/onnxruntime}"
if [ ! -d "$ONNX_INSTALL_PATH" ]; then
ONNX_VERSION="1.16.3"
ONNX_ARCH=$(uname -m)
if [ "$ONNX_ARCH" = "x86_64" ]; then
ONNX_URL="https://github.com/microsoft/onnxruntime/releases/download/v${ONNX_VERSION}/onnxruntime-linux-x64-${ONNX_VERSION}.tgz"
elif [ "$ONNX_ARCH" = "aarch64" ]; then
# Same URL for all ARM64 systems (Jetson and regular ARM64)
ONNX_URL="https://github.com/microsoft/onnxruntime/releases/download/v${ONNX_VERSION}/onnxruntime-linux-aarch64-${ONNX_VERSION}.tgz"
if [ "$IS_JETSON" = true ]; then
echo "🤖 Jetson system detected - using ARM64 ONNX Runtime..."
fi
else
echo "❌ Unsupported architecture: $ONNX_ARCH"
exit 1
fi
echo "📥 Downloading ONNX Runtime ${ONNX_VERSION} for ${ONNX_ARCH}$([ "$IS_JETSON" = true ] && echo " (Jetson-optimized)")..."
cd /tmp
# Download with retry for Jetson systems (sometimes have slower network)
if [ "$IS_JETSON" = true ]; then
curl -L --retry 3 --retry-delay 2 "$ONNX_URL" -o onnxruntime.tgz
else
curl -L "$ONNX_URL" -o onnxruntime.tgz
fi
tar xzf onnxruntime.tgz
# Move to configured location (may need sudo for system paths)
ONNX_DIR=$(ls -d onnxruntime-linux-* | head -n1)
if [[ "$ONNX_INSTALL_PATH" =~ ^(/opt|/usr) ]]; then
# System path - needs sudo
sudo mv "$ONNX_DIR" "$ONNX_INSTALL_PATH"
sudo ln -sf "$ONNX_INSTALL_PATH/lib/libonnxruntime.so" /usr/local/lib/ 2>/dev/null || true
sudo ln -sf "$ONNX_INSTALL_PATH/include" /usr/local/include/onnxruntime 2>/dev/null || true
echo "$ONNX_INSTALL_PATH/lib" | sudo tee /etc/ld.so.conf.d/onnxruntime.conf
sudo ldconfig
else
# User path - no sudo needed
mv "$ONNX_DIR" "$ONNX_INSTALL_PATH"
# Create user-accessible symlinks if possible
if [ -w /usr/local/lib ]; then
ln -sf "$ONNX_INSTALL_PATH/lib/libonnxruntime.so" /usr/local/lib/ 2>/dev/null || true
fi
fi
# For Jetson systems, add to environment
if [ "$IS_JETSON" = true ]; then
echo "# ONNX Runtime for Jetson" | sudo tee -a /etc/environment
echo "LD_LIBRARY_PATH=\"$ONNX_INSTALL_PATH/lib:\$LD_LIBRARY_PATH\"" | sudo tee -a /etc/environment
fi
echo "✅ ONNX Runtime installed to $ONNX_INSTALL_PATH$([ "$IS_JETSON" = true ] && echo " with Jetson optimizations")"
else
echo "✅ ONNX Runtime is already installed at $ONNX_INSTALL_PATH"
fi
echo "💡 To install to a different location, set ONNX_INSTALL_PATH environment variable"
# Function to check for CUDA toolkit (nvcc compiler) - silent check
check_cuda_toolkit() {
# Check for nvcc in PATH
if command -v nvcc &> /dev/null; then
return 0
fi
# Check common CUDA installation paths (using shared variable)
for cuda_path in "${CUDA_PATHS[@]}"; do
if [ -f "$cuda_path/bin/nvcc" ]; then
return 0
fi
done
return 1
}
# Function to check for CUDA runtime libraries AND headers (needed for compilation)
check_cuda_runtime() {
# Check for CUDA runtime libraries
local has_libraries=false
if has_cuda_in_ldconfig; then
has_libraries=true
else
# Check specific paths for runtime libraries (using shared variable)
for lib_path in "${CUDA_RUNTIME_PATHS[@]}"; do
if [ -f "$lib_path" ]; then
has_libraries=true
break
fi
done
fi
# Check for CUDA headers (essential for compilation) - using shared variable
local has_headers=false
for header_path in "${CUDA_HEADER_PATHS[@]}"; do
if [ -f "$header_path" ]; then
has_headers=true
break
fi
done
# Need both libraries and headers
if [ "$has_libraries" = true ] && [ "$has_headers" = true ]; then
return 0
else
return 1
fi
}
# Check what CUDA components we have and provide clear, non-confusing output
echo "🔍 Checking CUDA installation..."
# Function to handle non-Jetson ARM64 systems
install_cuda_for_arm64() {
echo "🔧 Installing CUDA packages for ARM64 system..."
if sudo apt-get install -y cuda-cudart-dev-12-2 cuda-runtime-12-2 2>/dev/null || \
sudo apt-get install -y cuda-cudart-dev-11-8 cuda-runtime-11-8 2>/dev/null || \
sudo apt-get install -y libcudart-dev nvidia-cuda-runtime-cu12 2>/dev/null; then
echo "✅ CUDA runtime and development packages installed for ARM64!"
return 0
else
echo "❌ Failed to install CUDA packages for ARM64 system"
return 1
fi
}
# Function to handle x86_64 systems
install_cuda_for_x86_64() {
echo "🔧 Installing CUDA packages for x86_64 system..."
# Detect CUDA version from nvidia-smi if available
local DETECTED_CUDA_VERSION=""
if command -v nvidia-smi &> /dev/null; then
DETECTED_CUDA_VERSION=$(nvidia-smi | grep "CUDA Version:" | sed 's/.*CUDA Version: \([0-9]\+\.[0-9]\+\).*/\1/' | head -n1)
if [ -n "$DETECTED_CUDA_VERSION" ]; then
echo "📍 Detected CUDA $DETECTED_CUDA_VERSION from nvidia-smi"
fi
fi
# Check if NVIDIA CUDA repository is configured
local has_cuda_repo=false
if [ -f /etc/apt/sources.list.d/cuda*.list ] || \
grep -r "developer.download.nvidia.com/compute/cuda" /etc/apt/sources.list* &>/dev/null; then
has_cuda_repo=true
fi
# Add NVIDIA CUDA repository if not present
if [ "$has_cuda_repo" = false ]; then
echo "📦 NVIDIA CUDA repository not found, adding it now..."
# Detect Ubuntu version for correct repository
local ubuntu_version=""
if [ "$OS_ID" = "Ubuntu" ]; then
case "$OS_VERSION" in
22.04)
ubuntu_version="ubuntu2204"
;;
20.04)
ubuntu_version="ubuntu2004"
;;
24.04)
ubuntu_version="ubuntu2404"
;;
*)
# Default to 22.04 for unknown versions
ubuntu_version="ubuntu2204"
echo "⚠️ Ubuntu $OS_VERSION detected, using ubuntu2204 repository (may need adjustment)"
;;
esac
else
ubuntu_version="ubuntu2204"
echo "⚠️ Non-Ubuntu system detected, using ubuntu2204 repository (may not work)"
fi
# Download and install CUDA keyring
local cuda_keyring_url="https://developer.download.nvidia.com/compute/cuda/repos/${ubuntu_version}/x86_64/cuda-keyring_1.1-1_all.deb"
if [ -f /tmp/cuda-keyring.deb ]; then
rm /tmp/cuda-keyring.deb
fi
echo "📥 Downloading CUDA repository keyring for $ubuntu_version..."
if wget -q "$cuda_keyring_url" -O /tmp/cuda-keyring.deb 2>/dev/null; then
if sudo dpkg -i /tmp/cuda-keyring.deb 2>/dev/null; then
echo "✅ NVIDIA CUDA repository keyring installed"
# Force apt-get update after adding new repository
echo "🔄 Updating package cache with new CUDA repository..."
sudo apt-get update
has_cuda_repo=true
else
echo "⚠️ Failed to install CUDA keyring"
fi
rm -f /tmp/cuda-keyring.deb
else
echo "⚠️ Failed to download CUDA keyring from $cuda_keyring_url"
fi
# If keyring install failed, provide manual instructions
if [ "$has_cuda_repo" = false ]; then
echo ""
echo "⚠️ Automatic CUDA repository setup failed. Please add it manually:"
echo " wget https://developer.download.nvidia.com/compute/cuda/repos/${ubuntu_version}/x86_64/cuda-keyring_1.1-1_all.deb"
echo " sudo dpkg -i cuda-keyring_1.1-1_all.deb"
echo " sudo apt-get update"
echo ""
fi
else
echo "✅ NVIDIA CUDA repository already configured"
fi
# Try to install CUDA packages - prioritize detected version
local cuda_installed=false
if [ -n "$DETECTED_CUDA_VERSION" ]; then
# Convert version like "12.4" to package suffix like "12-4"
local version_suffix=$(echo "$DETECTED_CUDA_VERSION" | sed 's/\./-/')
echo "🎯 Attempting to install CUDA $DETECTED_CUDA_VERSION packages..."
# IMPORTANT: We need BOTH cuda-compiler (for complete headers) AND cuda-cudart-dev (for runtime)
# Try to install both together first
echo "📦 Installing cuda-compiler-${version_suffix} and cuda-cudart-dev-${version_suffix}..."
if sudo apt-get install -y cuda-compiler-${version_suffix} cuda-cudart-dev-${version_suffix}; then
echo "✅ CUDA $DETECTED_CUDA_VERSION compiler and runtime development packages installed!"
cuda_installed=true
else
# If combined install fails, try separately
echo "⚠️ Combined install failed, trying packages separately..."
local compiler_installed=false
local cudart_installed=false
if sudo apt-get install -y cuda-compiler-${version_suffix}; then
echo "✅ cuda-compiler-${version_suffix} installed"
compiler_installed=true
else
echo "❌ Failed to install cuda-compiler-${version_suffix}"
fi
if sudo apt-get install -y cuda-cudart-dev-${version_suffix}; then
echo "✅ cuda-cudart-dev-${version_suffix} installed"
cudart_installed=true
else
echo "❌ Failed to install cuda-cudart-dev-${version_suffix}"
fi
if [ "$compiler_installed" = true ] || [ "$cudart_installed" = true ]; then
if [ "$compiler_installed" = false ]; then
echo "⚠️ Warning: cuda-compiler not installed - headers may be incomplete!"
fi
if [ "$cudart_installed" = false ]; then
echo "⚠️ Warning: cuda-cudart-dev not installed - runtime dev files missing!"
fi
cuda_installed=true
fi
fi
# If version-specific install failed, try toolkit
if [ "$cuda_installed" = false ]; then
echo "📦 Trying cuda-toolkit-${version_suffix} as fallback..."
if sudo apt-get install -y cuda-toolkit-${version_suffix}; then
echo "✅ CUDA $DETECTED_CUDA_VERSION toolkit installed!"
cuda_installed=true
fi
fi
fi
# Fall back to trying various package names if version-specific install failed
if [ "$cuda_installed" = false ]; then
echo "🔄 Trying generic CUDA package installation..."
# List available CUDA packages for debugging
echo "🔍 Checking available CUDA packages..."
local available_cuda_pkgs=$(apt-cache search "^cuda-cudart-dev" 2>/dev/null | head -5)
if [ -n "$available_cuda_pkgs" ]; then
echo " Found packages:"
echo "$available_cuda_pkgs" | sed 's/^/ /'
fi
# Try installing with specific version numbers first, then fall back to generic
# Always try to get both compiler (for headers) and cudart-dev (for runtime)
if sudo apt-get install -y cuda-compiler-12-4 cuda-cudart-dev-12-4; then
echo "✅ CUDA 12.4 compiler and runtime development installed!"
cuda_installed=true
elif sudo apt-get install -y cuda-compiler-12-6 cuda-cudart-dev-12-6; then
echo "✅ CUDA 12.6 compiler and runtime development installed!"
cuda_installed=true
elif sudo apt-get install -y cuda-compiler-12-2 cuda-cudart-dev-12-2; then
echo "✅ CUDA 12.2 compiler and runtime development installed!"
cuda_installed=true
elif sudo apt-get install -y cuda-compiler-12-0 cuda-cudart-dev-12-0; then
echo "✅ CUDA 12.0 compiler and runtime development installed!"
cuda_installed=true
elif sudo apt-get install -y cuda-toolkit-12-4; then
echo "✅ CUDA 12.4 toolkit installed!"
cuda_installed=true
elif sudo apt-get install -y cuda-toolkit-12-6; then
echo "✅ CUDA 12.6 toolkit installed!"
cuda_installed=true
elif sudo apt-get install -y cuda-toolkit; then
echo "✅ CUDA toolkit (latest) installed!"
cuda_installed=true
elif sudo apt-get install -y cuda; then
echo "✅ CUDA (full package) installed!"
cuda_installed=true
fi
fi
if [ "$cuda_installed" = true ]; then
return 0
else
echo "❌ Failed to install CUDA packages for x86_64 system"
echo " 💡 You may need to manually install CUDA toolkit from:"
echo " https://developer.nvidia.com/cuda-downloads"
return 1
fi
}
# CUDA detection and installation - optimized for Jetson systems
install_cuda_for_jetson() {
echo "🚀 Installing CUDA development packages for Jetson..."
# First, try to install CUDA development headers for existing CUDA installation
local success=false
# Check if we can install from JetPack repositories (try newer versions first)
if sudo apt-get install -y nvidia-jetpack-dev 2>/dev/null; then
echo "✅ JetPack development packages installed!"
success=true
elif sudo apt-get install -y cuda-toolkit-12-6-dev 2>/dev/null || \
sudo apt-get install -y cuda-toolkit-12-5-dev 2>/dev/null || \
sudo apt-get install -y cuda-toolkit-12-4-dev 2>/dev/null || \
sudo apt-get install -y cuda-toolkit-11-4-dev 2>/dev/null || \
sudo apt-get install -y cuda-toolkit-10-2-dev 2>/dev/null; then
echo "✅ CUDA toolkit development packages installed!"
success=true
elif sudo apt-get install -y cuda-compiler-12-6 cuda-cudart-dev-12-6 2>/dev/null || \
sudo apt-get install -y cuda-compiler-12-5 cuda-cudart-dev-12-5 2>/dev/null || \
sudo apt-get install -y cuda-compiler-12-4 cuda-cudart-dev-12-4 2>/dev/null || \
sudo apt-get install -y cuda-compiler-11-4 cuda-cudart-dev-11-4 2>/dev/null || \
sudo apt-get install -y cuda-compiler-10-2 cuda-cudart-dev-10-2 2>/dev/null; then
echo "✅ CUDA compiler and runtime dev packages installed!"
success=true
else
# Try generic packages that might work
echo "⚠️ Jetson-specific packages not found. Trying generic CUDA packages..."
if sudo apt-get install -y cuda-cudart-dev libcuda1-dev 2>/dev/null || \
sudo apt-get install -y cuda-toolkit 2>/dev/null; then
echo "✅ Generic CUDA development packages installed!"
success=true
fi
fi
# If all else fails, try to create symlinks to existing CUDA installation
if [ "$success" = false ]; then
echo "⚠️ Package installation failed. Trying to link existing CUDA installation..."
# Find existing CUDA installation (using shared variable)
for cuda_dir in "${CUDA_PATHS[@]}"; do
if [ -d "$cuda_dir/include" ]; then
echo "📍 Found CUDA at $cuda_dir, creating development symlinks..."
sudo mkdir -p /usr/include/cuda
sudo ln -sf $cuda_dir/include/* /usr/include/cuda/ 2>/dev/null || true
sudo ln -sf $cuda_dir/include/cuda_runtime.h /usr/include/ 2>/dev/null || true
echo "✅ CUDA headers linked successfully!"
success=true
break
fi
done
fi
return $([ "$success" = true ] && echo 0 || echo 1)
}
# Check CUDA installation status
if check_cuda_toolkit; then
if command -v nvcc &> /dev/null; then
CUDA_VERSION=$(nvcc --version | grep "release" | sed 's/.*release \([0-9]\+\.[0-9]\+\).*/\1/')
echo "✅ CUDA Toolkit found: nvcc version $CUDA_VERSION"
else
# Found in custom path - add to PATH suggestion (using shared variable)
for cuda_path in "${CUDA_PATHS[@]}"; do
if [ -f "$cuda_path/bin/nvcc" ]; then
CUDA_VERSION=$($cuda_path/bin/nvcc --version | grep "release" | sed 's/.*release \([0-9]\+\.[0-9]\+\).*/\1/' 2>/dev/null || echo "unknown")
echo "✅ CUDA Toolkit found at: $cuda_path (version $CUDA_VERSION)"
echo " 💡 Consider adding $cuda_path/bin to your PATH"
break
fi
done
fi
# Even with toolkit found, verify runtime libraries and headers are available
echo "🔍 Verifying CUDA runtime libraries and headers are complete..."
if check_cuda_runtime; then
echo "✅ CUDA toolkit is complete with runtime libraries and headers!"
else
echo "⚠️ CUDA toolkit found but runtime libraries/headers missing!"
if [ "$IS_JETSON" = true ]; then
echo "🤖 Installing missing CUDA runtime development packages for Jetson..."
if install_cuda_for_jetson; then
echo "✅ Jetson CUDA runtime packages installed successfully!"
else
echo "❌ Jetson CUDA runtime installation failed"
echo " 💡 System may already have working CUDA runtime"
fi
fi
fi
elif check_cuda_runtime; then
echo "✅ CUDA runtime libraries and headers found (sufficient for this project!)"
echo " ℹ️ Full toolkit not detected, but runtime + headers are all you need"
else
# CUDA components missing - install them
echo "⚠️ CUDA components missing or incomplete. Installing CUDA runtime libraries..."
if [ "$IS_JETSON" = true ]; then
echo "🤖 Installing CUDA runtime development packages for Jetson..."
update_package_cache
# Install CUDA runtime development packages for Jetson
if sudo apt install -y cuda-cudart-dev-12-6 cuda-headers-12-6 2>/dev/null; then
echo "✅ CUDA 12.6 development packages installed!"
elif sudo apt install -y cuda-cudart-dev cuda-toolkit-12-6 2>/dev/null; then
echo "✅ CUDA development packages installed!"
elif sudo apt install -y libcudart-dev cuda-toolkit 2>/dev/null; then
echo "✅ Generic CUDA development packages installed!"
else
echo "❌ Failed to install CUDA development packages"
echo " Try manually: sudo apt install -y cuda-cudart-dev-12-6"
fi
else
# Non-Jetson installation logic (existing)
if [[ "$ARCH" == "aarch64" ]]; then
install_cuda_for_arm64
elif [[ "$ARCH" == "x86_64" ]]; then
install_cuda_for_x86_64
fi
fi
# Verify CUDA is now available
echo "🔍 Verifying CUDA installation after package installation..."
if check_cuda_runtime; then
echo "✅ CUDA runtime and headers now available!"
else
echo "❌ CUDA verification still failing - manual intervention may be needed"
fi
fi
# Initialize Git LFS
echo "📁 Setting up Git LFS..."
if git lfs install --force 2>/dev/null; then
echo "✅ Git LFS hooks installed successfully"
else
echo "⚠️ Git LFS hook installation had issues, trying manual resolution..."
# Try to update existing hooks
if git lfs update --force 2>/dev/null; then
echo "✅ Git LFS hooks updated successfully"
else
echo "⚠️ Git LFS hooks may need manual attention"
echo " You can run 'git lfs update --force' later if needed"
fi
fi
echo ""
echo "🎉 System dependencies installation complete!"
echo ""
if [ "$IS_JETSON" = true ]; then
echo "🤖 Jetson-specific setup completed!"
echo ""
echo "📋 Next steps for Jetson system:"
echo " 1. Ensure TensorRT is available (usually pre-installed with JetPack)"
echo " 2. Run 'source scripts/setup_env.sh' to configure paths for Jetson"
echo " 3. Run 'just build' to build the project"
echo ""
echo "💡 Jetson tips:"
echo " - CUDA is typically pre-installed at /usr/local/cuda-12.6, /usr/local/cuda-11.4 or /usr/local/cuda-10.2"
echo " - TensorRT is usually available at /usr/lib/aarch64-linux-gnu/"
echo " - If build fails, you may need to install JetPack SDK development components"
echo " - Monitor system temperature during compilation (use 'tegrastats')"
echo " - For CUDA 12.6 systems, ensure you have the latest JetPack SDK Manager"
echo ""
# Install JetPack for Jetson systems (includes all DLA libraries)
echo "🔧 Installing JetPack for complete Jetson development environment..."
update_package_cache
if sudo apt install -y nvidia-jetpack; then
echo "✅ JetPack installed successfully - includes all DLA libraries!"
echo " This resolves all TensorRT DLA dependencies"
else
echo "⚠️ JetPack installation failed (may have version conflicts)"
echo " 💡 Try: sudo apt update && sudo apt install -y nvidia-jetpack"
echo " 🔄 If issues persist, build should still work with existing libraries"
fi
else
# Non-Jetson systems
echo "📋 Next steps for $ARCH system:"
echo " 1. Make sure TensorRT is installed and TensorRT_ROOT is set"
echo " 2. Run 'source scripts/setup_env.sh' to set up the environment"
echo " 3. Run 'just build' to build the project"
echo ""
if [[ "$ARCH" == "aarch64" ]]; then
echo "💡 ARM64 tips:"
echo " - CUDA may be installed at /usr/local/cuda or system locations"
echo " - TensorRT typically installed via package manager"
echo " - DLA libraries not needed on non-Jetson ARM64 systems"
elif [[ "$ARCH" == "x86_64" ]]; then
echo "💡 x86_64 tips:"
echo " - CUDA typically at /usr/local/cuda or via CUDA toolkit"
echo " - TensorRT available from NVIDIA or package repositories"
echo " - Use nvidia-smi to check GPU compatibility"
echo " - DLA libraries typically not needed on desktop GPUs"
fi
fi
echo ""
echo "⚠️ If you encounter any issues:"
if [ "$IS_JETSON" = true ]; then
echo " 🤖 Jetson-specific troubleshooting:"
echo " - Check JetPack version: jetson_release"
echo " - Verify CUDA installation: ls -la /usr/local/cuda*"
echo " - Monitor resources: tegrastats"
echo " - For DLA linking errors: Install full JetPack SDK"
echo " - For help: https://developer.nvidia.com/embedded/jetpack"
elif [[ "$ARCH" == "aarch64" ]]; then
echo " 🔧 ARM64 troubleshooting:"
echo " - Check CUDA: ls -la /usr/local/cuda*"
echo " - Verify libraries: ldconfig -p | grep cuda"
echo " - DLA errors: DLA not supported on non-Jetson ARM64"
elif [[ "$ARCH" == "x86_64" ]]; then
echo " 🖥️ x86_64 troubleshooting:"
echo " - Check GPU: nvidia-smi"
echo " - Verify CUDA: nvcc --version"
echo " - Check environment: echo \$CUDA_HOME \$TensorRT_ROOT"
echo " - DLA errors: DLA typically not supported on desktop GPUs"
else
echo " - Check that all environment variables are set correctly"
echo " - Verify CUDA installation for your architecture"
fi