GrabBag/GrabBagPrj/pkg_grabbagapp.sh
2025-09-14 14:51:38 +08:00

334 lines
11 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
#grabbag 版本配置
PKG_NAME="GrabBag"
PKG_ARCH="arm64"
# 从Version.h文件中读取版本信息
VERSION_FILE="../App/GrabBag/GrabBagApp/Version.h"
if [ -f "${VERSION_FILE}" ]; then
# 读取版本号(从 GRABBAG_VERSION_STRING 中提取)
PKG_VERSION=$(grep '#define GRABBAG_VERSION_STRING' ${VERSION_FILE} | sed 's/.*"\(.*\)".*/\1/')
# 读取构建号(从 GRABBAG_BUILD_STRING 中提取)
BUILD_NUMBER=$(grep '#define GRABBAG_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/GrabBagPkg
CODE_PATH=../
RELEASE_PATH=../Publish
echo "=========================================="
echo "开始打包 GrabBag 应用程序 v${PKG_VERSION}..."
echo "=========================================="
if [ -d "${PKG_PATH}" ];then
echo "清理旧的打包目录..."
rm -irf ${PKG_PATH}
fi
#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}/SDK/bagPosition/Arm/aarch64/*.so ${PKG_PATH}/usr/lib/
cp ${CODE_PATH}/SDK/VzNLSDK/Arm/aarch64/*.so ${PKG_PATH}/usr/lib/
echo "复制应用程序主文件..."
#APP
cp ${CODE_PATH}/GrabBagPrj/buildarm/App/GrabBag/GrabBagApp/GrabBagApp ${PKG_PATH}/usr/local/bin/
echo "复制应用程序图标..."
#LOGO
cp ${CODE_PATH}/App/GrabBag/GrabBagApp/resource/logo.png ${PKG_PATH}/usr/share/pixmaps/grabbag.png
echo "生成桌面自启动配置文件..."
#desktop autostart configuration
AUTOSTART_PATH=${PKG_PATH}/etc/xdg/autostart/grabbag.desktop
cat > ${AUTOSTART_PATH} << EOF
[Desktop Entry]
Type=Application
Name=GrabBag
Comment=GrabBag Application Auto Start
Exec=/usr/local/bin/GrabBagApp
Icon=/usr/share/pixmaps/grabbag.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: grabbagapp" >> ${CONTROL_PATH}
echo "Architecture: ${PKG_ARCH}" >> ${CONTROL_PATH}
echo "Priority: optional" >> ${CONTROL_PATH}
echo "Maintainer: GrabBag Team <support@grabbag.com>" >> ${CONTROL_PATH}
echo "Description: grabbag app" >> ${CONTROL_PATH}
echo "生成安装后脚本..."
#postinst install exec script
POSTINST_PATH=${PKG_PATH}/DEBIAN/postinst
cat > ${POSTINST_PATH} << 'EOF'
#!/bin/bash
echo "配置 GrabBag 应用程序..."
# 设置库文件路径
echo "/usr/lib" > /etc/ld.so.conf.d/grabbag.conf
echo "/opt/sysroot/lib/" >> /etc/ld.so.conf.d/grabbag.conf
ldconfig
# 确保应用程序可执行
chmod +x /usr/local/bin/GrabBagApp
# 配置端口映射 502 -> 5020
echo "配置端口映射 502 -> 5020..."
iptables -t nat -A PREROUTING -p tcp --dport 502 -j REDIRECT --to-port 5020
# 检查并创建systemd服务确保重启后规则生效
if [ ! -f /etc/systemd/system/grabbag-port-mapping.service ]; then
echo "创建端口映射服务..."
cat > /etc/systemd/system/grabbag-port-mapping.service << 'PORTEOF'
[Unit]
Description=GrabBag 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 grabbag-port-mapping.service
systemctl start grabbag-port-mapping.service
else
echo "端口映射服务已存在,跳过创建..."
# 确保服务处于启用状态
systemctl enable grabbag-port-mapping.service 2>/dev/null || true
systemctl start grabbag-port-mapping.service 2>/dev/null || true
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/grabbag.desktop"
echo "找到桌面目录: $desktop_dir"
break
fi
done
# 检查是否找到桌面目录
if [ -n "$desktop_dir" ]; then
# 检查桌面上是否已有快捷方式
if [ ! -f "$desktop_shortcut" ]; then
echo "为当前用户创建桌面快捷方式..."
# 复制桌面文件到用户桌面
cp /usr/share/applications/grabbag.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
echo "GrabBag 应用程序安装完成!"
echo "应用程序将在用户登录桌面后自动启动。"
echo "端口映射已配置502 -> 5020"
echo "桌面快捷方式已创建如果用户有Desktop目录"
echo "如需立即启动,请运行: /usr/local/bin/GrabBagApp"
echo "如需禁用自启动,请删除文件: ~/.config/autostart/grabbag.desktop"
EOF
chmod +x ${POSTINST_PATH}
echo "生成卸载脚本..."
#postrm uninstall exec script
POSTRM_PATH=${PKG_PATH}/DEBIAN/postrm
cat > ${POSTRM_PATH} << 'EOF'
#!/bin/bash
echo "卸载 GrabBag 应用程序..."
# 清理库文件配置
rm -f /etc/ld.so.conf.d/grabbag.conf
ldconfig
# 清理端口映射配置
echo "清理端口映射配置..."
systemctl stop grabbag-port-mapping.service 2>/dev/null || true
systemctl disable grabbag-port-mapping.service 2>/dev/null || true
rm -f /etc/systemd/system/grabbag-port-mapping.service
# 清理iptables规则
iptables -t nat -D PREROUTING -p tcp --dport 502 -j REDIRECT --to-port 5020 2>/dev/null || true
# 重新加载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/grabbag.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 "GrabBag 应用程序卸载完成!"
echo "端口映射配置已清理"
echo "桌面快捷方式已清理"
echo "如需彻底清理自启动配置,请手动删除: ~/.config/autostart/grabbag.desktop"
EOF
chmod +x ${POSTRM_PATH}
echo "生成桌面快捷方式..."
#desktop
DESKTOP_PATH=${PKG_PATH}/usr/share/applications/grabbag.desktop
echo "[Desktop Entry]" > ${DESKTOP_PATH}
echo "Version=${PKG_VERSION}" >> ${DESKTOP_PATH}
echo "Name=GrabBag" >> ${DESKTOP_PATH}
echo "Type=Application" >> ${DESKTOP_PATH}
echo "Comment=GrabBag App" >> ${DESKTOP_PATH}
echo "Terminal=false" >> ${DESKTOP_PATH}
echo "Exec=/usr/local/bin/GrabBagApp" >> ${DESKTOP_PATH}
echo "Icon=/usr/share/pixmaps/grabbag.png" >> ${DESKTOP_PATH}
echo "Categories=Development;" >> ${DESKTOP_PATH}
echo "GenericName=GrabBag App" >> ${DESKTOP_PATH}
echo "Keywords=grabbag;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 "=========================================="