sylixos-uploader/build.sh

99 lines
2.1 KiB
Bash
Executable File

#!/bin/bash
set -e # 遇到错误时退出脚本
# 检查是否在 Git 仓库中
if ! git rev-parse --is-inside-work-tree > /dev/null 2>&1; then
echo "Error: Not inside a Git repository."
exit 1
fi
# 获取最近的 tag
TAG=$(git describe --tags --abbrev=0 2>/dev/null)
# 获取最后一次提交的 SHA
COMMIT_SHA=$(git rev-parse --short HEAD)
# 检查是否有未提交的更改
if [ -n "$(git status --porcelain)" ]; then
DIRTY="-dirty"
else
DIRTY=""
fi
# 决定版本信息
if [ -n "$TAG" ]; then
VERSION="$TAG-$COMMIT_SHA$DIRTY"
else
VERSION="$COMMIT_SHA$DIRTY"
fi
# 输出版本信息
echo "Injecting version: $VERSION"
# 处理选项
BUILD_ALL=false
INSTALL_DIR=""
while [[ $# -gt 0 ]]; do
case $1 in
--all)
BUILD_ALL=true
shift
;;
--install-dir)
INSTALL_DIR="$2"
shift 2
;;
*)
echo "Unknown option: $1"
exit 1
;;
esac
done
# 编译函数
build_binary() {
local OS=$1
local ARCH=$2
local OUTPUT="sylixos-uploader-${OS}-${ARCH}-${VERSION}"
if [ "$OS" = "windows" ]; then
OUTPUT+=".exe"
fi
GOOS=$OS GOARCH=$ARCH CGO_ENABLED=0 go build -o "$OUTPUT" -ldflags "-s -w -X 'sylixos-uploader/common.Version=$VERSION'"
echo "Built: $OUTPUT"
}
# 默认只编译本地平台
if [ "$BUILD_ALL" = true ]; then
echo "Building for all platforms..."
PLATFORMS=(
"linux amd64"
"linux arm64"
"windows amd64"
"windows arm64"
"darwin amd64"
"darwin arm64"
"sylixos arm64"
)
for PLATFORM in "${PLATFORMS[@]}"; do
build_binary $PLATFORM
done
else
echo "Building for local platform..."
HOSTOS=$(go env GOHOSTOS)
HOSTARCH=$(go env GOHOSTARCH)
build_binary $HOSTOS $HOSTARCH
fi
# 安装到指定目录
if [ -n "$INSTALL_DIR" ]; then
mkdir -p "$INSTALL_DIR"
BIN_NAME="sylixos-uploader-$(go env GOHOSTOS)-$(go env GOHOSTARCH)-${VERSION}"
cp "$BIN_NAME" "$INSTALL_DIR/sylixos-uploader"
echo "Installed to $INSTALL_DIR"
fi
exit 0