|
|
|
|
@ -1,7 +1,79 @@
|
|
|
|
|
#!/bin/sh |
|
|
|
|
mkdir -p m4 |
|
|
|
|
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. Очистка |
|
|
|
|
@ -9,19 +81,36 @@ 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" |
|
|
|
|
echo "Бинарный файл: src/utun (скопирован в ./utun)" |
|
|
|
|
|