160 lines
4.0 KiB
Bash
160 lines
4.0 KiB
Bash
#!/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
|