mirror of
https://github.com/qtgolang/SunnyNet.git
synced 2026-08-30 22:11:29 -07:00
126 lines
3.5 KiB
Bash
126 lines
3.5 KiB
Bash
#!/usr/bin/env bash
|
||
|
||
set -u
|
||
|
||
echo ""
|
||
echo "请使用 Linux 环境编译,可以使用 WSL" > /dev/null
|
||
echo ""
|
||
echo "正在编译..."
|
||
|
||
export CGO_ENABLED=1
|
||
|
||
# 脚本所在目录
|
||
tmpPath="$(dirname "$(readlink -f "$0")")"
|
||
# 项目根目录
|
||
parentPath="$(dirname "$tmpPath")"
|
||
cd "$parentPath" || exit 1
|
||
|
||
# 这里按你的实际环境改
|
||
# 32 位这里改成 multilib 方式,不再依赖 i686-linux-gnu-gcc
|
||
LINUX_386_CC="gcc -m32"
|
||
# 当前机器如果本身就是 x64 Linux,直接用 gcc 就行
|
||
LINUX_AMD64_CC="gcc"
|
||
# arm 交叉编译器
|
||
LINUX_ARM_CC="arm-linux-gnueabihf-gcc"
|
||
# arm64 交叉编译器
|
||
LINUX_ARM64_CC="aarch64-linux-gnu-gcc"
|
||
|
||
# 如果配了 osxcross,就填上;没配就留空
|
||
DARWIN_AMD64_CC="${DARWIN_AMD64_CC:-o64-clang}"
|
||
DARWIN_ARM64_CC="${DARWIN_ARM64_CC:-aarch64-apple-darwin-clang}"
|
||
|
||
# 记录失败数量,最后统一汇总
|
||
FAIL_COUNT=0
|
||
|
||
build_one() {
|
||
# 构建名称
|
||
local name="$1"
|
||
# 目标系统
|
||
local goos="$2"
|
||
# 目标架构
|
||
local goarch="$3"
|
||
# C 编译器命令,允许带参数
|
||
local cc="$4"
|
||
# 输出文件
|
||
local out="$5"
|
||
# 可选 tags
|
||
local tags="${6:-}"
|
||
# 可选 GOARM
|
||
local goarm="${7:-}"
|
||
# 取命令本体,给 command -v 检查用
|
||
local cc_bin="${cc%% *}"
|
||
|
||
# 创建输出目录
|
||
mkdir -p "$(dirname "$out")"
|
||
|
||
# 设置 Go 交叉编译环境
|
||
export GOOS="$goos"
|
||
export GOARCH="$goarch"
|
||
export CC="$cc"
|
||
|
||
# arm 单独设置 GOARM
|
||
if [ -n "$goarm" ]; then
|
||
export GOARM="$goarm"
|
||
else
|
||
unset GOARM 2>/dev/null || true
|
||
fi
|
||
|
||
# 检查编译器是否存在
|
||
if ! command -v "$cc_bin" >/dev/null 2>&1; then
|
||
echo ""
|
||
echo "$name 编译失败:未找到交叉编译器 $cc_bin"
|
||
FAIL_COUNT=$((FAIL_COUNT + 1))
|
||
return 1
|
||
fi
|
||
|
||
echo ""
|
||
echo "开始编译:$name"
|
||
echo "GOOS=$GOOS GOARCH=$GOARCH CC=$CC"
|
||
|
||
# 有 tags 就带上 tags
|
||
if [ -n "$tags" ]; then
|
||
go build -trimpath -tags "$tags" -buildmode=c-shared -ldflags "-s -w" -o "$out"
|
||
else
|
||
go build -trimpath -buildmode=c-shared -ldflags "-s -w" -o "$out"
|
||
fi
|
||
|
||
# 判断结果
|
||
if [ $? -ne 0 ]; then
|
||
echo ""
|
||
echo "$name 编译失败!"
|
||
FAIL_COUNT=$((FAIL_COUNT + 1))
|
||
return 1
|
||
fi
|
||
|
||
echo "$name 编译完成!"
|
||
return 0
|
||
}
|
||
|
||
# ================== Linux x86 ==================
|
||
build_one "Full Linux x86" "linux" "386" "$LINUX_386_CC" "$tmpPath/Library/Full/Linux/x86/Sunny.so"
|
||
build_one "Mini Linux x86" "linux" "386" "$LINUX_386_CC" "$tmpPath/Library/Mini/Linux/x86/Sunny.so" "mini"
|
||
|
||
# ================== Linux x64 ==================
|
||
build_one "Full Linux x64" "linux" "amd64" "$LINUX_AMD64_CC" "$tmpPath/Library/Full/Linux/x64/Sunny.so"
|
||
build_one "Mini Linux x64" "linux" "amd64" "$LINUX_AMD64_CC" "$tmpPath/Library/Mini/Linux/x64/Sunny.so" "mini"
|
||
|
||
# ================== Linux arm ==================
|
||
# GOARM 常见填 7,按目标设备也可以改成 6 或 5
|
||
build_one "Full Linux arm" "linux" "arm" "$LINUX_ARM_CC" "$tmpPath/Library/Full/Linux/arm/Sunny.so" "" "7"
|
||
build_one "Mini Linux arm" "linux" "arm" "$LINUX_ARM_CC" "$tmpPath/Library/Mini/Linux/arm/Sunny.so" "mini" "7"
|
||
|
||
# ================== Linux arm64 ==================
|
||
build_one "Full Linux arm64" "linux" "arm64" "$LINUX_ARM64_CC" "$tmpPath/Library/Full/Linux/arm64/Sunny.so"
|
||
build_one "Mini Linux arm64" "linux" "arm64" "$LINUX_ARM64_CC" "$tmpPath/Library/Mini/Linux/arm64/Sunny.so" "mini"
|
||
|
||
echo ""
|
||
echo "全部编译流程结束"
|
||
|
||
# 最后给个汇总,方便一眼看结果
|
||
if [ "$FAIL_COUNT" -gt 0 ]; then
|
||
echo "有 $FAIL_COUNT 个目标编译失败"
|
||
exit 1
|
||
else
|
||
echo "全部目标编译成功"
|
||
exit 0
|
||
fi |