#!/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 echo -e "${CYAN}[配置 CMake]${NC}" 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" # 编译 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 echo -e "${CYAN}[编译 Agent]${NC}" go build -o safesight-agent_linux_arm64 ./cmd/safesight-agent echo -e "${GREEN}✓${NC} Agent 编译完成" echo " 输出: $AGENT_DIR/safesight-agent_linux_arm64" ls -lh "$AGENT_DIR/safesight-agent_linux_arm64" 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"