2025-06-22 14:08:15 +08:00
|
|
|
|
#!/bin/bash
|
|
|
|
|
|
|
|
|
|
|
|
#grabbag 版本配置
|
|
|
|
|
|
PKG_NAME="GrabBag"
|
|
|
|
|
|
PKG_ARCH="arm64"
|
|
|
|
|
|
|
|
|
|
|
|
# 从Version.h文件中读取版本信息
|
2025-09-14 14:51:38 +08:00
|
|
|
|
VERSION_FILE="../App/GrabBag/GrabBagApp/Version.h"
|
2025-06-22 14:08:15 +08:00
|
|
|
|
|
|
|
|
|
|
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=../
|
2025-07-23 01:35:14 +08:00
|
|
|
|
RELEASE_PATH=../Publish
|
2025-06-22 14:08:15 +08:00
|
|
|
|
|
|
|
|
|
|
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
|
2025-09-14 14:51:38 +08:00
|
|
|
|
QT_LIB_PATH=/opt/sysroot/firefly-arm64-sysroot-20.04/lib/aarch64-linux-gnu
|
2025-06-22 14:08:15 +08:00
|
|
|
|
|
|
|
|
|
|
echo "创建打包目录结构..."
|
|
|
|
|
|
mkdir -p ${PKG_PATH}/DEBIAN
|
|
|
|
|
|
mkdir -p ${PKG_PATH}/etc/profile.d
|
|
|
|
|
|
mkdir -p ${PKG_PATH}/etc/xdg/autostart
|
2025-09-14 14:51:38 +08:00
|
|
|
|
mkdir -p ${PKG_PATH}/opt/sysroot/lib
|
2025-06-22 14:08:15 +08:00
|
|
|
|
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 运行时环境..."
|
2025-09-14 14:51:38 +08:00
|
|
|
|
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
|
2025-06-22 14:08:15 +08:00
|
|
|
|
|
|
|
|
|
|
echo "复制依赖库文件..."
|
|
|
|
|
|
#depend
|
2025-08-05 22:52:10 +08:00
|
|
|
|
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/
|
2025-06-22 14:08:15 +08:00
|
|
|
|
|
|
|
|
|
|
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
|
2025-09-14 14:51:38 +08:00
|
|
|
|
cp ${CODE_PATH}/GrabBagPrj/buildarm/App/GrabBag/GrabBagApp/GrabBagApp ${PKG_PATH}/usr/local/bin/
|
2025-06-22 14:08:15 +08:00
|
|
|
|
|
|
|
|
|
|
echo "复制应用程序图标..."
|
|
|
|
|
|
#LOGO
|
2025-09-14 14:51:38 +08:00
|
|
|
|
cp ${CODE_PATH}/App/GrabBag/GrabBagApp/resource/logo.png ${PKG_PATH}/usr/share/pixmaps/grabbag.png
|
2025-06-22 14:08:15 +08:00
|
|
|
|
|
|
|
|
|
|
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
|
2025-09-14 14:51:38 +08:00
|
|
|
|
echo "/opt/sysroot/lib/" >> /etc/ld.so.conf.d/grabbag.conf
|
2025-06-22 14:08:15 +08:00
|
|
|
|
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
|
|
|
|
|
|
|
2025-06-25 01:37:57 +08:00
|
|
|
|
# 检查并创建当前用户的桌面快捷方式
|
|
|
|
|
|
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
|
|
|
|
|
|
|
2025-06-22 14:08:15 +08:00
|
|
|
|
echo "GrabBag 应用程序安装完成!"
|
|
|
|
|
|
echo "应用程序将在用户登录桌面后自动启动。"
|
|
|
|
|
|
echo "端口映射已配置:502 -> 5020"
|
2025-06-25 01:37:57 +08:00
|
|
|
|
echo "桌面快捷方式已创建(如果用户有Desktop目录)"
|
2025-06-22 14:08:15 +08:00
|
|
|
|
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
|
|
|
|
|
|
|
2025-06-25 01:37:57 +08:00
|
|
|
|
# 清理当前用户的桌面快捷方式
|
|
|
|
|
|
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
|
|
|
|
|
|
|
2025-06-22 14:08:15 +08:00
|
|
|
|
echo "GrabBag 应用程序卸载完成!"
|
|
|
|
|
|
echo "端口映射配置已清理"
|
2025-06-25 01:37:57 +08:00
|
|
|
|
echo "桌面快捷方式已清理"
|
2025-06-22 14:08:15 +08:00
|
|
|
|
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 "=========================================="
|