#!/bin/bash # 可用的 App 列表 AVAILABLE_APPS="GrabBag BeltTearing LapWeld Workpiece ParticleSize BinocularMark WorkpieceProject TunnelChannel WheelMeasure" # 显示帮助信息 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" } # 检查 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 r) CLEAN_BUILD=true ;; q) FORCE_QMAKE=true ;; h) show_help exit 0 ;; \?) echo "无效选项: -$OPTARG" show_help exit 1 ;; esac done # 移除已处理的选项,获取剩余参数 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 exit 1 fi fi START_TIME=$(date +%s) # 清理编译目录 if [ "$CLEAN_BUILD" = true ]; then echo "清理编译目录..." rm -rf buildarm FORCE_QMAKE=true fi mkdir -p buildarm/GrabBagPrj cd buildarm/GrabBagPrj # 交叉编译配置 QMAKE_ARGS=( -r CONFIG+=release "MOC_DIR=moc" "UI_DIR=ui" "RCC_DIR=rcc" "OBJECTS_DIR=obj" "QMAKE_CC=aarch64-linux-gnu-gcc" "QMAKE_CXX=aarch64-linux-gnu-g++" "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 "==========================================" else 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 else echo "跳过 qmake(使用 -q 强制重新生成)" fi echo "开始编译..." make -j8 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}秒" else echo "$TARGET_APP 编译成功!耗时: ${MINUTES}分${SECONDS}秒" fi echo "==========================================" else echo "==========================================" if [ -z "$TARGET_APP" ]; then echo "编译失败!耗时: ${MINUTES}分${SECONDS}秒" else echo "$TARGET_APP 编译失败!耗时: ${MINUTES}分${SECONDS}秒" fi echo "==========================================" exit 1 fi