自己编译一个只有 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} ---"
none
最后修改于:2025年11月21日 13:07

添加新评论