GrabBag/GrabBagPrj/pkg_workpiece.sh

410 lines
13 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
#workpiece 版本配置
PKG_NAME="Workpiece"
PKG_ARCH="arm64"
# 从Version.h文件中读取版本信息
VERSION_FILE="../App/Workpiece/WorkpieceApp/Version.h"
if [ -f "${VERSION_FILE}" ]; then
# 读取版本号(从 WORKPIECE_VERSION_STRING 中提取)
PKG_VERSION=$(grep '#define WORKPIECE_VERSION_STRING' ${VERSION_FILE} | sed 's/.*"\(.*\)".*/\1/')
# 读取构建号(从 WORKPIECE_BUILD_STRING 中提取)
BUILD_NUMBER=$(grep '#define WORKPIECE_BUILD_STRING' ${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/WorkpiecePkg
CODE_PATH=../
RELEASE_PATH=../Publish
echo "=========================================="
echo "开始打包 Workpiece 应用程序 v${PKG_VERSION}..."
echo "=========================================="
echo "清理所有旧的打包目录..."
rm -rf $HOME/*Pkg
#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
echo "创建打包目录结构..."
mkdir -p ${PKG_PATH}/DEBIAN
mkdir -p ${PKG_PATH}/etc/profile.d
mkdir -p ${PKG_PATH}/etc/xdg/autostart
mkdir -p ${PKG_PATH}/opt/sysroot/lib
mkdir -p ${PKG_PATH}/usr/local/bin
mkdir -p ${PKG_PATH}/usr/lib
mkdir -p ${PKG_PATH}/usr/share/applications
mkdir -p ${PKG_PATH}/usr/share/pixmaps
echo "复制 Qt 运行时环境..."
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 相关库文件
if [[ "$filename" == *icu* ]]; then
# 复制其他库文件,保持符号链接
cp -rfd "$libfile" ${PKG_PATH}/opt/sysroot/lib/
continue
fi
done
echo "复制依赖库文件..."
#depend
cp -a ${CODE_PATH}/SDK/OpenCV320/Arm/aarch64/*opencv_core*.so* ${PKG_PATH}/usr/lib/
cp -a ${CODE_PATH}/SDK/OpenCV320/Arm/aarch64/*opencv_imgproc*.so* ${PKG_PATH}/usr/lib/
cp -a ${CODE_PATH}/SDK/OpenCV320/Arm/aarch64/*opencv_highgui*.so* ${PKG_PATH}/usr/lib/
cp ${CODE_PATH}/AppAlgo/workpieceCornerExtraction/Arm/aarch64/*.so ${PKG_PATH}/usr/lib/
cp ${CODE_PATH}/SDK/Device/VzNLSDK/Arm/aarch64/*.so ${PKG_PATH}/usr/lib/
echo "复制应用程序主文件..."
#APP
cp ${CODE_PATH}/GrabBagPrj/buildarm/App/Workpiece/WorkpieceApp/WorkpieceApp ${PKG_PATH}/usr/local/bin/
echo "复制应用程序图标..."
#LOGO
cp ${CODE_PATH}/App/Workpiece/WorkpieceApp/resource/logo.png ${PKG_PATH}/usr/share/pixmaps/workpiece.png
echo "生成桌面自启动配置文件..."
#desktop autostart configuration
AUTOSTART_PATH=${PKG_PATH}/etc/xdg/autostart/workpiece.desktop
cat > ${AUTOSTART_PATH} << EOF
[Desktop Entry]
Type=Application
Name=Workpiece
Comment=Workpiece Application Auto Start
Exec=/usr/local/bin/WorkpieceApp
Icon=/usr/share/pixmaps/workpiece.png
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
AutostartCondition=GNOME3 unless-session gnome
EOF
echo "生成 control 文件..."
#control
CONTROL_PATH=${PKG_PATH}/DEBIAN/control
echo "Package: ${PKG_NAME}" > ${CONTROL_PATH}
echo "Version: ${PKG_VERSION}" >> ${CONTROL_PATH}
echo "Section: workpieceapp" >> ${CONTROL_PATH}
echo "Architecture: ${PKG_ARCH}" >> ${CONTROL_PATH}
echo "Priority: optional" >> ${CONTROL_PATH}
echo "Maintainer: Workpiece Team <support@workpiece.com>" >> ${CONTROL_PATH}
echo "Description: workpiece app" >> ${CONTROL_PATH}
echo "生成安装后脚本..."
#postinst install exec script
POSTINST_PATH=${PKG_PATH}/DEBIAN/postinst
cat > ${POSTINST_PATH} << 'EOF'
#!/bin/bash
echo "配置 Workpiece 应用程序..."
# 创建应用注册目录和文件
REGISTRY_DIR="/var/lib/vr-apps"
REGISTRY_FILE="${REGISTRY_DIR}/installed-apps.list"
APP_NAME="Workpiece"
mkdir -p "${REGISTRY_DIR}"
touch "${REGISTRY_FILE}"
# 检查是否是首次安装VR应用
FIRST_INSTALL=false
if [ ! -s "${REGISTRY_FILE}" ]; then
FIRST_INSTALL=true
echo "检测到首次安装VR应用将安装公共资源..."
fi
# 设置库文件路径(每个应用独立配置)
echo "/usr/lib" > /etc/ld.so.conf.d/workpiece.conf
echo "/opt/sysroot/lib/" >> /etc/ld.so.conf.d/workpiece.conf
# 如果不是首次安装,公共库已经配置过,只需要更新
if [ "${FIRST_INSTALL}" = true ]; then
echo "配置公共库路径..."
ldconfig
else
echo "公共库已存在,仅更新配置..."
ldconfig
fi
# 确保应用程序可执行
chmod +x /usr/local/bin/WorkpieceApp
# 配置端口映射 502 -> 5020
echo "配置端口映射 502 -> 5020..."
# 检查并创建systemd服务确保重启后规则生效
if [ ! -f /etc/systemd/system/vr-port-mapping.service ]; then
echo "创建端口映射服务..."
cat > /etc/systemd/system/vr-port-mapping.service << 'PORTEOF'
[Unit]
Description=VR Common Port Mapping Service
After=network.target
[Service]
Type=oneshot
ExecStart=/bin/bash -c 'iptables -t nat -A PREROUTING -p tcp --dport 502 -j REDIRECT --to-port 5020'
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
PORTEOF
systemctl enable vr-port-mapping.service
systemctl start vr-port-mapping.service
else
echo "端口映射服务已存在,跳过创建..."
# 确保服务处于启用状态
systemctl enable vr-port-mapping.service 2>/dev/null || true
systemctl start vr-port-mapping.service 2>/dev/null || true
fi
# 检查iptables规则是否已存在
if ! iptables -t nat -C PREROUTING -p tcp --dport 502 -j REDIRECT --to-port 5020 2>/dev/null; then
echo "添加iptables端口映射规则..."
iptables -t nat -A PREROUTING -p tcp --dport 502 -j REDIRECT --to-port 5020
else
echo "iptables规则已存在跳过添加..."
fi
# 检查并创建当前用户的桌面快捷方式
echo "检查当前用户的桌面快捷方式..."
# 获取当前执行安装的用户信息
if [ -n "$SUDO_USER" ]; then
# 如果是通过sudo执行的获取真实用户
current_user="$SUDO_USER"
current_home=$(getent passwd "$current_user" | cut -d: -f6)
else
# 直接执行的情况
current_user=$(whoami)
current_home="$HOME"
fi
echo "当前用户: $current_user"
echo "用户主目录: $current_home"
# 检查多种可能的桌面目录名称
desktop_dirs=("Desktop" "桌面" "desktop")
desktop_dir=""
desktop_shortcut=""
for dir_name in "${desktop_dirs[@]}"; do
potential_dir="$current_home/$dir_name"
if [ -d "$potential_dir" ]; then
desktop_dir="$potential_dir"
desktop_shortcut="$desktop_dir/workpiece.desktop"
echo "找到桌面目录: $desktop_dir"
break
fi
done
# 检查是否找到桌面目录
if [ -n "$desktop_dir" ]; then
# 检查桌面上是否已有快捷方式
if [ ! -f "$desktop_shortcut" ]; then
echo "为当前用户创建桌面快捷方式..."
# 复制桌面文件到用户桌面
cp /usr/share/applications/workpiece.desktop "$desktop_shortcut"
# 设置正确的所有者和权限
chown $current_user:$current_user "$desktop_shortcut" 2>/dev/null || true
chmod 755 "$desktop_shortcut"
echo "已创建桌面快捷方式: $desktop_shortcut"
else
echo "桌面快捷方式已存在,跳过创建"
fi
else
echo "当前用户没有找到桌面目录(Desktop/桌面/desktop),跳过桌面快捷方式创建"
fi
# 注册应用到系统
if ! grep -q "^${APP_NAME}$" "${REGISTRY_FILE}"; then
echo "${APP_NAME}" >> "${REGISTRY_FILE}"
echo "应用 ${APP_NAME} 已注册到系统"
else
echo "应用 ${APP_NAME} 已经注册,跳过..."
fi
echo "Workpiece 应用程序安装完成!"
echo "应用程序将在用户登录桌面后自动启动。"
echo "端口映射已配置502 -> 5020"
echo "桌面快捷方式已创建如果用户有Desktop目录"
echo "如需立即启动,请运行: /usr/local/bin/WorkpieceApp"
echo "如需禁用自启动,请删除文件: ~/.config/autostart/workpiece.desktop"
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 "卸载 Workpiece 应用程序..."
# 应用注册信息
REGISTRY_DIR="/var/lib/vr-apps"
REGISTRY_FILE="${REGISTRY_DIR}/installed-apps.list"
APP_NAME="Workpiece"
# 从注册表中移除应用
if [ -f "${REGISTRY_FILE}" ]; then
sed -i "/^${APP_NAME}$/d" "${REGISTRY_FILE}"
echo "应用 ${APP_NAME} 已从系统注册表中移除"
fi
# 清理应用专属的库文件配置
rm -f /etc/ld.so.conf.d/workpiece.conf
# 检查是否还有其他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应用开始清理公共资源..."
# 清理端口映射配置
echo "清理端口映射配置..."
systemctl stop vr-port-mapping.service 2>/dev/null || true
systemctl disable vr-port-mapping.service 2>/dev/null || true
rm -f /etc/systemd/system/vr-port-mapping.service
# 清理iptables规则
iptables -t nat -D PREROUTING -p tcp --dport 502 -j REDIRECT --to-port 5020 2>/dev/null || true
# 清理注册目录
rm -rf "${REGISTRY_DIR}"
echo "公共资源已清理"
else
echo "系统中还有 ${REMAINING_APPS} 个VR应用在运行保留公共资源"
if [ -f "${REGISTRY_FILE}" ]; then
echo "剩余应用: $(cat ${REGISTRY_FILE} | tr '\n' ' ')"
fi
fi
# 更新库缓存
ldconfig
# 重新加载systemd
systemctl daemon-reload
# 清理当前用户的桌面快捷方式
echo "清理当前用户的桌面快捷方式..."
# 获取当前执行卸载的用户信息
if [ -n "$SUDO_USER" ]; then
# 如果是通过sudo执行的获取真实用户
current_user="$SUDO_USER"
current_home=$(getent passwd "$current_user" | cut -d: -f6)
else
# 直接执行的情况
current_user=$(whoami)
current_home="$HOME"
fi
# 检查多种可能的桌面目录名称并清理快捷方式
desktop_dirs=("Desktop" "桌面" "desktop")
shortcut_found=false
for dir_name in "${desktop_dirs[@]}"; do
desktop_shortcut="$current_home/$dir_name/workpiece.desktop"
if [ -f "$desktop_shortcut" ]; then
echo "删除当前用户的桌面快捷方式: $desktop_shortcut"
rm -f "$desktop_shortcut"
echo "已删除桌面快捷方式: $desktop_shortcut"
shortcut_found=true
fi
done
if [ "$shortcut_found" = false ]; then
echo "当前用户没有找到桌面快捷方式,跳过清理"
fi
echo "Workpiece 应用程序卸载完成!"
if [ "${REMAINING_APPS}" -eq 0 ]; then
echo "所有VR应用已卸载公共资源已清理"
else
echo "公共资源已保留供其他VR应用使用"
fi
echo "桌面快捷方式已清理"
echo "如需彻底清理自启动配置,请手动删除: ~/.config/autostart/workpiece.desktop"
EOF
chmod +x ${POSTRM_PATH}
echo "生成桌面快捷方式..."
#desktop
DESKTOP_PATH=${PKG_PATH}/usr/share/applications/workpiece.desktop
echo "[Desktop Entry]" > ${DESKTOP_PATH}
echo "Version=${PKG_VERSION}" >> ${DESKTOP_PATH}
echo "Name=Workpiece" >> ${DESKTOP_PATH}
echo "Type=Application" >> ${DESKTOP_PATH}
echo "Comment=Workpiece App" >> ${DESKTOP_PATH}
echo "Terminal=false" >> ${DESKTOP_PATH}
echo "Exec=/usr/local/bin/WorkpieceApp" >> ${DESKTOP_PATH}
echo "Icon=/usr/share/pixmaps/workpiece.png" >> ${DESKTOP_PATH}
echo "Categories=Development;" >> ${DESKTOP_PATH}
echo "GenericName=Workpiece App" >> ${DESKTOP_PATH}
echo "Keywords=workpiece;app;" >> ${DESKTOP_PATH}
echo "StartupNotify=true" >> ${DESKTOP_PATH}
echo "设置文件权限..."
# 设置usr目录权限不包括DEBIAN
chmod -R 755 ${PKG_PATH}/usr
chmod -R 755 ${PKG_PATH}/etc
chmod -R 755 ${PKG_PATH}/opt
echo "开始构建 DEB 包..."
# 生成带时间戳和构建号的包文件名
TIMESTAMP=$(date +%Y%m%d%H%M%S)
DEB_FILENAME="${RELEASE_PATH}/${PKG_NAME}_${PKG_VERSION}_${BUILD_NUMBER}_${PKG_ARCH}_${TIMESTAMP}.deb"
fakeroot dpkg -b ${PKG_PATH} ${DEB_FILENAME}
echo "=========================================="
echo "打包完成!"
echo "生成的包文件: ${DEB_FILENAME}"
echo "文件大小: $(ls -lh ${DEB_FILENAME} | awk '{print $5}')"
echo "=========================================="