#!/usr/bin/env bash # Собирает движок AmneziaWG для macOS и кладёт в src-tauri/binaries/: # - amneziawg-go — userspace-датапас (создаёт utun, крутит крипту) # - awg — UAPI-конфигуратор (аналог wg) # - awg-quick — legacy bash-обёртка: поднимает utun+маршруты # - awg-shim — основной движок: userspace AWG -> SOCKS5 для sing-box # # Prebuilt-бинарников у amneziawg-go/amneziawg-tools нет — собираем из исходников. # Нужны: Go, make, git, Xcode Command Line Tools (clang). Только macOS. # # bash scripts/fetch-awg-macos.sh # # Бинарники в git не хранятся (см. .gitignore). Windows-движок (amneziawg.exe) — # в scripts/fetch-singbox.ps1. set -euo pipefail GO_REPO="https://github.com/amnezia-vpn/amneziawg-go" TOOLS_REPO="https://github.com/amnezia-vpn/amneziawg-tools" # Фиксируем совместимые релизы с поддержкой AmneziaWG 3.1. Ветка master у # обоих проектов меняется, поэтому воспроизводимая сборка использует теги. GO_VERSION="v3.1.20260814" TOOLS_VERSION="v3.1.20260812" if [ "$(uname -s)" != "Darwin" ]; then echo "Этот скрипт только для macOS (Windows-движок — в fetch-singbox.ps1)." >&2 exit 1 fi for tool in go make git; do if ! command -v "$tool" >/dev/null 2>&1; then echo "Не найден '$tool'. Поставь его (Go: https://go.dev/dl/, make/clang: xcode-select --install)." >&2 exit 1 fi done ROOT="$(cd "$(dirname "$0")/.." && pwd)" BIN_DIR="$ROOT/src-tauri/binaries" mkdir -p "$BIN_DIR" case "$(uname -m)" in arm64) TARGET_TRIPLE="aarch64-apple-darwin"; GO_ARCH="arm64" ;; x86_64) TARGET_TRIPLE="x86_64-apple-darwin"; GO_ARCH="amd64" ;; *) echo "Неподдерживаемая архитектура macOS: $(uname -m)" >&2; exit 1 ;; esac STAMP="$BIN_DIR/.awg-macos-version" PATCH_HASH="$(git hash-object "$ROOT/scripts/awg-quick-bash3.patch")" EXPECTED_VERSION="amneziawg-go=$GO_VERSION amneziawg-tools=$TOOLS_VERSION patch=$PATCH_HASH" if [ ! -f "$STAMP" ] || [ "$(cat "$STAMP")" != "$EXPECTED_VERSION" ]; then echo "Версия движка изменилась — пересобираю macOS AmneziaWG" rm -f "$BIN_DIR/amneziawg-go" "$BIN_DIR/awg" "$BIN_DIR/awg-quick" "$STAMP" fi # Старые сборки могли иметь тот же upstream-тег и stamp, но ещё не содержать # нашу подмену wg -> awg. Не переиспользуем такой awg-quick. if [ -f "$BIN_DIR/awg-quick" ] && ! grep -Fq 'awg "$@"' "$BIN_DIR/awg-quick"; then echo "Патч awg-quick изменился — пересобираю macOS AmneziaWG" rm -f "$BIN_DIR/awg" "$BIN_DIR/awg-quick" "$STAMP" fi tmp="$(mktemp -d)" trap 'rm -rf "$tmp"' EXIT # --- amneziawg-go --- if [ -f "$BIN_DIR/amneziawg-go" ]; then echo "amneziawg-go уже на месте" else echo "Собираю amneziawg-go…" git clone --depth 1 --branch "$GO_VERSION" "$GO_REPO" "$tmp/awg-go" ( cd "$tmp/awg-go" && make ) awg_go="$(find "$tmp/awg-go" -maxdepth 1 -type f -name amneziawg-go -perm -111 | head -1)" [ -n "$awg_go" ] || { echo "amneziawg-go не собрался" >&2; exit 1; } cp "$awg_go" "$BIN_DIR/amneziawg-go" chmod +x "$BIN_DIR/amneziawg-go" echo "Готово: $BIN_DIR/amneziawg-go" fi # --- awg + awg-quick (amneziawg-tools) --- if [ -f "$BIN_DIR/awg" ] && [ -f "$BIN_DIR/awg-quick" ]; then echo "awg + awg-quick уже на месте" else echo "Собираю amneziawg-tools (awg)…" git clone --depth 1 --branch "$TOOLS_VERSION" "$TOOLS_REPO" "$tmp/awg-tools" # Upstream 3.1 slightly reformatted the DNS block; the semantic context is # unchanged, so ignore whitespace while applying our Bash 3/runtime fixes. git -C "$tmp/awg-tools" apply --recount --ignore-space-change --ignore-whitespace \ "$ROOT/scripts/awg-quick-bash3.patch" # Цель сборки называется `wg`, а `make install` штатно переименовывает её в # `awg` и устанавливает правильный darwin-вариант как `awg-quick`. install_root="$tmp/awg-install" ( cd "$tmp/awg-tools/src" make make install DESTDIR="$install_root" PREFIX=/usr WITH_WGQUICK=yes ) awg_bin="$install_root/usr/bin/awg" awgq="$install_root/usr/bin/awg-quick" [ -x "$awg_bin" ] || { echo "awg не установлен после сборки" >&2; exit 1; } [ -x "$awgq" ] || { echo "awg-quick не установлен после сборки" >&2; exit 1; } cp "$awg_bin" "$BIN_DIR/awg" cp "$awgq" "$BIN_DIR/awg-quick" chmod +x "$BIN_DIR/awg" "$BIN_DIR/awg-quick" echo "Готово: $BIN_DIR/awg + $BIN_DIR/awg-quick" fi printf '%s\n' "$EXPECTED_VERSION" > "$STAMP" # --- awg-shim (AmneziaWG -> local SOCKS5 -> sing-box) --- # CGO не нужен: шим использует userspace netstack. Имя с target triple # нужно Tauri externalBin; внутри .app файл будет называться awg-shim. SHIM_DEST="$BIN_DIR/awg-shim-$TARGET_TRIPLE" SHIM_REBUILD=false if [ ! -x "$SHIM_DEST" ]; then SHIM_REBUILD=true else for source in "$ROOT/awg-shim"/*.go "$ROOT/awg-shim/cmd/awg-shim"/*.go "$ROOT/awg-shim/go.mod" "$ROOT/awg-shim/go.sum"; do if [ "$source" -nt "$SHIM_DEST" ]; then SHIM_REBUILD=true break fi done fi if [ "$SHIM_REBUILD" = false ]; then echo "awg-shim уже на месте" else echo "Собираю awg-shim…" ( cd "$ROOT/awg-shim" CGO_ENABLED=0 GOOS=darwin GOARCH="$GO_ARCH" \ go build -trimpath -ldflags="-s -w" -o "$SHIM_DEST" ./cmd/awg-shim ) chmod +x "$SHIM_DEST" echo "Готово: $SHIM_DEST" fi echo "AmneziaWG-движок и shim для macOS готовы в $BIN_DIR"