3 changed files with 72 additions and 154 deletions
@ -1,144 +1,32 @@
|
||||
#!/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) |
||||
|
||||
# Полная сборка FreeBSD: зависимости и общий инкрементальный скрипт. |
||||
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 |
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd) |
||||
case " ${*} " in |
||||
*" --help "*|*" -h "*) |
||||
echo "Usage: ./build_bsd_full.sh [--asan|--hardened] [-jN] [build.sh arguments]" |
||||
echo "Installs missing build tools and runs build.sh --full" |
||||
exit 0 ;; |
||||
esac |
||||
|
||||
need_install=0 |
||||
for tool in bash gmake autoreconf aclocal automake libtoolize pkg-config; do |
||||
command -v "$tool" >/dev/null 2>&1 || need_install=1 |
||||
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 |
||||
if [ "$need_install" -eq 1 ]; then |
||||
echo "INFO: installing missing FreeBSD build dependencies (requires root)" |
||||
pkg install -y bash gmake autoconf automake libtool pkgconf openssl || { |
||||
echo "ERROR: cannot install FreeBSD build dependencies" >&2; exit 1; |
||||
} |
||||
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 |
||||
jobs_found=0 |
||||
for argument do |
||||
case "$argument" in -j*) jobs_found=1 ;; esac |
||||
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" |
||||
if [ "$jobs_found" -eq 0 ]; then |
||||
jobs=$(sysctl -n hw.ncpu) || { echo "ERROR: cannot determine CPU count" >&2; exit 1; } |
||||
set -- "-j$jobs" "$@" |
||||
fi |
||||
echo "INFO: running shared build script for FreeBSD" |
||||
exec bash "$SCRIPT_DIR/build.sh" --full "$@" |
||||
|
||||
Loading…
Reference in new issue