mirror of
https://github.com/VaalaCat/frp-panel.git
synced 2025-09-26 19:31:18 +08:00
160 lines
4.5 KiB
Bash
Executable File
160 lines
4.5 KiB
Bash
Executable File
#!/usr/bin/env /bin/bash
|
||
|
||
# Function to print usage
|
||
usage() {
|
||
echo "Usage: $0 [--platform <platform>] [--bintype <bintype>] [--arch <arch>]"
|
||
echo "Platforms: windows, linux, darwin, all"
|
||
echo "Binary Types: full, client, all"
|
||
echo "Architectures: amd64, arm64, arm, all"
|
||
echo "Example: $0 --platform linux --bintype full --arch amd64"
|
||
exit 1
|
||
}
|
||
|
||
# Default values
|
||
PLATFORM="all"
|
||
BINTYPE="all"
|
||
ARCH="all"
|
||
|
||
# build variables
|
||
BUILD_DATE="$(date -u +'%Y-%m-%dT%H:%M:%SZ')"
|
||
GIT_COMMIT="$(git rev-parse HEAD)"
|
||
VERSION="$(git describe --tags --abbrev=0 | tr -d '\n')"
|
||
GIT_BRANCH="$(git rev-parse --abbrev-ref HEAD)"
|
||
|
||
# Parse arguments
|
||
while [[ "$#" -gt 0 ]]; do
|
||
case $1 in
|
||
--platform) PLATFORM="$2"; shift ;;
|
||
--bintype) BINTYPE="$2"; shift ;;
|
||
--arch) ARCH="$2"; shift ;;
|
||
--skip-frontend) SKIP_FRONTEND=true ;;
|
||
--current) CURRENT=true ;;
|
||
*) usage ;;
|
||
esac
|
||
shift
|
||
done
|
||
|
||
if [[ "$CURRENT" == "true" ]]; then
|
||
PLATFORM=$(uname -s | tr '[:upper:]' '[:lower:]')
|
||
ARCH=$(uname -m)
|
||
if [[ "$ARCH" == "x86_64" ]]; then
|
||
ARCH="amd64"
|
||
fi
|
||
if [[ "$ARCH" == "aarch64" ]]; then
|
||
ARCH="arm64"
|
||
fi
|
||
BINTYPE="full"
|
||
fi
|
||
|
||
echo "Building for platform: $PLATFORM, binary type: $BINTYPE, architecture: $ARCH"
|
||
echo "Build Date: $BUILD_DATE"
|
||
echo "Git Commit: $GIT_COMMIT"
|
||
echo "Version: $VERSION"
|
||
|
||
BUILD_LD_FLAGS="-X 'github.com/VaalaCat/frp-panel/conf.buildDate=${BUILD_DATE}' -X 'github.com/VaalaCat/frp-panel/conf.gitCommit=${GIT_COMMIT}' -X 'github.com/VaalaCat/frp-panel/conf.gitVersion=${VERSION}' -X 'github.com/VaalaCat/frp-panel/conf.gitBranch=${GIT_BRANCH}'"
|
||
|
||
if [[ "$SKIP_FRONTEND" == "true" ]]; then
|
||
echo "Skipping frontend build"
|
||
else
|
||
echo "Building frontend"
|
||
# Prepare build environment
|
||
mkdir -p dist
|
||
rm -rf dist/*
|
||
|
||
# Build frontend
|
||
cd www && pnpm install --no-frozen-lockfile && pnpm build && cd ..
|
||
fi
|
||
|
||
# Build function
|
||
build_binary() {
|
||
local platform=$1
|
||
local arch=$2
|
||
local bintype=$3
|
||
local output_name=""
|
||
local source_path=""
|
||
|
||
# Determine output name and source path
|
||
if [[ "$bintype" == "full" ]]; then
|
||
source_path="cmd/frpp/*.go"
|
||
output_name="frp-panel"
|
||
elif [[ "$bintype" == "client" ]]; then
|
||
source_path="cmd/frppc/*.go"
|
||
output_name="frp-panel-client"
|
||
else
|
||
echo "Invalid binary type"
|
||
return 1
|
||
fi
|
||
|
||
# Set executable extension for Windows
|
||
local exe_ext=""
|
||
if [[ "$platform" == "windows" ]]; then
|
||
exe_ext=".exe"
|
||
fi
|
||
|
||
# Special handling for ARM architectures
|
||
local goarch="$arch"
|
||
local goarm=""
|
||
if [[ "$arch" == "arm" ]]; then
|
||
goarch="arm"
|
||
if [[ "$platform" == "linux" ]]; then
|
||
# Build for ARMv7 and ARMv6
|
||
for arm_version in 7 6; do
|
||
local arm_output="${output_name}-${platform}-armv${arm_version}l${exe_ext}"
|
||
CGO_ENABLED=0 GOOS="$platform" GOARCH="$goarch" GOARM="$arm_version" \
|
||
go build -o "dist/${arm_output}" -ldflags "$BUILD_LD_FLAGS" $source_path
|
||
done
|
||
return 0
|
||
fi
|
||
fi
|
||
|
||
# Standard build
|
||
local output="${output_name}-${platform}-${arch}${exe_ext}"
|
||
CGO_ENABLED=0 GOOS="$platform" GOARCH="$goarch" \
|
||
go build -o "dist/${output}" -ldflags "$BUILD_LD_FLAGS" $source_path
|
||
}
|
||
|
||
# Platforms array
|
||
PLATFORMS=()
|
||
if [[ "$PLATFORM" == "all" ]]; then
|
||
PLATFORMS=("windows" "linux" "darwin" "android")
|
||
else
|
||
PLATFORMS=("$PLATFORM")
|
||
fi
|
||
|
||
# Architectures array
|
||
ARCHS=()
|
||
if [[ "$ARCH" == "all" ]]; then
|
||
ARCHS=("amd64" "arm64" "arm" "riscv64")
|
||
else
|
||
ARCHS=("$ARCH")
|
||
fi
|
||
|
||
# Binary types array
|
||
BINTYPES=()
|
||
if [[ "$BINTYPE" == "all" ]]; then
|
||
BINTYPES=("full" "client")
|
||
else
|
||
BINTYPES=("$BINTYPE")
|
||
fi
|
||
|
||
# Build matrix
|
||
for platform in "${PLATFORMS[@]}"; do
|
||
for arch in "${ARCHS[@]}"; do
|
||
for bintype in "${BINTYPES[@]}"; do
|
||
# 设置darwin和windows的白名单arch,只能是 arm64 amd64
|
||
if [[ "$platform" == "darwin" && "$arch" != "arm64" && "$arch" != "amd64" ]]; then continue; fi
|
||
if [[ "$platform" == "windows" && "$arch" != "arm64" && "$arch" != "amd64" ]]; then continue; fi
|
||
if [[ "$platform" == "android" && "$arch" != "arm64" ]]; then continue; fi
|
||
echo "Building $bintype binary for $platform-$arch"
|
||
build_binary "$platform" "$arch" "$bintype"
|
||
done
|
||
done
|
||
done
|
||
|
||
# Move to current directory if current enabled
|
||
if [[ "$CURRENT" == "true" ]]; then
|
||
cp dist/frp* ./frp-panel
|
||
fi
|
||
|
||
echo "Build Done!"
|