safesight/scripts/build.sh
tian 923ab10d5c feat(edge): 双层版本模型 - 语义化主版本 + 构建号
- 新增 VERSION 文件(1.0.0)作为主版本号来源,发版改文件即可,不依赖 git tag
- agent: Version=主版本(VERSION 文件), BuildID=构建号(时间戳), GitSHA 保留
- media: 版本输出 v1.0.0 (build YYYYMMDD.HHMMSS, git xxxxxxx)
- init() 兜底: 主版本 0.0.0 / 构建号自动生成,产品上无占位值
2026-08-01 17:16:09 +08:00

219 lines
7.9 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# RK3588 Media Server 编译脚本
# 一键编译 Media Server 和 Agent
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
# 项目目录
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
BUILD_DIR="$PROJECT_DIR/build"
# 编译选项(可通过环境变量覆盖)
BUILD_TYPE="${BUILD_TYPE:-Release}"
BUILD_TESTS="${BUILD_TESTS:-OFF}"
BUILD_SAMPLES="${BUILD_SAMPLES:-ON}"
ENABLE_FFMPEG="${ENABLE_FFMPEG:-ON}"
ENABLE_MPP="${ENABLE_MPP:-ON}"
ENABLE_RGA="${ENABLE_RGA:-ON}"
ENABLE_ZLMEDIAKIT="${ENABLE_ZLMEDIAKIT:-ON}"
ENABLE_RKNN="${ENABLE_RKNN:-ON}"
show_help() {
echo "RK3588 Media Server 编译脚本"
echo ""
echo "用法: ./scripts/build.sh [选项]"
echo ""
echo "选项:"
echo " -h, --help 显示帮助信息"
echo " -c, --clean 清理构建目录"
echo " -j N 并行编译任务数(默认: $(nproc)"
echo " -a, --agent-only 仅编译 Agent"
echo " -m, --media-only 仅编译 Media Server"
echo " -d, --debug Debug 模式编译"
echo ""
echo "环境变量:"
echo " BUILD_TYPE 编译类型 (Release/Debug, 默认: Release)"
echo " BUILD_TESTS 编译测试 (ON/OFF, 默认: OFF)"
echo " BUILD_SAMPLES 编译示例 (ON/OFF, 默认: ON)"
echo " ENABLE_FFMPEG 启用 FFmpeg (ON/OFF, 默认: ON)"
echo " ENABLE_MPP 启用 MPP (ON/OFF, 默认: ON)"
echo " ENABLE_RGA 启用 RGA (ON/OFF, 默认: ON)"
echo " ENABLE_ZLMEDIAKIT 启用 ZLMediaKit (ON/OFF, 默认: ON)"
echo " ENABLE_RKNN 启用 RKNN (ON/OFF, 默认: ON)"
echo ""
echo "示例:"
echo " ./scripts/build.sh # 完整编译"
echo " ./scripts/build.sh -c # 清理后编译"
echo " ./scripts/build.sh -j4 # 使用4线程编译"
echo " ./scripts/build.sh -m # 仅编译 Media Server"
echo " BUILD_TYPE=Debug ./scripts/build.sh # Debug 模式"
}
# 解析参数
CLEAN=0
JOBS=$(nproc)
BUILD_AGENT=1
BUILD_MEDIA=1
while [[ $# -gt 0 ]]; do
case $1 in
-h|--help)
show_help
exit 0
;;
-c|--clean)
CLEAN=1
shift
;;
-j)
if [[ -n "$2" && "$2" != -* ]]; then
JOBS="$2"
shift 2
else
echo -e "${RED}错误: -j 选项需要指定线程数${NC}"
exit 1
fi
;;
-j[0-9]*)
# 支持 -j4 这种格式
JOBS="${1#-j}"
shift
;;
-a|--agent-only)
BUILD_MEDIA=0
shift
;;
-m|--media-only)
BUILD_AGENT=0
shift
;;
-d|--debug)
BUILD_TYPE="Debug"
shift
;;
*)
echo -e "${RED}未知选项: $1${NC}"
show_help
exit 1
;;
esac
done
echo -e "${BLUE}╔════════════════════════════════════════════════════════════╗${NC}"
echo -e "${BLUE}║ RK3588 Media Server 编译脚本 ║${NC}"
echo -e "${BLUE}╚════════════════════════════════════════════════════════════╝${NC}"
echo ""
cd "$PROJECT_DIR"
# 清理构建目录
if [ $CLEAN -eq 1 ]; then
echo -e "${YELLOW}[清理构建目录]${NC}"
rm -rf "$BUILD_DIR"
echo -e "${GREEN}${NC} 构建目录已清理"
echo ""
fi
# 编译 Media Server
if [ $BUILD_MEDIA -eq 1 ]; then
echo -e "${BLUE}[编译 Media Server]${NC}"
echo "编译选项:"
echo " BUILD_TYPE: $BUILD_TYPE"
echo " BUILD_TESTS: $BUILD_TESTS"
echo " BUILD_SAMPLES: $BUILD_SAMPLES"
echo " ENABLE_FFMPEG: $ENABLE_FFMPEG"
echo " ENABLE_MPP: $ENABLE_MPP"
echo " ENABLE_RGA: $ENABLE_RGA"
echo " ENABLE_ZLMEDIAKIT: $ENABLE_ZLMEDIAKIT"
echo " ENABLE_RKNN: $ENABLE_RKNN"
echo ""
# 配置 ZLMediaKit 路径
ZLMK_LIB_PATH="$PROJECT_DIR/third_party/rknpu2/examples/3rdparty/zlmediakit/aarch64/libmk_api.so"
ZLMK_INCLUDE_DIR="$PROJECT_DIR/third_party/rknpu2/examples/3rdparty/zlmediakit/include"
# 检查 ZLMediaKit 库是否存在
if [ ! -f "$ZLMK_LIB_PATH" ]; then
echo -e "${YELLOW}警告: ZLMediaKit 库未找到,禁用 ZLMediaKit 支持${NC}"
ENABLE_ZLMEDIAKIT="OFF"
fi
# 配置 CMake主版本号来自 VERSION 文件,构建号自动生成)
echo -e "${CYAN}[配置 CMake]${NC}"
RK_GIT_SHA="$(git rev-parse --short HEAD 2>/dev/null || echo "nogit")"
RK_PROJECT_VERSION="$(cat "$PROJECT_DIR/VERSION" 2>/dev/null || echo "1.0.0")"
RK_BUILD_ID="$(date +%Y%m%d.%H%M%S)"
cmake -S . -B "$BUILD_DIR" \
-DCMAKE_BUILD_TYPE="$BUILD_TYPE" \
-DBUILD_TESTS="$BUILD_TESTS" \
-DBUILD_SAMPLES="$BUILD_SAMPLES" \
-DRK3588_ENABLE_FFMPEG="$ENABLE_FFMPEG" \
-DRK3588_ENABLE_MPP="$ENABLE_MPP" \
-DRK3588_ENABLE_RGA="$ENABLE_RGA" \
-DRK3588_ENABLE_ZLMEDIAKIT="$ENABLE_ZLMEDIAKIT" \
-DRK3588_ENABLE_RKNN="$ENABLE_RKNN" \
-DRK_ZLMK_API_LIB_PATH="$ZLMK_LIB_PATH" \
-DRK_ZLMEDIAKIT_INCLUDE_DIR="$ZLMK_INCLUDE_DIR" \
-DRK_GIT_SHA="${RK_GIT_SHA}" \
-DRK_PROJECT_VERSION="${RK_PROJECT_VERSION}" \
-DRK_BUILD_ID="${RK_BUILD_ID}"
# 编译
echo -e "${CYAN}[编译中... 使用 $JOBS 线程]${NC}"
cmake --build "$BUILD_DIR" -j"$JOBS"
echo -e "${GREEN}${NC} Media Server 编译完成"
echo " 输出: $BUILD_DIR/safesight-edge-server"
ls -lh "$BUILD_DIR/safesight-edge-server"
echo ""
fi
# 编译 Agent
if [ $BUILD_AGENT -eq 1 ]; then
echo -e "${BLUE}[编译 Agent]${NC}"
AGENT_DIR="$PROJECT_DIR/agent"
if [ ! -d "$AGENT_DIR" ]; then
echo -e "${YELLOW}警告: Agent 目录不存在,跳过编译${NC}"
elif [ ! -f "$AGENT_DIR/go.mod" ]; then
echo -e "${YELLOW}警告: Agent 不是 Go 项目,跳过编译${NC}"
else
cd "$AGENT_DIR"
# 检查 go 是否安装
if ! command -v go &> /dev/null; then
echo -e "${RED}错误: Go 未安装,无法编译 Agent${NC}"
exit 1
fi
# 编译 Agent主版本号来自 VERSION 文件,构建号自动生成)
echo -e "${CYAN}[编译 Agent]${NC}"
AGENT_VERSION="$(cat "$PROJECT_DIR/VERSION" 2>/dev/null || echo "1.0.0")"
AGENT_GIT_SHA="$(git rev-parse --short HEAD 2>/dev/null || echo "nogit")"
AGENT_BUILD_ID="$(date +%Y%m%d.%H%M%S)"
go build -trimpath -ldflags "-s -w -X main.Version=${AGENT_VERSION} -X main.BuildID=${AGENT_BUILD_ID} -X main.BuildType=release -X main.GitSHA=${AGENT_GIT_SHA}" -o safesight-edge-agent ./cmd/safesight-agent
echo " 版本: V${AGENT_VERSION} (build ${AGENT_BUILD_ID}, git ${AGENT_GIT_SHA})"
echo -e "${GREEN}${NC} Agent 编译完成"
echo " 输出: $AGENT_DIR/safesight-edge-agent"
ls -lh "$AGENT_DIR/safesight-edge-agent"
fi
echo ""
fi
echo -e "${GREEN}╔════════════════════════════════════════════════════════════╗${NC}"
echo -e "${GREEN}║ 编译完成! ║${NC}"
echo -e "${GREEN}╚════════════════════════════════════════════════════════════╝${NC}"
echo ""
echo "下一步:"
echo " 部署服务: sudo ./scripts/deploy.sh install"
echo " 查看状态: sudo ./scripts/deploy.sh status"