添加编译脚本
This commit is contained in:
183
building-linux.sh
Normal file
183
building-linux.sh
Normal file
@@ -0,0 +1,183 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
DIST_DIR="${DIST_DIR:-$ROOT_DIR/dist}"
|
||||
MAIN_PKG="./cmd/sing-box"
|
||||
GO_BIN="${GO_BIN:-go}"
|
||||
CGO_ENABLED_VALUE="${CGO_ENABLED_VALUE:-0}"
|
||||
|
||||
DEFAULT_TARGETS=(
|
||||
"linux-amd64"
|
||||
"linux-arm64"
|
||||
"linux-armv7"
|
||||
"windows-amd64"
|
||||
"windows-arm64"
|
||||
"darwin-amd64"
|
||||
"darwin-arm64"
|
||||
)
|
||||
|
||||
usage() {
|
||||
cat <<'EOF'
|
||||
Usage:
|
||||
./build.sh Build common targets
|
||||
./build.sh all Build common targets
|
||||
./build.sh linux-amd64 Build a single target
|
||||
./build.sh linux-amd64 windows-amd64
|
||||
./build.sh current Build current host platform
|
||||
|
||||
Environment variables:
|
||||
GO_BIN Go binary path, default: go
|
||||
DIST_DIR Output directory, default: ./dist
|
||||
CGO_ENABLED_VALUE CGO_ENABLED value, default: 0
|
||||
VERSION Embedded version string, default: git describe --tags --always
|
||||
BUILD_TAGS_OTHERS Override tags for non-Windows builds
|
||||
BUILD_TAGS_WINDOWS Override tags for Windows builds
|
||||
EOF
|
||||
}
|
||||
|
||||
require_file() {
|
||||
local file="$1"
|
||||
if [[ ! -f "$file" ]]; then
|
||||
echo "Missing required file: $file" >&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
trim_file() {
|
||||
local file="$1"
|
||||
awk 'BEGIN{ORS=""} {gsub(/\r/, ""); print}' "$file"
|
||||
}
|
||||
|
||||
resolve_version() {
|
||||
if [[ -n "${VERSION:-}" ]]; then
|
||||
printf '%s' "$VERSION"
|
||||
return
|
||||
fi
|
||||
if git -C "$ROOT_DIR" rev-parse --is-inside-work-tree >/dev/null 2>&1; then
|
||||
git -C "$ROOT_DIR" describe --tags --always 2>/dev/null || git -C "$ROOT_DIR" rev-parse --short HEAD
|
||||
return
|
||||
fi
|
||||
printf '%s' "custom"
|
||||
}
|
||||
|
||||
build_target() {
|
||||
local target="$1"
|
||||
local goos goarch goarm="" output tags
|
||||
|
||||
case "$target" in
|
||||
linux-amd64)
|
||||
goos="linux"
|
||||
goarch="amd64"
|
||||
output="$DIST_DIR/sing-box-linux-amd64"
|
||||
tags="$BUILD_TAGS_OTHERS"
|
||||
;;
|
||||
linux-arm64)
|
||||
goos="linux"
|
||||
goarch="arm64"
|
||||
output="$DIST_DIR/sing-box-linux-arm64"
|
||||
tags="$BUILD_TAGS_OTHERS"
|
||||
;;
|
||||
linux-armv7)
|
||||
goos="linux"
|
||||
goarch="arm"
|
||||
goarm="7"
|
||||
output="$DIST_DIR/sing-box-linux-armv7"
|
||||
tags="$BUILD_TAGS_OTHERS"
|
||||
;;
|
||||
windows-amd64)
|
||||
goos="windows"
|
||||
goarch="amd64"
|
||||
output="$DIST_DIR/sing-box-windows-amd64.exe"
|
||||
tags="$BUILD_TAGS_WINDOWS"
|
||||
;;
|
||||
windows-arm64)
|
||||
goos="windows"
|
||||
goarch="arm64"
|
||||
output="$DIST_DIR/sing-box-windows-arm64.exe"
|
||||
tags="$BUILD_TAGS_WINDOWS"
|
||||
;;
|
||||
darwin-amd64)
|
||||
goos="darwin"
|
||||
goarch="amd64"
|
||||
output="$DIST_DIR/sing-box-darwin-amd64"
|
||||
tags="$BUILD_TAGS_OTHERS"
|
||||
;;
|
||||
darwin-arm64)
|
||||
goos="darwin"
|
||||
goarch="arm64"
|
||||
output="$DIST_DIR/sing-box-darwin-arm64"
|
||||
tags="$BUILD_TAGS_OTHERS"
|
||||
;;
|
||||
current)
|
||||
goos="$("$GO_BIN" env GOOS)"
|
||||
goarch="$("$GO_BIN" env GOARCH)"
|
||||
output="$DIST_DIR/sing-box-${goos}-${goarch}"
|
||||
if [[ "$goos" == "windows" ]]; then
|
||||
output="${output}.exe"
|
||||
tags="$BUILD_TAGS_WINDOWS"
|
||||
else
|
||||
tags="$BUILD_TAGS_OTHERS"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
echo "Unsupported target: $target" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
echo "==> Building $target"
|
||||
(
|
||||
cd "$ROOT_DIR"
|
||||
export CGO_ENABLED="$CGO_ENABLED_VALUE"
|
||||
export GOOS="$goos"
|
||||
export GOARCH="$goarch"
|
||||
if [[ -n "$goarm" ]]; then
|
||||
export GOARM="$goarm"
|
||||
else
|
||||
unset GOARM 2>/dev/null || true
|
||||
fi
|
||||
|
||||
"$GO_BIN" build -v -p 1 -trimpath \
|
||||
-ldflags "-X 'github.com/sagernet/sing-box/constant.Version=$VERSION_VALUE' $LDFLAGS_SHARED -s -w -buildid=" \
|
||||
-tags "$tags" \
|
||||
-o "$output" \
|
||||
"$MAIN_PKG"
|
||||
)
|
||||
}
|
||||
|
||||
if [[ "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then
|
||||
usage
|
||||
exit 0
|
||||
fi
|
||||
|
||||
require_file "$ROOT_DIR/release/DEFAULT_BUILD_TAGS_OTHERS"
|
||||
require_file "$ROOT_DIR/release/DEFAULT_BUILD_TAGS_WINDOWS"
|
||||
require_file "$ROOT_DIR/release/LDFLAGS"
|
||||
|
||||
if ! command -v "$GO_BIN" >/dev/null 2>&1; then
|
||||
echo "Go binary not found: $GO_BIN" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
BUILD_TAGS_OTHERS="${BUILD_TAGS_OTHERS:-$(trim_file "$ROOT_DIR/release/DEFAULT_BUILD_TAGS_OTHERS")}"
|
||||
BUILD_TAGS_WINDOWS="${BUILD_TAGS_WINDOWS:-$(trim_file "$ROOT_DIR/release/DEFAULT_BUILD_TAGS_WINDOWS")}"
|
||||
LDFLAGS_SHARED="$(trim_file "$ROOT_DIR/release/LDFLAGS")"
|
||||
VERSION_VALUE="$(resolve_version)"
|
||||
|
||||
mkdir -p "$DIST_DIR"
|
||||
|
||||
if [[ "$#" -eq 0 || "${1:-}" == "all" ]]; then
|
||||
TARGETS=("${DEFAULT_TARGETS[@]}")
|
||||
else
|
||||
TARGETS=("$@")
|
||||
fi
|
||||
|
||||
for target in "${TARGETS[@]}"; do
|
||||
build_target "$target"
|
||||
done
|
||||
|
||||
echo
|
||||
echo "Build completed."
|
||||
echo "Output directory: $DIST_DIR"
|
||||
Reference in New Issue
Block a user