#!/bin/sh set -e # --- определение пакетного менеджера --- detect_pm() { if command -v apt-get >/dev/null 2>&1; then PM=apt; PM_UPDATE="apt-get update"; PM_INSTALL="apt-get install -y" P_AUTOCONF=autoconf; P_AUTOMAKE=automake; P_BUILD=build-essential; P_SSL=libssl-dev elif command -v dnf >/dev/null 2>&1; then PM=dnf; PM_UPDATE="true"; PM_INSTALL="dnf install -y" P_AUTOCONF=autoconf; P_AUTOMAKE=automake; P_BUILD="gcc make"; P_SSL=openssl-devel elif command -v yum >/dev/null 2>&1; then PM=yum; PM_UPDATE="true"; PM_INSTALL="yum install -y" P_AUTOCONF=autoconf; P_AUTOMAKE=automake; P_BUILD="gcc make"; P_SSL=openssl-devel elif command -v pacman >/dev/null 2>&1; then PM=pacman; PM_UPDATE="pacman -Sy --noconfirm"; PM_INSTALL="pacman -S --noconfirm" P_AUTOCONF=autoconf; P_AUTOMAKE=automake; P_BUILD=base-devel; P_SSL=openssl elif command -v apk >/dev/null 2>&1; then PM=apk; PM_UPDATE="apk update"; PM_INSTALL="apk add" P_AUTOCONF=autoconf; P_AUTOMAKE=automake; P_BUILD=build-base; P_SSL=openssl-dev else PM=none fi } # --- чего не хватает (логические маркеры) --- detect_missing() { missing="" command -v autoreconf >/dev/null 2>&1 || missing="$missing autoconf" command -v automake >/dev/null 2>&1 || missing="$missing automake" if ! command -v gcc >/dev/null 2>&1 || ! command -v make >/dev/null 2>&1; then missing="$missing buildtools" fi [ -f /usr/include/openssl/sha.h ] || missing="$missing openssl" } # --- перевести маркеры в пакеты выбранного PM --- pkg_names() { pkgs="" case "$missing" in *autoconf*) pkgs="$pkgs $P_AUTOCONF";; esac case "$missing" in *automake*) pkgs="$pkgs $P_AUTOMAKE";; esac case "$missing" in *buildtools*) pkgs="$pkgs $P_BUILD";; esac case "$missing" in *openssl*) pkgs="$pkgs $P_SSL";; esac } # --- установка, если что-то отсутствует --- detect_pm detect_missing if [ -n "$missing" ]; then if [ "$PM" = "none" ]; then echo "Ошибка: не найден пакетный менеджер. Установите вручную:$missing" exit 1 fi if [ "$(id -u)" -eq 0 ]; then SUDO="" elif command -v sudo >/dev/null 2>&1; then SUDO="sudo" else echo "Ошибка: нужны права root (sudo не найден). Установите вручную:$missing" exit 1 fi pkg_names echo "Установка недостающих пакетов ($PM):$pkgs" $SUDO $PM_UPDATE && $SUDO $PM_INSTALL $pkgs || { echo "Ошибка: не удалось установить пакеты:$pkgs" exit 1 } detect_missing if [ -n "$missing" ]; then echo "Ошибка: после установки всё ещё не хватает:$missing" exit 1 fi fi mkdir -p m4 echo "=== Полная пересборка uTun ===" # 1. Очистка echo "[1/4] Очистка..." make distclean 2>/dev/null || true rm -f config.h config.status config.log rm -f configure.log autoreconf.log build.log rm -f src/utun # 2. Автогенерация (autoreconf) echo "[2/4] Автогенерация (autoreconf -fi)..." autoreconf -fi 2>&1 | tee autoreconf.log if [ ! -f configure ]; then echo "Ошибка: autoreconf не создал configure. См. autoreconf.log" exit 1 fi # 3. Конфигурация echo "[3/4] Конфигурация..." ./configure --prefix=/usr/local 2>&1 | tee configure.log if [ ! -f Makefile ]; then echo "Ошибка: configure не создал Makefile. См. configure.log" echo "Возможно не установлен libssl-dev (OpenSSL)." exit 1 fi # 4. Сборка echo "[4/4] Сборка..." make -j$(nproc) 2>&1 | tee build.log if [ ! -f src/utun ]; then echo "Ошибка: сборка не создала src/utun. См. build.log" exit 1 fi echo "" echo "=== Готово ===" echo "Бинарный файл: src/utun (скопирован в ./utun)"