#!/usr/bin/env bash # CMake-сборка libgpr_core_cpp + standalone (без nvcc; NVRTC/driver). # # Источник CUDA (nvrtc.h / libnvrtc), по убыванию приоритета: # 1. env CUDA_INC / CUDA_LIB — заданы явно; # 2. pip-пакеты nvidia-* в venv ($VENV, по умолчанию ../../.venv — venv # radar_system) — дев-машина; # 3. системный toolkit /usr/local/cuda — Jetson/JetPack, apt cuda-toolkit. # # GPR_BUILD_PYTHON=ON вернул бы pybind-модуль, но bindings/ не вендорен в # radar_system (см. README) — по умолчанию OFF. set -eu HERE="$(cd "$(dirname "$0")" && pwd)" VENV="${VENV:-$HERE/../../.venv}" PY="$VENV/bin/python" GPR_BUILD_PYTHON="${GPR_BUILD_PYTHON:-OFF}" CUDA_INC="${CUDA_INC:-}" CUDA_LIB="${CUDA_LIB:-}" if [ -z "$CUDA_INC" ] || [ -z "$CUDA_LIB" ]; then if [ -x "$PY" ]; then # Печатается только когда найдены nvrtc.h, cuda.h И библиотека — частичная # детекция не может подсунуть мусорный путь. nvrtc.h и cuda.h могут лежать # в РАЗНЫХ каталогах (раздельные pip-пакеты cuda_nvrtc/cuda_runtime на # Jetson) — тогда CUDA_INC становится ';'-списком для CMake. PIP_CUDA=$("$PY" - <<'P' 2>/dev/null || true import glob, os, site sp = site.getsitepackages()[0] nvrtc_hdr = glob.glob(os.path.join(sp, 'nvidia', '**', 'include', 'nvrtc.h'), recursive=True) cuda_hdr = glob.glob(os.path.join(sp, 'nvidia', '**', 'include', 'cuda.h'), recursive=True) lib = sorted(glob.glob(os.path.join(sp, 'nvidia', '**', 'lib', 'libnvrtc.so*'), recursive=True)) if nvrtc_hdr and cuda_hdr and lib: inc_dirs = [] for hdr in (nvrtc_hdr[0], cuda_hdr[0]): d = os.path.dirname(hdr) if d not in inc_dirs: inc_dirs.append(d) print(';'.join(inc_dirs)) print(os.path.dirname(lib[0])) P ) if [ -n "$PIP_CUDA" ]; then CUDA_INC=$(printf '%s\n' "$PIP_CUDA" | sed -n 1p) CUDA_LIB=$(printf '%s\n' "$PIP_CUDA" | sed -n 2p) fi fi fi if [ -z "$CUDA_INC" ] || [ -z "$CUDA_LIB" ]; then if [ -e /usr/local/cuda/include/nvrtc.h ]; then CUDA_INC=/usr/local/cuda/include CUDA_LIB=/usr/local/cuda/lib64 echo "[build_cmake] pip nvidia-* не найдены; использую системный CUDA: $CUDA_INC" else echo "[build_cmake] CUDA не найден: нет ни pip nvidia-* в $VENV, ни /usr/local/cuda." >&2 echo "[build_cmake] Задайте CUDA_INC= и CUDA_LIB=." >&2 exit 1 fi fi PYTHON_ARG=() if [ "$GPR_BUILD_PYTHON" = "ON" ] && [ -x "$PY" ]; then PYTHON_ARG=(-DPYTHON_EXECUTABLE="$PY") fi # cmake: сначала из venv (pip install cmake — свежий без sudo), потом системный. CMAKE="$VENV/bin/cmake" if [ ! -x "$CMAKE" ]; then CMAKE=$(command -v cmake || true) fi if [ -z "$CMAKE" ]; then echo "[build_cmake] cmake не найден. Поставьте его в venv: \"$VENV/bin/pip\" install cmake" >&2 echo "[build_cmake] (или системно: sudo apt install cmake)" >&2 exit 1 fi "$CMAKE" -S "$HERE" -B "$HERE/build" \ ${PYTHON_ARG[@]+"${PYTHON_ARG[@]}"} \ -DGPR_BUILD_PYTHON="$GPR_BUILD_PYTHON" \ -DGPR_CUDA_INC="$CUDA_INC" \ -DGPR_CUDA_LIB="$CUDA_LIB" \ -DCMAKE_BUILD_TYPE=Release "$@" 2>&1 | tail -8 "$CMAKE" --build "$HERE/build" -j4 2>&1 | tail -15 echo "--- артефакты ---" ls -la "$HERE/build/libgpr_core_cpp.a" "$HERE/build/standalone_bp" "$HERE"/build/_gpr_cpp*.so 2>/dev/null | awk '{print $5,$9}' echo "CUDA_LIB=$CUDA_LIB (для LD_LIBRARY_PATH при запуске)"