File size: 13,683 Bytes
f53e03f | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 | #!/bin/bash
# Environment setup script to replace shell.nix functionality
# Source this file: source scripts/setup_env.sh
echo "π§ Setting up G1 Deploy environment..."
# Run jetson_clocks on Jetson systems (bare-metal only)
if command -v jetson_clocks &> /dev/null; then
if [ -f "/.dockerenv" ]; then
# Inside Docker - skip (jetson_clocks needs host access)
echo "βΉοΈ Inside Docker - jetson_clocks should be run on host"
else
# Bare-metal Jetson - set max performance
echo "π Setting Jetson to max performance..."
sudo jetson_clocks 2>/dev/null || echo "β οΈ jetson_clocks failed (needs sudo)"
fi
fi
# Detect system architecture for platform-specific setup
ARCH=$(uname -m)
# Set up ONNX Runtime environment - check multiple possible locations
ONNX_RUNTIME_PATHS=(
"/opt/onnxruntime"
"/usr/local/onnxruntime"
"/usr/lib/onnxruntime"
"$HOME/.local/onnxruntime"
"/opt/intel/openvino/runtime/3rdparty/onnx_runtime"
)
ONNX_FOUND=false
for onnx_path in "${ONNX_RUNTIME_PATHS[@]}"; do
if [ -d "$onnx_path" ]; then
export onnxruntime_DIR="$onnx_path/lib/cmake/onnxruntime"
echo "β
ONNX Runtime found at: $onnx_path"
ONNX_FOUND=true
break
fi
done
if [ "$ONNX_FOUND" = false ]; then
# Try to use system package manager installation
if pkg-config --exists libonnxruntime 2>/dev/null; then
echo "β
ONNX Runtime found via system package manager"
else
echo "β οΈ ONNX Runtime not found in common locations:"
printf " %s\n" "${ONNX_RUNTIME_PATHS[@]}"
echo " Please run scripts/install_deps.sh or install ONNX Runtime manually"
fi
fi
# Auto-detect system architecture and library paths for different distributions
DISTRO_ID=""
# Detect Linux distribution
if [ -f /etc/os-release ]; then
DISTRO_ID=$(grep "^ID=" /etc/os-release | cut -d'=' -f2 | tr -d '"')
elif [ -f /etc/redhat-release ]; then
DISTRO_ID="rhel"
elif [ -f /etc/debian_version ]; then
DISTRO_ID="debian"
fi
# Set system library directory based on distribution and architecture
case "$DISTRO_ID" in
ubuntu|debian|linuxmint)
# Debian-based distributions use multiarch paths
if [ "$ARCH" = "x86_64" ]; then
SYSTEM_LIB_DIR="/usr/lib/x86_64-linux-gnu"
elif [ "$ARCH" = "aarch64" ]; then
SYSTEM_LIB_DIR="/usr/lib/aarch64-linux-gnu"
else
SYSTEM_LIB_DIR="/usr/lib"
fi
;;
fedora|rhel|centos|rocky|almalinux)
# Red Hat-based distributions typically use lib64 for 64-bit
if [[ "$ARCH" == "x86_64" || "$ARCH" == "aarch64" ]]; then
SYSTEM_LIB_DIR="/usr/lib64"
else
SYSTEM_LIB_DIR="/usr/lib"
fi
;;
opensuse*|sles)
# SUSE distributions also use lib64
if [[ "$ARCH" == "x86_64" || "$ARCH" == "aarch64" ]]; then
SYSTEM_LIB_DIR="/usr/lib64"
else
SYSTEM_LIB_DIR="/usr/lib"
fi
;;
arch|manjaro)
# Arch Linux uses standard lib structure
SYSTEM_LIB_DIR="/usr/lib"
;;
*)
# Generic fallback - try to detect best path
if [ -d "/usr/lib/$ARCH-linux-gnu" ]; then
SYSTEM_LIB_DIR="/usr/lib/$ARCH-linux-gnu"
elif [ -d "/usr/lib64" ] && [[ "$ARCH" == "x86_64" || "$ARCH" == "aarch64" ]]; then
SYSTEM_LIB_DIR="/usr/lib64"
else
SYSTEM_LIB_DIR="/usr/lib"
fi
;;
esac
echo "π Detected: $DISTRO_ID on $ARCH, using library path: $SYSTEM_LIB_DIR"
# Set up CMake paths - use dynamically detected paths
CMAKE_PATHS="$SYSTEM_LIB_DIR/cmake"
# Add ONNX Runtime path if we found one
if [ -n "$onnxruntime_DIR" ]; then
ONNX_BASE_PATH=$(dirname $(dirname $onnxruntime_DIR)) # Remove /lib/cmake/onnxruntime to get base path
CMAKE_PATHS="$ONNX_BASE_PATH:$CMAKE_PATHS"
fi
export CMAKE_PREFIX_PATH="$CMAKE_PATHS:$CMAKE_PREFIX_PATH"
export OPENSSL_ROOT_DIR="/usr"
# ROS2 Environment Setup - dynamically find ROS2 installation
ROS2_FOUND=false
# Common ROS2 distributions in order of preference (newest first)
ROS2_DISTROS=("jazzy" "iron" "humble" "galactic" "foxy" "eloquent" "dashing" "crystal")
ROS2_INSTALL_PATHS=("/opt/ros" "/usr/local/ros" "$HOME/ros2_ws/install")
for install_path in "${ROS2_INSTALL_PATHS[@]}"; do
if [ "$ROS2_FOUND" = true ]; then
break
fi
for distro in "${ROS2_DISTROS[@]}"; do
ros2_setup_file="$install_path/$distro/setup.bash"
if [ -f "$ros2_setup_file" ]; then
source "$ros2_setup_file"
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp
# Remove problematic system library path that conflicts with system GLIBC
export LD_LIBRARY_PATH=$(echo $LD_LIBRARY_PATH | tr ':' '\n' | grep -v "$SYSTEM_LIB_DIR" | tr '\n' ':' | sed 's/:$//')
echo "β
ROS2 $distro found at $install_path/$distro - system manages all ROS2 dependencies"
export HAS_ROS2=1
export ROS_LOCALHOST_ONLY=1
ROS2_FOUND=true
break
fi
done
done
if [ "$ROS2_FOUND" = false ]; then
echo "β οΈ ROS2 not found in common locations:"
printf " %s/<distro>\n" "${ROS2_INSTALL_PATHS[@]}"
echo " Install ROS2 system-wide for ROS2InputHandler support"
echo " Building will continue without ROS2InputHandler"
export HAS_ROS2=0
fi
# Set up production FastRTPS profile
if [ -f "src/g1/g1_deploy_onnx_ref/config/fastrtps_profile.xml" ]; then
export FASTRTPS_DEFAULT_PROFILES_FILE="$(pwd)/src/g1/g1_deploy_onnx_ref/config/fastrtps_profile.xml"
echo "β
FastRTPS production profile configured"
fi
# TensorRT Environment Setup
# Check if TensorRT_ROOT is already set, if not try to load from .bashrc
if [ -z "$TensorRT_ROOT" ] && [ -f "$HOME/.bashrc" ]; then
# Extract TensorRT_ROOT from .bashrc if it exists
BASHRC_TENSORRT=$(grep -o 'export TensorRT_ROOT=.*' "$HOME/.bashrc" | head -n1 | cut -d'=' -f2 | tr -d '"' | envsubst)
if [ -n "$BASHRC_TENSORRT" ]; then
export TensorRT_ROOT="$BASHRC_TENSORRT"
echo "π Loaded TensorRT_ROOT from ~/.bashrc: $TensorRT_ROOT"
fi
fi
if [ -n "$TensorRT_ROOT" ]; then
export LD_LIBRARY_PATH="$TensorRT_ROOT/lib:$LD_LIBRARY_PATH"
echo "β
TensorRT environment configured"
# For Jetson systems, ensure DLA libraries are accessible for runtime
if [[ "$ARCH" == "aarch64" ]] && [[ -f "/etc/nv_tegra_release" || -d "/usr/src/jetson_multimedia_api" ]]; then
echo "π€ Jetson system detected - setting up DLA library paths for runtime"
# Create missing libcudla.so.1 symlink if needed (TensorRT expects this name)
if [ -f "/usr/lib/aarch64-linux-gnu/nvidia/libnvcudla.so" ] && [ ! -f "/usr/lib/aarch64-linux-gnu/nvidia/libcudla.so.1" ]; then
echo " π Creating libcudla.so.1 symlink for TensorRT compatibility..."
sudo ln -sf libnvcudla.so /usr/lib/aarch64-linux-gnu/nvidia/libcudla.so.1 2>/dev/null || echo " β οΈ Could not create symlink (may need sudo)"
sudo ln -sf libnvcudla.so /usr/lib/aarch64-linux-gnu/nvidia/libcudla.so 2>/dev/null || echo " β οΈ Could not create symlink (may need sudo)"
echo " β
libcudla.so.1 β libnvcudla.so"
fi
# CRITICAL: Add DLA library path for runtime (this is why your executable can't run)
export LD_LIBRARY_PATH="/usr/lib/aarch64-linux-gnu/nvidia:$LD_LIBRARY_PATH"
# Also add to LIBRARY_PATH so the build-time linker finds -lcudla here.
# GCC/ld doesn't search ldconfig paths for -l resolution by default; LIBRARY_PATH
# is the build-time analogue of LD_LIBRARY_PATH and feeds directly into -L search.
export LIBRARY_PATH="/usr/lib/aarch64-linux-gnu/nvidia:${LIBRARY_PATH:-}"
echo " π Added DLA library path to current session (runtime + build-time)"
# Make it persistent so you don't need to run setup_env.sh every time
if ! grep -q "/usr/lib/aarch64-linux-gnu/nvidia" ~/.bashrc 2>/dev/null; then
echo 'export LD_LIBRARY_PATH="/usr/lib/aarch64-linux-gnu/nvidia:$LD_LIBRARY_PATH"' >> ~/.bashrc
echo " β
Added DLA library path to ~/.bashrc for future sessions"
fi
echo " βΉοΈ Your executable should now be able to find DLA libraries at runtime"
fi
else
echo "β οΈ TensorRT_ROOT is not set"
echo " Please install TensorRT and add 'export TensorRT_ROOT=/path/to/tensorrt' to your ~/.bashrc"
echo " Or source ~/.bashrc before running this script"
fi
# CUDA Environment Setup
echo "π§ Setting up CUDA environment..."
# Function to detect and set CUDA toolkit root
setup_cuda_toolkit() {
# Check if CUDAToolkit_ROOT is already set
if [ -n "$CUDAToolkit_ROOT" ] && [ -f "$CUDAToolkit_ROOT/bin/nvcc" ]; then
echo "β
CUDA toolkit found: CUDAToolkit_ROOT already set to $CUDAToolkit_ROOT"
return 0
fi
# Check for nvcc in PATH first
if command -v nvcc &> /dev/null; then
NVCC_PATH=$(command -v nvcc)
CUDA_ROOT=$(dirname $(dirname "$NVCC_PATH"))
export CUDAToolkit_ROOT="$CUDA_ROOT"
echo "β
CUDA toolkit found in PATH: $CUDAToolkit_ROOT"
return 0
fi
# Check common CUDA installation paths (including CUDA 12.6 for newer Jetson)
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"
"/usr/local/cuda-11.4" # Common on older Jetson
"/usr/local/cuda-11"
"/usr/local/cuda-10.2" # Common on older Jetson
"/usr/local/cuda-10"
"/opt/cuda"
"/usr/cuda"
)
for cuda_path in "${CUDA_PATHS[@]}"; do
if [ -f "$cuda_path/bin/nvcc" ]; then
export CUDAToolkit_ROOT="$cuda_path"
export CUDA_HOME="$cuda_path" # Alternative name CMake might use
export PATH="$cuda_path/bin:$PATH"
export LD_LIBRARY_PATH="$cuda_path/lib64:$cuda_path/lib:$LD_LIBRARY_PATH"
echo "β
CUDA toolkit found at: $CUDAToolkit_ROOT"
echo " Added to PATH: $cuda_path/bin"
echo " Added CUDA libraries to LD_LIBRARY_PATH"
return 0
fi
done
return 1
}
# Set up CUDA toolkit
if setup_cuda_toolkit; then
# Add CUDA library paths
if [ -n "$CUDAToolkit_ROOT" ]; then
export LD_LIBRARY_PATH="$CUDAToolkit_ROOT/lib64:$CUDAToolkit_ROOT/lib:$LD_LIBRARY_PATH"
# For Jetson with CUDA 12.6+, also add the targets/aarch64-linux/lib path for libcudla
if [[ "$ARCH" == "aarch64" ]] && [ -d "$CUDAToolkit_ROOT/targets/aarch64-linux/lib" ]; then
export LD_LIBRARY_PATH="$CUDAToolkit_ROOT/targets/aarch64-linux/lib:$LD_LIBRARY_PATH"
echo " β
Added CUDA aarch64-linux libraries (includes libcudla for TensorRT DLA support)"
fi
fi
else
echo "βΉοΈ CUDA toolkit (nvcc) not found. This is OK - checking for runtime libraries..."
echo " Note: Full toolkit is preferred for development but runtime-only is sufficient for execution"
fi
# Set up CUDA runtime libraries (fallback)
# Note: Only add nvidia path if we don't already have CUDA toolkit paths set up
# This prevents conflicts where libnvcudla.so shadows the correct libcudla.so from CUDA toolkit
if [ -z "$CUDAToolkit_ROOT" ] && [ -d "/usr/lib/aarch64-linux-gnu/nvidia/" ]; then
export LD_LIBRARY_PATH="/usr/lib/aarch64-linux-gnu/nvidia/:$LD_LIBRARY_PATH"
echo "β
CUDA runtime libraries found (aarch64)"
elif [ -n "$CUDAToolkit_ROOT" ]; then
echo "β
Using CUDA libraries from toolkit (prioritized over system runtime libs)"
else
cuda_so_path=$(find /usr -name libcuda.so.1 2>/dev/null | head -n1)
if [ -n "$cuda_so_path" ]; then
export LD_PRELOAD="$cuda_so_path"
echo "β
CUDA runtime library found at $cuda_so_path"
else
echo "========================================================================"
echo "β οΈ Warning: CUDA libraries not found. GPU functionality may be unavailable."
echo " Please install NVIDIA drivers and CUDA toolkit for GPU support."
echo "========================================================================"
fi
fi
# Add ONNX Runtime to library path if not already there
if [ -d "/opt/onnxruntime/lib" ]; then
export LD_LIBRARY_PATH="/opt/onnxruntime/lib:$LD_LIBRARY_PATH"
fi
# Set up Git LFS (if not already done)
if command -v git-lfs &> /dev/null; then
git lfs install &> /dev/null
echo "β
Git LFS configured"
# Pull large files if in git repository
if [ -d ".git" ]; then
echo "π₯ Pulling Git LFS files..."
git lfs pull
fi
else
echo "β οΈ Git LFS not found. Please install git-lfs package."
fi
# Verify essential tools
echo ""
echo "π Verifying essential tools:"
check_command() {
if command -v "$1" &> /dev/null; then
echo "β
$1: $(command -v $1)"
else
echo "β $1: not found"
fi
}
check_command cmake
check_command clang
check_command just
check_command git
echo ""
echo "π Environment setup complete!"
echo ""
echo "π You can now run:"
echo " just build # Build the project"
echo " just --list # See all available commands"
echo ""
# Optional: Add this setup to the current shell session persistence
if [ -n "$BASH_VERSION" ]; then
export PS1="(g1_deploy) $PS1"
fi
|