297 lines
10 KiB
Bash
297 lines
10 KiB
Bash
|
|
#!/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 "=========================================="
|