You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

116 lines
4.1 KiB

#!/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)"