diff --git a/GrabBagPrj/buildArmPrj.sh b/GrabBagPrj/buildArmPrj.sh index 12640ff..659eecb 100644 --- a/GrabBagPrj/buildArmPrj.sh +++ b/GrabBagPrj/buildArmPrj.sh @@ -1,51 +1,38 @@ #!/bin/bash -# 可用的 App 列表 -AVAILABLE_APPS="GrabBag BeltTearing LapWeld Workpiece ParticleSize BinocularMark WorkpieceProject TunnelChannel WheelMeasure ScrewPosition WorkpieceHole BagThreadPosition StatorPosition HoleDetection HolePitPosition RodAndBarPosition" +set -u +set -o pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +BUILD_DIR="${SCRIPT_DIR}/buildarm/GrabBagPrj" + +source "${SCRIPT_DIR}/project_registry.sh" -# 显示帮助信息 show_help() { - echo "用法: $0 [-r] [-q] [-h] [AppName]" - echo "" - echo "选项:" - echo " -r 清理编译目录后重新编译" - echo " -q 强制重新运行 qmake(切换 App 时需要)" - echo " -h 显示此帮助信息" - echo "" - echo "参数:" - echo " AppName 指定要编译的 App 名称(可选,不指定则编译全部)" - echo "" - echo "可用的 App 列表:" - for app in $AVAILABLE_APPS; do - echo " - $app" - done - echo "" - echo "示例:" - echo " $0 # 编译全部项目(增量编译)" - echo " $0 -r # 清理后编译全部项目" - echo " $0 GrabBag # 只编译 GrabBag(增量编译)" - echo " $0 -q GrabBag # 切换到编译 GrabBag(重新 qmake)" - echo " $0 -r GrabBag # 清理后只编译 GrabBag" + cat <<'EOF' +用法: + ./buildArmPrj.sh [-r] [-q] [-h] [AppName] + +选项: + -r 删除 buildarm 后重新编译 + -q 强制重新执行 qmake + -h 显示帮助 + +参数: + AppName 可选的编译目标;不传则编译全部 + +可编译目标: +EOF + + list_projects | sed 's/^/ - /' } -# 检查 App 是否有效 -is_valid_app() { - local app=$1 - for valid_app in $AVAILABLE_APPS; do - if [ "$app" = "$valid_app" ]; then - return 0 - fi - done - return 1 -} - -# 解析参数 CLEAN_BUILD=false FORCE_QMAKE=false TARGET_APP="" while getopts "rqh" opt; do - case $opt in + case "$opt" in r) CLEAN_BUILD=true ;; @@ -56,44 +43,41 @@ while getopts "rqh" opt; do show_help exit 0 ;; - \?) - echo "无效选项: -$OPTARG" + *) show_help exit 1 ;; esac done -# 移除已处理的选项,获取剩余参数 -shift $((OPTIND-1)) +shift $((OPTIND - 1)) -# 获取 App 名称参数 -if [ -n "$1" ]; then - TARGET_APP=$1 - if ! is_valid_app "$TARGET_APP"; then - echo "错误: 无效的 App 名称 '$TARGET_APP'" - echo "" - echo "可用的 App 列表:" - for app in $AVAILABLE_APPS; do - echo " - $app" - done +if [ $# -gt 1 ]; then + show_help + exit 1 +fi + +if [ $# -eq 1 ]; then + TARGET_APP="$1" + if ! is_project "${TARGET_APP}"; then + echo "无效的编译目标: ${TARGET_APP}" >&2 + echo >&2 + show_help >&2 exit 1 fi fi START_TIME=$(date +%s) -# 清理编译目录 -if [ "$CLEAN_BUILD" = true ]; then - echo "清理编译目录..." - rm -rf buildarm +if [ "${CLEAN_BUILD}" = true ]; then + echo "清理 ${SCRIPT_DIR}/buildarm" + rm -rf "${SCRIPT_DIR}/buildarm" FORCE_QMAKE=true fi -mkdir -p buildarm/GrabBagPrj -cd buildarm/GrabBagPrj +mkdir -p "${BUILD_DIR}" +cd "${BUILD_DIR}" -# 交叉编译配置 QMAKE_ARGS=( -r CONFIG+=release @@ -106,54 +90,49 @@ QMAKE_ARGS=( "QMAKE_LINK=aarch64-linux-gnu-g++" ) -# 如果指定了 App,添加 TARGET_APP 参数 -if [ -n "$TARGET_APP" ]; then - QMAKE_ARGS+=("TARGET_APP=$TARGET_APP") - echo "==========================================" - echo "编译指定 App: $TARGET_APP" - echo "==========================================" +if [ -n "${TARGET_APP}" ]; then + QMAKE_ARGS+=("TARGET_APP=${TARGET_APP}") + echo "编译目标: ${TARGET_APP}" else - echo "==========================================" - echo "编译全部项目" - echo "==========================================" + echo "编译全部目标" fi -# 检查是否需要运行 qmake -if [ "$FORCE_QMAKE" = true ]; then - echo "运行 qmake..." - qmake "${QMAKE_ARGS[@]}" ../../GrabBagPrj.pro -elif [ ! -f "Makefile" ]; then - echo "Makefile 不存在,运行 qmake..." - qmake "${QMAKE_ARGS[@]}" ../../GrabBagPrj.pro +if [ "${FORCE_QMAKE}" = true ] || [ ! -f "${BUILD_DIR}/Makefile" ]; then + echo "执行 qmake" + if ! qmake "${QMAKE_ARGS[@]}" "${SCRIPT_DIR}/GrabBagPrj.pro"; then + echo "qmake 执行失败" >&2 + exit 1 + fi else - echo "跳过 qmake(使用 -q 强制重新生成)" + echo "跳过 qmake" fi -echo "开始编译..." -make -j8 -BUILD_RESULT=$? +JOBS="${JOBS:-$(getconf _NPROCESSORS_ONLN 2>/dev/null || echo 8)}" + +echo "==========================================" + +echo "执行 make -j${JOBS}" +BUILD_RESULT=0 +make -j"${JOBS}" || BUILD_RESULT=$? -# 输出结果 END_TIME=$(date +%s) ELAPSED=$((END_TIME - START_TIME)) MINUTES=$((ELAPSED / 60)) SECONDS=$((ELAPSED % 60)) -if [ $BUILD_RESULT -eq 0 ]; then - echo "==========================================" - if [ -z "$TARGET_APP" ]; then - echo "全部项目编译成功!耗时: ${MINUTES}分${SECONDS}秒" +if [ "${BUILD_RESULT}" -eq 0 ]; then + if [ -n "${TARGET_APP}" ]; then + echo "${TARGET_APP} 编译成功,耗时 ${MINUTES} 分 ${SECONDS} 秒" else - echo "$TARGET_APP 编译成功!耗时: ${MINUTES}分${SECONDS}秒" + echo "全部目标编译成功,耗时 ${MINUTES} 分 ${SECONDS} 秒" fi - echo "==========================================" -else - echo "==========================================" - if [ -z "$TARGET_APP" ]; then - echo "编译失败!耗时: ${MINUTES}分${SECONDS}秒" - else - echo "$TARGET_APP 编译失败!耗时: ${MINUTES}分${SECONDS}秒" - fi - echo "==========================================" - exit 1 + exit 0 fi + +if [ -n "${TARGET_APP}" ]; then + echo "${TARGET_APP} 编译失败,耗时 ${MINUTES} 分 ${SECONDS} 秒" >&2 +else + echo "编译失败,耗时 ${MINUTES} 分 ${SECONDS} 秒" >&2 +fi + +exit "${BUILD_RESULT}" diff --git a/GrabBagPrj/project_meta.sh b/GrabBagPrj/project_meta.sh index 21e855c..73d378a 100644 --- a/GrabBagPrj/project_meta.sh +++ b/GrabBagPrj/project_meta.sh @@ -98,19 +98,32 @@ read_project_version() { PROJECT_VERSION="$DEFAULT_VERSION_STRING" PROJECT_BUILD="$DEFAULT_BUILD_NUMBER" - [ ! -f "$version_file" ] && return 0 + if [ ! -f "$version_file" ]; then + echo "错误: 版本文件不存在: $version_file" >&2 + return 1 + fi for candidate in "${version_macro}_VERSION_STRING" "${version_macro}_APP_VERSION_STRING"; do value=$(grep -E "^#define[[:space:]]+${candidate}[[:space:]]+\"" "$version_file" | sed -E 's/.*"([^"]+)".*/\1/' | head -n 1 || true) if [ -n "$value" ]; then PROJECT_VERSION="$value"; break; fi done - [ -z "$PROJECT_VERSION" ] && PROJECT_VERSION="$DEFAULT_VERSION_STRING" + + if [ -z "$PROJECT_VERSION" ]; then + echo "错误: 版本文件中未定义版本字符串" >&2 + return 1 + fi for candidate in "${version_macro}_BUILD_STRING" "${version_macro}_VERSION_BUILD" "${version_macro}_APP_VERSION_BUILD"; do value=$(grep -E "^#define[[:space:]]+${candidate}[[:space:]]+\"" "$version_file" | sed -E 's/.*"([^"]+)".*/\1/' | head -n 1 || true) if [ -n "$value" ]; then PROJECT_BUILD="$value"; break; fi done - [ -z "$PROJECT_BUILD" ] && PROJECT_BUILD="$DEFAULT_BUILD_NUMBER" + + if [ -z "$PROJECT_BUILD" ]; then + echo "错误: 版本文件中未定义构建号" >&2 + return 1 + fi + + return 0 } # ===== 内部注册函数 ===== diff --git a/GrabBagPrj/project_pkg_common.sh b/GrabBagPrj/project_pkg_common.sh index ca2e901..8ef77a3 100644 --- a/GrabBagPrj/project_pkg_common.sh +++ b/GrabBagPrj/project_pkg_common.sh @@ -313,8 +313,10 @@ set_permissions() { # 加载打包上下文:参数解析 + meta 加载 + 派生变量计算 # 用法: load_package_context "$@" "desktop" 或 load_package_context "$@" "service" load_package_context() { + local expected_kind="${!#}" # 最后一个参数是期望的 kind local args=("${@:1:$#-1}") # 去掉最后一个参数 + echo "开始加载 ${expected_kind} 上下文" if [ ${#args[@]} -eq 1 ] && [ "${args[0]}" = "--list" ]; then list_projects_by_kind "${expected_kind}" @@ -332,6 +334,7 @@ load_package_context() { fi PACKAGE_TARGET="${args[0]}" + echo "加载项目 ${PACKAGE_TARGET} 上下文" if ! load_package_project_meta "${PACKAGE_TARGET}"; then echo "未知项目: ${PACKAGE_TARGET}" >&2 @@ -347,9 +350,13 @@ load_package_context() { apply_package_defaults + echo "读取 ${PACKAGE_TARGET} 版本信息" + VERSION_FILE="${REPO_DIR}/${PACKAGE_VERSION_FILE_REL}" read_project_version "${VERSION_FILE}" "${PACKAGE_VERSION_MACRO}" + echo "生成 ${expected_kind} 打包名称" + PKG_VERSION="${PROJECT_VERSION}" BUILD_NUMBER="${PROJECT_BUILD}" PKG_RELEASE_VERSION="${PKG_VERSION}.${BUILD_NUMBER}" @@ -361,6 +368,7 @@ load_package_context() { EXEC_INSTALL_PATH="/${PACKAGE_BINARY_DEST_REL}" ICON_INSTALL_PATH="/${PACKAGE_ICON_DEST_REL}" SERVICE_INSTALL_DIR="/opt/${PACKAGE_SLUG}" + echo "加载项目 ${PACKAGE_TARGET} 上下文完成" if [ -n "${PACKAGE_SERVICE_DEST_REL}" ]; then SERVICE_INSTALL_PATH="/${PACKAGE_SERVICE_DEST_REL}" diff --git a/GrabBagPrj/project_pkg_desktop.sh b/GrabBagPrj/project_pkg_desktop.sh index 8232f65..9e1967b 100644 --- a/GrabBagPrj/project_pkg_desktop.sh +++ b/GrabBagPrj/project_pkg_desktop.sh @@ -132,6 +132,7 @@ EOF # ===== 主流程 ===== load_package_context "$@" "desktop" +echo "开始打包桌面应用 ${PACKAGE_NAME}" run_common_packaging_steps log_info "写入桌面集成脚本" write_desktop_autostart diff --git a/GrabBagPrj/project_registry.sh b/GrabBagPrj/project_registry.sh index cd1f014..795adbf 100644 --- a/GrabBagPrj/project_registry.sh +++ b/GrabBagPrj/project_registry.sh @@ -51,7 +51,7 @@ DESKTOP_PROJECTS=( extra_copy=glob|SDK/Device/gl_linelaser_sdk/aarch64_linux/*.so|usr/lib" "HoleDetection;holeDetection;\ - algo_copy=globa|AppAlgo/holeDetection/arm/release/libHoleDetectionLib.so*|usr/lib" + algo_copy=globa|AppAlgo/holeDetection/arm/release/*.so*|usr/lib" "TunnelChannel;channelSpaceMeasure;\ ld_conf=/usr/lib/HCNetSDKCom;\ diff --git a/GrabBagPrj/update_releaseVersion.sh b/GrabBagPrj/update_releaseVersion.sh deleted file mode 100644 index 71c9088..0000000 --- a/GrabBagPrj/update_releaseVersion.sh +++ /dev/null @@ -1,195 +0,0 @@ -#!/bin/bash - -# 更新应用列表及说明.md中的版本信息 -# 用法: ./updateVersion.sh <项目名称> -# 示例: ./updateVersion.sh GrabBag - -# 定义项目与Version.h文件的映射关系 -declare -A PROJECT_VERSION_FILES=( - ["GrabBag"]="App/GrabBag/GrabBagApp/Version.h" - ["BeltTearing"]="App/BeltTearing/BeltTearingApp/Version.h" - ["LapWeld"]="App/LapWeld/LapWeldApp/Version.h" - ["Workpiece"]="App/Workpiece/WorkpieceApp/Version.h" - ["ParticleSize"]="App/ParticleSize/ParticleSizeApp/Version.h" - ["BinocularMark"]="App/BinocularMark/BinocularMarkApp/Version.h" - ["WorkpieceProject"]="App/WorkpieceProject/WorkpiecePositionApp/Version.h" - ["TunnelChannel"]="App/TunnelChannel/TunnelChannelApp/Version.h" - ["WheelMeasure"]="App/WheelMeasure/WheelMeasureApp/Version.h" - ["ScrewPosition"]="App/ScrewPosition/ScrewPositionApp/Version.h" - ["BagThreadPosition"]="App/BagThreadPosition/BagThreadPositionApp/Version.h" - ["WorkpieceHole"]="App/WorkpieceHole/WorkpieceHoleApp/Version.h" - ["StatorPosition"]="App/StatorPosition/StatorPositionApp/Version.h" - ["HoleDetection"]="App/HoleDetection/HoleDetectionApp/Version.h" - ["HolePitPosition"]="App/HolePitPosition/HolePitPositionApp/Version.h" - ["RodAndBarPosition"]="App/RodAndBarPosition/RodAndBarPositionApp/Version.h" -) - -# 定义项目与版本宏的映射关系 -declare -A PROJECT_VERSION_MACROS=( - ["GrabBag"]="GRABBAG" - ["BeltTearing"]="BELT_TEARING_APP" - ["LapWeld"]="LAPWELD" - ["Workpiece"]="WORKPIECE" - ["ParticleSize"]="PARTICLESIZE" - ["BinocularMark"]="BINOCULARMARK" - ["WorkpieceProject"]="WORKPIECE_POSITION" - ["TunnelChannel"]="TUNNELCHANNEL" - ["WheelMeasure"]="WHEELMEASURE" - ["ScrewPosition"]="SCREWPOSITION" - ["BagThreadPosition"]="BAGTHREADPOSITION" - ["WorkpieceHole"]="WORKPIECEHOLE" - ["StatorPosition"]="STATORPOSITION" - ["HoleDetection"]="HOLEDETECTION" - ["HolePitPosition"]="HOLEPITPOSITION" - ["RodAndBarPosition"]="RODANDBARPOSITION" -) - -# 定义项目与Publish包名称的映射关系 -declare -A PROJECT_PUBLISH_NAMES=( - ["GrabBag"]="GrabBag" - ["BeltTearing"]="BeltTearingServer" - ["LapWeld"]="LapWeld" - ["Workpiece"]="Workpiece" - ["ParticleSize"]="ParticleSize" - ["BinocularMark"]="BinocularMarkServer" - ["WorkpieceProject"]="WorkpieceProject" - ["TunnelChannel"]="TunnelChannel" - ["WheelMeasure"]="WheelMeasure" - ["ScrewPosition"]="ScrewPosition" - ["BagThreadPosition"]="BagThreadPosition" - ["WorkpieceHole"]="WorkpieceHole" - ["StatorPosition"]="StatorPosition" - ["HoleDetection"]="HoleDetection" - ["HolePitPosition"]="HolePitPosition" - ["RodAndBarPosition"]="RodAndBarPosition" -) - -# 定义项目与中文名称的映射关系 -declare -A PROJECT_CHINESE_NAMES=( - ["GrabBag"]="自动拆包" - ["BeltTearing"]="皮带撕裂" - ["LapWeld"]="焊接" - ["Workpiece"]="工件定位" - ["ParticleSize"]="颗粒尺寸检测" - ["BinocularMark"]="双目标记检测" - ["WorkpieceProject"]="工件项目" - ["TunnelChannel"]="铁路隧道槽道测量" - ["WheelMeasure"]="车轮拱高测量" - ["ScrewPosition"]="螺杆定位" - ["BagThreadPosition"]="包裹拆线位置定位" - ["WorkpieceHole"]="工件孔定位" - ["StatorPosition"]="定子定位" - ["HoleDetection"]="孔洞检测" - ["HolePitPosition"]="坑孔定位" - ["RodAndBarPosition"]="棒材定位" -) - -# 应用列表文件路径 -APP_LIST_FILE="AppList.md" - -# 获取脚本所在目录 -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -cd "$SCRIPT_DIR" - -# 检查参数 -if [ $# -eq 0 ]; then - echo "用法: $0 <项目名称>" - echo "示例: $0 GrabBag" - echo "" - echo "可用项目名称:" - for project in "${!PROJECT_VERSION_FILES[@]}"; do - echo " - $project (${PROJECT_CHINESE_NAMES[$project]})" - done - exit 1 -fi - -PROJECT_NAME=$1 - -# 检查项目是否存在 -if [ -z "${PROJECT_VERSION_FILES[$PROJECT_NAME]}" ]; then - echo "错误: 未知的项目名称 '$PROJECT_NAME'" - echo "可用项目名称:" - for project in "${!PROJECT_VERSION_FILES[@]}"; do - echo " - $project (${PROJECT_CHINESE_NAMES[$project]})" - done - exit 1 -fi - -# 获取Version.h文件路径 -VERSION_FILE="../${PROJECT_VERSION_FILES[$PROJECT_NAME]}" -VERSION_MACRO="${PROJECT_VERSION_MACROS[$PROJECT_NAME]}" -PUBLISH_NAME="${PROJECT_PUBLISH_NAMES[$PROJECT_NAME]}" -CHINESE_NAME="${PROJECT_CHINESE_NAMES[$PROJECT_NAME]}" - -echo "==========================================" -echo "更新项目版本信息" -echo "==========================================" -echo "项目名称: $PROJECT_NAME ($CHINESE_NAME)" -echo "发布名称: $PUBLISH_NAME" -echo "Version.h: $VERSION_FILE" -echo "==========================================" - -# 检查Version.h文件是否存在 -if [ ! -f "$VERSION_FILE" ]; then - echo "错误: Version.h 文件不存在: $VERSION_FILE" - exit 1 -fi - -# 读取版本信息 -# 尝试多种可能的宏定义格式 -VERSION_STRING="" -BUILD_STRING="" - -# 尝试读取版本号 -VERSION_STRING=$(grep "#define ${VERSION_MACRO}_VERSION_STRING" "$VERSION_FILE" | sed 's/.*"\(.*\)".*/\1/' | head -1) -if [ -z "$VERSION_STRING" ]; then - # 尝试另一种格式 - VERSION_STRING=$(grep "#define ${VERSION_MACRO}_APP_VERSION_STRING" "$VERSION_FILE" | sed 's/.*"\(.*\)".*/\1/' | head -1) -fi - -# 尝试读取构建号 -BUILD_STRING=$(grep "#define ${VERSION_MACRO}_BUILD_STRING" "$VERSION_FILE" | sed 's/.*"\(.*\)".*/\1/' | head -1) -if [ -z "$BUILD_STRING" ]; then - # 尝试另一种格式 - BUILD_STRING=$(grep "#define ${VERSION_MACRO}_APP_VERSION_BUILD" "$VERSION_FILE" | sed 's/.*"\(.*\)".*/\1/' | head -1) -fi - -# 如果仍然无法读取,使用默认值 -if [ -z "$VERSION_STRING" ]; then - VERSION_STRING="1.0.0" - echo "警告: 无法读取版本号,使用默认值: $VERSION_STRING" -else - echo "版本号: $VERSION_STRING" -fi - -if [ -z "$BUILD_STRING" ]; then - BUILD_STRING="1" - echo "警告: 无法读取构建号,使用默认值: $BUILD_STRING" -else - echo "构建号: $BUILD_STRING" -fi - -# 组合完整版本号 -FULL_VERSION="${VERSION_STRING}.${BUILD_STRING}" -echo "完整版本: $FULL_VERSION" -echo "==========================================" - -# 检查应用列表文件是否存在 -if [ ! -f "$APP_LIST_FILE" ]; then - echo "错误: 应用列表文件不存在: $APP_LIST_FILE" - exit 1 -fi - -# 更新应用列表文件中的版本信息 -# 查找对应行并更新版本号 -if grep -q "| ${CHINESE_NAME} | ${PUBLISH_NAME} |" "$APP_LIST_FILE"; then - # 使用sed更新版本号 - sed -i "s/| ${CHINESE_NAME} | ${PUBLISH_NAME} | .* |/| ${CHINESE_NAME} | ${PUBLISH_NAME} | ${FULL_VERSION} |/" "$APP_LIST_FILE" - echo "已更新 $CHINESE_NAME 的版本信息为 $FULL_VERSION" -else - echo "警告: 在应用列表中未找到项目 '$CHINESE_NAME' ($PUBLISH_NAME)" -fi - -echo "==========================================" -echo "版本信息更新完成!" -echo "=========================================="