diff --git a/build_bsd_full.sh b/build_bsd_full.sh index dbf7602e..0978562a 100755 --- a/build_bsd_full.sh +++ b/build_bsd_full.sh @@ -1,7 +1,58 @@ #!/bin/sh +# Build script for uTun on FreeBSD (full rebuild) +# Usage: ./build_bsd_full.sh [options] +# Options: +# -h, --help Show this help +# --asan Build with AddressSanitizer (clang) +# --hardened Build with compiler security hardening flags (clang) +# -j[N] Build with N parallel jobs (default: sysctl hw.ncpu) set -e +# Parse arguments +USE_ASAN=0 +USE_HARDENED=0 +JOBS="" +MAKE_ARGS="" + +while [ $# -gt 0 ]; do + case "$1" in + -h|--help) + echo "Usage: ./build_bsd_full.sh [options]" + echo "Options:" + echo " -h, --help Show this help" + echo " --asan Build with AddressSanitizer" + echo " --hardened Build with compiler security hardening flags" + echo " -j[N] Build with N parallel jobs (default: sysctl hw.ncpu)" + exit 0 + ;; + --asan) + USE_ASAN=1 + shift + ;; + --hardened) + USE_HARDENED=1 + shift + ;; + -j*) + JOBS="$1" + shift + ;; + *) + MAKE_ARGS="$MAKE_ARGS $1" + shift + ;; + esac +done + +if [ -z "$JOBS" ]; then + if command -v nproc >/dev/null 2>&1; then + JOBS="-j$(nproc)" + else + JOBS="-j$(sysctl -n hw.ncpu)" + fi +fi + # Проверка и установка зависимостей need_install="" @@ -13,18 +64,24 @@ for cmd in autoreconf aclocal automake libtoolize; do done if [ -n "$need_install" ]; then - echo "Устанавливаются необходимые пакеты..." + echo "Устанавливаются необходимые пакеты (нужен root)..." pkg update pkg install -y autoconf automake libtool pkgconf openssl fi +# Предпочитаем GNU make (gmake), но fallback на bmake — он собирает +# autotools-генерённые Makefile данного проекта. gmake ставится отдельно: +# pkg install gmake (нужен root) +GMAKE="$(command -v gmake || command -v make)" +echo "Используем make: $GMAKE" + mkdir -p m4 echo "=== Полная пересборка uTun ===" # 1. Очистка echo "[1/4] Очистка..." -make distclean 2>/dev/null || true +$GMAKE distclean 2>/dev/null || true rm -f config.h config.status config.log rm -f configure.log autoreconf.log build.log @@ -42,19 +99,45 @@ chmod +x configure # 3. Конфигурация echo "[3/4] Конфигурация..." -./configure --prefix=/usr/local 2>&1 | tee configure.log -# Определяем количество ядер -if command -v nproc >/dev/null 2>&1; then - JOBS=$(nproc) +# FFmpeg (опционально) — автоопределение через pkg-config +FFMPEG_OPT="" +if command -v pkg-config >/dev/null 2>&1 && \ + pkg-config --exists libavformat libavcodec libavutil libswscale libswresample 2>/dev/null; then + FFMPEG_OPT="--with-ffmpeg" + echo "FFmpeg detected — building with video transcoding" else - JOBS=$(sysctl -n hw.ncpu) + echo "FFmpeg not found — building without video transcoding" +fi + +if [ "$USE_ASAN" -eq 1 ]; then + echo "(AddressSanitizer enabled — clang, lib/ + src/ only)" + ./configure --prefix=/usr/local CC=clang \ + CFLAGS="-g -O1 -fsanitize=address -fno-omit-frame-pointer" \ + LDFLAGS="-fsanitize=address" $FFMPEG_OPT 2>&1 | tee configure.log +elif [ "$USE_HARDENED" -eq 1 ]; then + echo "(Hardening enabled — clang-safe flags)" + ./configure --prefix=/usr/local CC=clang \ + CFLAGS="-D_FORTIFY_SOURCE=2 -fstack-protector-strong -fPIE" \ + LDFLAGS="-Wl,-z,relro -Wl,-z,now -pie" $FFMPEG_OPT 2>&1 | tee configure.log +else + ./configure --prefix=/usr/local $FFMPEG_OPT 2>&1 | tee configure.log fi # 4. Сборка echo "[4/4] Сборка..." -make -j"$JOBS" 2>&1 | tee build.log +if [ "$USE_ASAN" -eq 1 ]; then + (cd lib && $GMAKE $JOBS $MAKE_ARGS 2>&1 | tee ../build.log) + (cd src && $GMAKE $JOBS $MAKE_ARGS 2>&1 | tee ../build.log) +else + $GMAKE $JOBS $MAKE_ARGS 2>&1 | tee build.log +fi echo echo "=== Готово ===" echo "Бинарный файл: src/utun" +if [ "$USE_ASAN" -eq 1 ]; then + echo + echo "Запуск с ASAN (detect_leaks=0 обязателен на FreeBSD):" + echo " ASAN_OPTIONS=detect_leaks=0:halt_on_error=0 ./src/utun -f -p /tmp/utun.pid -l /tmp/utun.log" +fi