#!/bin/bash #grabbag 版本配置 PKG_NAME="GrabBag" PKG_ARCH="arm64" # 从Version.h文件中读取版本信息 VERSION_FILE="../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=../Release 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 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 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/ echo "复制依赖库文件..." #depend cp -a ${CODE_PATH}/SDK/OpenCV480/Arm/aarch64/*opencv_core*.so* ${PKG_PATH}/usr/lib/ cp -a ${CODE_PATH}/SDK/OpenCV480/Arm/aarch64/*opencv_imgproc*.so* ${PKG_PATH}/usr/lib/ cp -a ${CODE_PATH}/SDK/OpenCV480/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/GrabBagApp/GrabBagApp ${PKG_PATH}/usr/local/bin/ echo "复制应用程序图标..." #LOGO cp ${CODE_PATH}/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 " >> ${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 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 # 为所有用户设置桌面自启动(复制到用户的autostart目录会在用户登录时自动处理) echo "GrabBag 应用程序安装完成!" echo "应用程序将在用户登录桌面后自动启动。" echo "端口映射已配置:502 -> 5020" 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 "GrabBag 应用程序卸载完成!" 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 "SingleMainWindow=true" >> ${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 "=========================================="