自己编译一个只有 hy2 协议的 sing-box 脚本,只有 8.4M Linux arm64 平台 由 gemini ai 生成
warning:
这篇文章距离上次修改已过196天,其中的内容可能已经有所变动。
#!/bin/bash
# -----------------------------------------------------------
# 脚本功能: 为 aarch64 (MT7981) 交叉编译 sing-box,仅保留 Hysteria2
# 并且注入版本信息,最终使用 UPX 压缩。
# -----------------------------------------------------------
# --- 1. 环境检查与准备 ---
# 检查是否在 sing-box 源码根目录
if [ ! -d "cmd/sing-box" ]; then
echo "错误: 请在 sing-box 源码的根目录执行此脚本。"
exit 1
fi
# 检查 Go 环境
if ! command -v go &> /dev/null; then
echo "错误: Go 语言环境未安装或不在 PATH 中。"
exit 1
fi
# 检查 UPX
if ! command -v upx &> /dev/null; then
echo "警告: UPX 未安装或不在 PATH 中。将跳过压缩步骤,二进制文件体积可能较大。"
USE_UPX=false
else
USE_UPX=true
fi
# 更新源码
echo "--- 正在拉取最新的 sing-box 源码 ---"
git pull
# --- 2. 设置交叉编译环境变量 (MT7981 / aarch64) ---
echo "--- 设置 aarch64 交叉编译环境 ---"
export GOOS="linux"
export GOARCH="arm64"
export CGO_ENABLED="0"
# --- 3. 获取版本信息 ---
echo "--- 正在获取 Git 版本信息 ---"
# VERSION:只获取最接近的标签名(如 v1.12.12),用于 Version 字段
VERSION=$(git describe --tags --abbrev=0 2>/dev/null)
if [ -z "$VERSION" ]; then
VERSION=$(git describe --tags --always --dirty)
fi
# REVISION: 获取提交哈希
REVISION=$(git rev-parse HEAD)
OUTPUT_NAME="sing-box_hy2_aarch64"
# --- 4. 定义编译参数 (Build Tags & ldflags) ---
# 仅保留 Hysteria2 (hy2) 和必要的组件
BUILD_TAGS="os_linux netgo hy2 with_quic json \
without_clash without_v2ray_api without_v2ray_protocol without_trojan \
without_vless without_shadowsocks without_naive without_tuic without_wireguard \
without_tun without_gso"
# *** 最终关键修正:Version 注入路径改为 constant.Version ***
LDFLAGS="-s -w -X 'github.com/sagernet/sing-box/constant.Version=${VERSION}' -X 'github.com/sagernet/sing-box/pkg/version.Revision=${REVISION}'"
# --- 5. 执行编译 ---
echo "--- 开始编译 ($GOOS/$GOARCH) ---"
echo "版本: $VERSION"
echo "目标文件: $OUTPUT_NAME"
# 使用 -a 标志,强制重新编译所有依赖和目标文件
go build -a -trimpath -ldflags "${LDFLAGS}" \
-tags "${BUILD_TAGS}" \
-o ${OUTPUT_NAME} ./cmd/sing-box
if [ $? -ne 0 ]; then
echo "错误: 编译失败!请检查 Go 版本和源码。"
exit 1
fi
echo "--- 编译成功!文件大小: $(du -h $OUTPUT_NAME | awk '{print $1}') ---"
# --- 6. UPX 压缩 (可选) ---
if $USE_UPX; then
echo "--- 正在使用 UPX 压缩 ---"
upx --best ${OUTPUT_NAME}
echo "--- 压缩完成!新文件大小: $(du -h $OUTPUT_NAME | awk '{print $1}') ---"
else
echo "跳过 UPX 压缩。如果需要更小体积,请安装 UPX。"
fi
echo "--- 脚本执行完毕。二进制文件位于当前目录: ${OUTPUT_NAME} ---"