#!/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 "==========================================" 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/workpieceCornerExtraction/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/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 " >> ${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 应用程序..." # 设置库文件路径 echo "/usr/lib" > /etc/ld.so.conf.d/workpiece.conf echo "/opt/sysroot/lib/" >> /etc/ld.so.conf.d/workpiece.conf ldconfig # 确保应用程序可执行 chmod +x /usr/local/bin/WorkpieceApp # 配置端口映射 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/workpiece-port-mapping.service ]; then echo "创建端口映射服务..." cat > /etc/systemd/system/workpiece-port-mapping.service << 'PORTEOF' [Unit] Description=Workpiece 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 workpiece-port-mapping.service systemctl start workpiece-port-mapping.service else echo "端口映射服务已存在,跳过创建..." # 确保服务处于启用状态 systemctl enable workpiece-port-mapping.service 2>/dev/null || true systemctl start workpiece-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/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 echo "Workpiece 应用程序安装完成!" echo "应用程序将在用户登录桌面后自动启动。" echo "端口映射已配置:502 -> 5020" echo "桌面快捷方式已创建(如果用户有Desktop目录)" echo "如需立即启动,请运行: /usr/local/bin/WorkpieceApp" echo "如需禁用自启动,请删除文件: ~/.config/autostart/workpiece.desktop" EOF chmod +x ${POSTINST_PATH} echo "生成卸载脚本..." #postrm uninstall exec script POSTRM_PATH=${PKG_PATH}/DEBIAN/postrm cat > ${POSTRM_PATH} << 'EOF' #!/bin/bash echo "卸载 Workpiece 应用程序..." # 清理库文件配置 rm -f /etc/ld.so.conf.d/workpiece.conf ldconfig # 清理端口映射配置 echo "清理端口映射配置..." systemctl stop workpiece-port-mapping.service 2>/dev/null || true systemctl disable workpiece-port-mapping.service 2>/dev/null || true rm -f /etc/systemd/system/workpiece-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/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 应用程序卸载完成!" echo "端口映射配置已清理" 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 "=========================================="