仓库结构: edge/ 设备端(原根目录设备端代码整体移入) control/ 管理端(清理后) docs/ 文档(PRD 移入 design/) README.md 根导航(新增) 清理: - control/.brainstorm 临时草稿删除 - control 根级重复文档(API表/PRD_04)并入 docs/design/ - control/plan.md -> docs/implementation/control-plan.md - control/safesightd-linux-arm64 二进制取消版本控制(.gitignore) - edge/transform 模型转换产物归入 models/,onnx/pt 大源文件取消跟踪(.gitignore) - Readme.md(PRD) -> docs/design/PRD_Product_v1.2.md(避开 README 大小写冲突) 更新: - 根 README.md 导航、docs/README.md 文档索引 - deployment.md/检查表路径加 edge/ 前缀 - .gitignore 重写(edge/control 分区规则)
219 lines
7.9 KiB
Bash
Executable File
219 lines
7.9 KiB
Bash
Executable File
#!/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"
|