#!/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="" for cmd in autoreconf aclocal automake libtoolize; do if ! command -v "$cmd" >/dev/null 2>&1; then need_install=1 break fi done if [ -n "$need_install" ]; then 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] Очистка..." $GMAKE distclean 2>/dev/null || true rm -f config.h config.status config.log rm -f configure.log autoreconf.log build.log # 2. Генерация configure echo "[2/4] Автогенерация..." autoreconf -fi 2>&1 | tee autoreconf.log # Проверяем, появился ли configure if [ ! -f configure ]; then echo "Ошибка: autoreconf не создал configure." exit 1 fi chmod +x configure # 3. Конфигурация echo "[3/4] Конфигурация..." # 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 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] Сборка..." if [ "$USE_ASAN" -eq 1 ]; then (cd lib && $GMAKE $JOBS $MAKE_ARGS 2>&1 | tee ../build.log) (cd lib/libopus && $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