117 lines
4.1 KiB
Bash
Executable File
117 lines
4.1 KiB
Bash
Executable File
#!/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)"
|