GrabBag/GrabBagPrj/pkg_binocularmark.sh
2025-12-10 00:01:32 +08:00

297 lines
10 KiB
Bash
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
# BinocularMarkServer 版本配置
PKG_NAME="BinocularMarkServer"
PKG_ARCH="arm64"
# 从Version.h文件中读取版本信息
VERSION_FILE="../App/BinocularMark/BinocularMarkApp/Version.h"
if [ -f "${VERSION_FILE}" ]; then
# 读取版本号(从 BINOCULAR_MARK_VERSION_STRING 中提取)
PKG_VERSION=$(grep '#define BINOCULAR_MARK_VERSION_STRING' ${VERSION_FILE} | sed 's/.*"\(.*\)".*/\1/')
# 读取构建号(从 BINOCULAR_MARK_VERSION_BUILD 中提取)
BUILD_NUMBER=$(grep '#define BINOCULAR_MARK_VERSION_BUILD' ${VERSION_FILE} | sed 's/.*"\(.*\)".*/\1/')
echo "${VERSION_FILE} 读取版本信息:"
echo " 版本号: ${PKG_VERSION}"
echo " 构建号: ${BUILD_NUMBER}"
# 如果读取失败,使用默认值
if [ -z "${PKG_VERSION}" ]; then
PKG_VERSION="1.0.0"
echo "警告: 无法读取版本号,使用默认值: ${PKG_VERSION}"
fi
if [ -z "${BUILD_NUMBER}" ]; then
BUILD_NUMBER="1"
echo "警告: 无法读取构建号,使用默认值: ${BUILD_NUMBER}"
fi
else
# Version.h文件不存在时的默认值
PKG_VERSION="1.0.0"
BUILD_NUMBER="1"
echo "警告: ${VERSION_FILE} 文件不存在,使用默认版本信息"
echo " 版本号: ${PKG_VERSION}"
echo " 构建号: ${BUILD_NUMBER}"
fi
PKG_PATH=$HOME/BinocularMarkServerPkg
CODE_PATH=../
RELEASE_PATH=../Publish
echo "=========================================="
echo "开始打包 BinocularMarkServer 应用程序 v${PKG_VERSION}..."
echo "=========================================="
echo "清理所有旧的打包目录..."
rm -rf $HOME/*Pkg
echo "创建打包目录结构..."
mkdir -p ${PKG_PATH}/DEBIAN
mkdir -p ${PKG_PATH}/usr/lib
mkdir -p ${PKG_PATH}/etc/profile.d
mkdir -p ${PKG_PATH}/opt/binocularmarkserver
mkdir -p ${PKG_PATH}/opt/sysroot/lib
echo "复制 Qt 运行时环境..."
# QT depend
QT_PKG_PATH=/opt/firefly_qt5.15_arm64_20.04
QT_LIB_PATH=/opt/sysroot/firefly-arm64-sysroot-20.04/lib/aarch64-linux-gnu
cp -rfd ${QT_PKG_PATH}/ext ${PKG_PATH}/opt/firefly_qt5.15
cp ${QT_PKG_PATH}/target_qtEnv.sh ${PKG_PATH}/etc/profile.d/
# 复制 Qt 库文件
for libfile in ${QT_LIB_PATH}/*.so*; do
# 获取文件名用于比较
filename=$(basename "$libfile")
# 跳过 LLVM、flite、clang 和 X11 相关库文件,仅保留 ICU 相关库
if [[ "$filename" == *icu* ]] || [[ "$filename" == *cui* ]] ]; then
# 复制其他库文件,保持符号链接
cp -rfd "$libfile" ${PKG_PATH}/opt/sysroot/lib/
continue
fi
done
echo "复制依赖库文件..."
# OpenCV 4.8.0 依赖BinocularMark使用OpenCV480
cp -a ${CODE_PATH}/SDK/OpenCV480/Arm/aarch64/lib/*opencv_core*.so* ${PKG_PATH}/usr/lib/
cp -a ${CODE_PATH}/SDK/OpenCV480/Arm/aarch64/lib/*opencv_imgproc*.so* ${PKG_PATH}/usr/lib/
cp -a ${CODE_PATH}/SDK/OpenCV480/Arm/aarch64/lib/*opencv_highgui*.so* ${PKG_PATH}/usr/lib/
cp -a ${CODE_PATH}/SDK/OpenCV480/Arm/aarch64/lib/*opencv_imgcodecs*.so* ${PKG_PATH}/usr/lib/
cp -a ${CODE_PATH}/SDK/OpenCV480/Arm/aarch64/lib/*opencv_features2d*.so* ${PKG_PATH}/usr/lib/
cp -a ${CODE_PATH}/SDK/OpenCV480/Arm/aarch64/lib/*opencv_flann*.so* ${PKG_PATH}/usr/lib/
cp -a ${CODE_PATH}/SDK/OpenCV480/Arm/aarch64/lib/*opencv_objdetect*.so* ${PKG_PATH}/usr/lib/
cp -a ${CODE_PATH}/SDK/OpenCV480/Arm/aarch64/lib/*opencv_aruco*.so* ${PKG_PATH}/usr/lib/
cp -a ${CODE_PATH}/SDK/OpenCV480/Arm/aarch64/lib/*opencv_dnn*.so* ${PKG_PATH}/usr/lib/
cp -a ${CODE_PATH}/SDK/OpenCV480/Arm/aarch64/lib/*opencv_calib3d*.so* ${PKG_PATH}/usr/lib/
cp -a ${CODE_PATH}/SDK/OpenCV480/Arm/aarch64/lib/*opencv_photo*.so* ${PKG_PATH}/usr/lib/
# BinocularMark 算法库
cp ${CODE_PATH}/SDK/binocularMark/Arm/aarch64/*.so ${PKG_PATH}/usr/lib/
# Galaxy 相机SDK使用 armv8 版本,适配 aarch64
cp ${CODE_PATH}/SDK/Galaxy/aarch64/lib/armv8/*.so ${PKG_PATH}/usr/lib/
# 复制 BinocularMarkServer 目录下的所有内容到 /opt
echo "复制 BinocularMarkServer 内容到 /opt/..."
# APP
cp ${CODE_PATH}/GrabBagPrj/buildarm/App/BinocularMark/BinocularMarkApp/BinocularMarkApp ${PKG_PATH}/opt/binocularmarkserver/
# Service 文件
cp ${CODE_PATH}/App/BinocularMark/BinocularMarkApp/binocularmarkserver.service ${PKG_PATH}/opt/binocularmarkserver/
# Config 配置文件(如果存在)
if [ -d "${CODE_PATH}/App/BinocularMark/BinocularMarkApp/config" ]; then
echo "复制配置文件模板..."
cp -r ${CODE_PATH}/App/BinocularMark/BinocularMarkApp/config ${PKG_PATH}/opt/binocularmarkserver/
fi
echo "生成 control 文件..."
# control
CONTROL_PATH=${PKG_PATH}/DEBIAN/control
echo "Package: ${PKG_NAME}" > ${CONTROL_PATH}
echo "Version: ${PKG_VERSION}" >> ${CONTROL_PATH}
echo "Section: binocularmarkserver" >> ${CONTROL_PATH}
echo "Architecture: ${PKG_ARCH}" >> ${CONTROL_PATH}
echo "Priority: optional" >> ${CONTROL_PATH}
echo "Maintainer: BinocularMarkServer Team <support@binocularmark.com>" >> ${CONTROL_PATH}
echo "Description: BinocularMark 3D Detection Server" >> ${CONTROL_PATH}
echo "生成安装后脚本..."
# postinst install exec script
POSTINST_PATH=${PKG_PATH}/DEBIAN/postinst
cat > ${POSTINST_PATH} << 'EOF'
#!/bin/bash
echo "配置 BinocularMarkServer 应用程序..."
# 创建应用注册目录和文件
REGISTRY_DIR="/var/lib/vr-apps"
REGISTRY_FILE="${REGISTRY_DIR}/installed-apps.list"
APP_NAME="BinocularMarkServer"
mkdir -p "${REGISTRY_DIR}"
touch "${REGISTRY_FILE}"
# 检查是否是首次安装VR应用
FIRST_INSTALL=false
if [ ! -s "${REGISTRY_FILE}" ]; then
FIRST_INSTALL=true
echo "检测到首次安装VR应用将安装公共资源..."
fi
# 如果不是首次安装,公共库已经配置过,只需要更新
if [ "${FIRST_INSTALL}" = true ]; then
echo "配置公共库路径..."
ldconfig
else
echo "公共库已存在,仅更新配置..."
ldconfig
fi
# 安装并启用 binocularmarkserver.service
SERVICE_FILE="/opt/binocularmarkserver/binocularmarkserver.service"
TARGET_SERVICE_FILE="/etc/systemd/system/binocularmarkserver.service"
if [ -f "$SERVICE_FILE" ]; then
echo "安装 binocularmarkserver.service..."
# 检查服务是否已经存在,如果存在则先停止并禁用
if systemctl is-active --quiet binocularmarkserver.service 2>/dev/null; then
echo "检测到已运行的 binocularmarkserver.service,正在停止..."
systemctl stop binocularmarkserver.service
fi
if systemctl is-enabled --quiet binocularmarkserver.service 2>/dev/null; then
echo "检测到已启用的 binocularmarkserver.service,正在禁用..."
systemctl disable binocularmarkserver.service
fi
# 复制服务文件
cp "$SERVICE_FILE" "$TARGET_SERVICE_FILE"
# 设置正确的权限
chmod 644 "$TARGET_SERVICE_FILE"
systemctl daemon-reload
systemctl enable binocularmarkserver.service
systemctl start binocularmarkserver.service
echo "binocularmarkserver.service 已安装并设置为开机自启"
else
echo "错误: 未找到 binocularmarkserver.service 文件"
echo "请检查文件是否存在: $SERVICE_FILE"
exit 1
fi
# 注册应用到系统
if ! grep -q "^${APP_NAME}$" "${REGISTRY_FILE}"; then
echo "${APP_NAME}" >> "${REGISTRY_FILE}"
echo "应用 ${APP_NAME} 已注册到系统"
else
echo "应用 ${APP_NAME} 已经注册,跳过..."
fi
echo "BinocularMarkServer 应用程序安装完成!"
echo "服务端口: 5901"
echo "配置文件位置: /opt/binocularmarkserver/config/"
echo "服务状态: systemctl status binocularmarkserver"
echo "查看日志: journalctl -u binocularmarkserver -f"
echo "已安装的VR应用: $(cat ${REGISTRY_FILE} | tr '\n' ' ')"
EOF
chmod +x ${POSTINST_PATH}
echo "生成卸载脚本..."
# postrm uninstall exec script
POSTRM_PATH=${PKG_PATH}/DEBIAN/postrm
cat > ${POSTRM_PATH} << 'EOF'
#!/bin/bash
echo "卸载 BinocularMarkServer 应用程序..."
# 应用注册信息
REGISTRY_DIR="/var/lib/vr-apps"
REGISTRY_FILE="${REGISTRY_DIR}/installed-apps.list"
APP_NAME="BinocularMarkServer"
# 停止并禁用 binocularmarkserver.service
systemctl stop binocularmarkserver.service 2>/dev/null || true
systemctl disable binocularmarkserver.service 2>/dev/null || true
rm -f /etc/systemd/system/binocularmarkserver.service
# 从注册表中移除应用
if [ -f "${REGISTRY_FILE}" ]; then
sed -i "/^${APP_NAME}$/d" "${REGISTRY_FILE}"
echo "应用 ${APP_NAME} 已从系统注册表中移除"
fi
# 检查是否还有其他VR应用在使用公共资源
REMAINING_APPS=0
if [ -f "${REGISTRY_FILE}" ]; then
REMAINING_APPS=$(grep -c . "${REGISTRY_FILE}" 2>/dev/null || echo "0")
fi
echo "系统中剩余的VR应用数量: ${REMAINING_APPS}"
# 如果没有其他应用了,清理公共资源
if [ "${REMAINING_APPS}" -eq 0 ]; then
echo "没有其他VR应用开始清理公共资源..."
# 清理注册目录
rm -rf "${REGISTRY_DIR}"
echo "公共资源已清理"
else
echo "系统中还有 ${REMAINING_APPS} 个VR应用在运行保留公共资源"
if [ -f "${REGISTRY_FILE}" ]; then
echo "剩余应用: $(cat ${REGISTRY_FILE} | tr '\n' ' ')"
fi
fi
# 重新加载systemd
systemctl daemon-reload
# 只有在完全卸载时才删除 /opt/binocularmarkserver 目录
if [ "$1" = "remove" ]; then
# 清理 /opt/binocularmarkserver 目录
rm -rf /opt/binocularmarkserver
echo "已完全卸载 BinocularMarkServer 应用程序"
else
echo "更新无需删除应用程序"
fi
echo "BinocularMarkServer 应用程序卸载完成!"
if [ "${REMAINING_APPS}" -eq 0 ]; then
echo "所有VR应用已卸载公共资源已清理"
else
echo "公共资源已保留供其他VR应用使用"
fi
EOF
chmod +x ${POSTRM_PATH}
echo "设置文件权限..."
# 设置opt目录权限不包括DEBIAN
chmod -R 755 ${PKG_PATH}/opt
# 确保publish目录存在
mkdir -p ${RELEASE_PATH}
# 生成带时间戳和构建号的包文件名
TIMESTAMP=$(date +%Y%m%d%H%M%S)
DEB_FILENAME="${RELEASE_PATH}/${PKG_NAME}_${PKG_VERSION}_${BUILD_NUMBER}_${PKG_ARCH}_${TIMESTAMP}.deb"
# 开始构建 DEB 包
fakeroot dpkg -b ${PKG_PATH} ${DEB_FILENAME}
echo "=========================================="
echo "打包完成!"
echo "生成的包文件: ${DEB_FILENAME}"
echo "文件大小: $(ls -lh ${DEB_FILENAME} | awk '{print $5}')"
echo "=========================================="