Files
radar_system/data_acq_and_processing/gpr_cpp/build_cmake.sh
T
2026-09-21 13:39:04 +03:00

88 lines
3.8 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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=<dir с nvrtc.h,cuda.h> и CUDA_LIB=<dir с libnvrtc.so*>." >&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 при запуске)"