OrangePi3588Media/scripts/build.sh
2026-02-27 10:37:42 +08:00

209 lines
7.0 KiB
Bash
Executable File
Raw Permalink 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
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/media-server"
ls -lh "$BUILD_DIR/media-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 rk3588-agent_linux_arm64 ./cmd/rk3588-agent
echo -e "${GREEN}${NC} Agent 编译完成"
echo " 输出: $AGENT_DIR/rk3588-agent_linux_arm64"
ls -lh "$AGENT_DIR/rk3588-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"